• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
      • Theories
      • Rule-classes
      • Proof-builder
      • Recursion-and-induction
      • Hons-and-memoization
      • Events
      • Parallelism
      • History
      • Programming
        • Defun
        • Declare
        • System-utilities
        • Stobj
        • State
        • Mutual-recursion
        • Memoize
        • Mbe
        • Io
        • Defpkg
        • Apply$
        • Loop$
          • Loop$-primer
          • Do-loop$
            • Do$
            • For-loop$
            • Loop$-recursion
            • Stating-and-proving-lemmas-about-loop$s
            • Loop$-recursion-induction
            • Do$
            • Programming-with-state
            • Arrays
            • Characters
            • Time$
            • Defmacro
            • Loop$-primer
            • Fast-alists
            • Defconst
            • Evaluation
            • Guard
            • Equality-variants
            • Compilation
            • Hons
            • ACL2-built-ins
              • Let
              • Declare
              • Mbe
              • Apply$
              • Fmt
              • Loop$
                • Loop$-primer
                • Do-loop$
                  • Do$
                  • For-loop$
                  • Loop$-recursion
                  • Stating-and-proving-lemmas-about-loop$s
                  • Loop$-recursion-induction
                  • Do$
                  • Return-last
                  • Mv-let
                  • Df
                  • Pseudo-termp
                  • Defwarrant
                  • Time$
                  • Mbt
                  • Ec-call
                  • Mv-nth
                  • Sys-call
                  • Msg
                  • Er
                  • Value-triple
                  • O-p
                  • Comp
                  • Member
                  • O<
                  • Cw
                  • Flet
                  • Or
                  • Hons
                  • Cbd
                  • Mv
                  • Defbadge
                  • Append
                  • *ACL2-exports*
                  • Comment
                  • Eql
                  • List
                  • Unsigned-byte-p
                  • Posp
                  • Natp
                  • The
                  • Nth
                  • And
                  • Len
                  • Time-tracker
                  • Term-order
                  • True-listp
                  • Msgp
                  • Booleanp
                  • <
                  • If
                  • Pseudo-term-listp
                  • +
                  • Not
                  • With-global-stobj
                  • Bitp
                  • Equal
                  • Cdr
                  • Car
                  • String-listp
                  • Nat-listp
                  • Implies
                  • Iff
                  • Character-listp
                  • Alistp
                  • Cons
                  • Symbol-listp
                  • Macrolet
                  • Quote
                  • Integerp
                  • Consp
                  • True-list-listp
                  • State-global-let*
                  • Compress1
                  • Symbolp
                  • Stringp
                  • *common-lisp-symbols-from-main-lisp-package*
                  • Characterp
                  • Prog2$
                  • *
                  • Last-prover-steps
                  • Hons-acons
                  • Let*
                  • Eq
                  • With-guard-checking
                  • @
                  • Length
                  • With-local-stobj
                  • Hard-error
                  • -
                  • Zp
                  • Search
                  • Intersection$
                  • Assign
                  • Aset1
                  • Symbol-name
                  • Union$
                  • Set-gc-strategy
                  • In-tau-intervalp
                  • Cons-with-hint
                  • Break-on-error
                  • Pand
                  • Case-match
                  • Fast-alist-fork
                  • Sys-call+
                  • Signed-byte-p
                  • ACL2-count
                  • Remove-duplicates
                  • With-serialize-character
                  • Observation
                  • Hons-resize
                  • Make-tau-interval
                  • Logbitp
                  • Termp
                  • Position
                  • Assoc
                  • *standard-co*
                  • Hons-acons!
                  • Update-nth
                  • Take
                  • Aref1
                  • Read-run-time
                  • Keywordp
                  • Symbol-package-name
                  • Symbol-alistp
                  • Hons-wash
                  • Expt
                  • Coerce
                  • Get-internal-time
                  • Intern
                  • Non-exec
                  • Case
                  • Standard-oi
                  • Standard-co
                  • Formula
                  • Nthcdr
                  • Atom
                  • Without-evisc
                  • Good-bye
                  • With-local-state
                  • Spec-mv-let
                  • Intern-in-package-of-symbol
                  • Binary-+
                  • <=
                  • Ash
                  • With-fast-alist
                  • Set-difference$
                  • Hons-clear
                  • Flush-compress
                  • Rationalp
                  • Por
                  • Rassoc
                  • Remove-assoc
                  • =
                  • Pargs
                  • Nfix
                  • Hons-copy
                  • Alphorder
                  • Subsetp
                  • Logand
                  • Remove1-assoc
                  • No-duplicatesp
                  • Mv-list
                  • Canonical-pathname
                  • Aset2
                  • Floor
                  • Serialize-read
                  • Random$
                  • Fmt-to-comment-window
                  • F-put-global
                  • Compress2
                  • Concatenate
                  • Fast-alist-clean
                  • Assert$
                  • Remove
                  • Remove1
                  • Intersectp
                  • Endp
                  • Put-assoc
                  • Princ$
                  • Primitive
                  • Keyword-value-listp
                  • True-list-fix
                  • Swap-stobjs
                  • Integer-listp
                  • Illegal
                  • Hons-get
                  • With-output-lock
                  • Setenv$
                  • Open-output-channel!
                  • Fast-alist-free
                  • Er-progn
                  • Cw-print-base-radix
                  • Reverse
                  • Cond
                  • Complex
                  • Add-to-set
                  • Truncate
                  • Digit-char-p
                  • Code-char
                  • Char-code
                  • Set-print-case
                  • Set-print-base
                  • Read-ACL2-oracle
                  • Error1
                  • Print-object$
                  • Plet
                  • Integer-length
                  • Zip
                  • With-live-state
                  • Hons-assoc-equal
                  • Extend-pathname
                  • Logior
                  • In-package
                  • With-guard-checking-event
                  • Term-listp
                  • Print-object$+
                  • Fmx-cw
                  • String
                  • Mod
                  • Unary--
                  • Set-print-radix
                  • Resize-list
                  • Pkg-witness
                  • Revappend
                  • Null
                  • Term-list-listp
                  • Make-fast-alist
                  • Header
                  • Boole$
                  • Subseq
                  • With-guard-checking-error-triple
                  • /
                  • Make-list
                  • Logxor
                  • Char-upcase
                  • Char-downcase
                  • Strip-cars
                  • Set-fmt-hard-right-margin
                  • Make-ord
                  • Ifix
                  • Fast-alist-free-on-exit
                  • F-get-global
                  • Aref2
                  • Standard-char-p
                  • Lognot
                  • Last
                  • Must-be-equal
                  • Integer-range-p
                  • Getenv$
                  • Binary-append
                  • Er-hard
                  • Eqlablep
                  • Cpu-core-count
                  • Boolean-listp
                  • Allocate-fixnum-range
                  • ACL2-numberp
                  • Butlast
                  • Pairlis$
                  • Mod-expt
                  • Hons-equal
                  • Gc$
                  • Substitute
                  • Ceiling
                  • With-stolen-alist
                  • Mv?-let
                  • String-upcase
                  • String-downcase
                  • Round
                  • Count
                  • Char
                  • Sys-call-status
                  • Progn$
                  • Pprogn
                  • Lexorder
                  • Hons-summary
                  • Break$
                  • Assert*
                  • Alpha-char-p
                  • Strip-cdrs
                  • Serialize-write
                  • Keyword-listp
                  • Upper-case-p
                  • Lower-case-p
                  • Logeqv
                  • List*
                  • Proofs-co
                  • Maximum-length
                  • Fix
                  • Explode-nonnegative-integer
                  • Eqlable-listp
                  • Dimensions
                  • Default
                  • Arity
                  • Sublis
                  • Max
                  • Evenp
                  • Explode-atom
                  • Change
                  • Zerop
                  • String<
                  • String-equal
                  • Abs
                  • Set-print-base-radix
                  • Print-base-p
                  • Nonnegative-integer-quotient
                  • Intern$
                  • Getprop
                  • Binary-*
                  • Aset1-trusted
                  • Symbol<
                  • String-append
                  • Rfix
                  • Mv?
                  • Logic-fns-list-listp
                  • Fast-alist-fork!
                  • Er-hard?
                  • Char-equal
                  • 1+
                  • *standard-oi*
                  • Sys-call*
                  • Pos-listp
                  • Mbt*
                  • Hons-wash!
                  • Hons-clear!
                  • Signum
                  • Rem
                  • Real/rationalp
                  • Rational-listp
                  • O-first-coeff
                  • Logic-fnsp
                  • Logic-fns-listp
                  • Hons-copy-persistent
                  • Gc-strategy
                  • Fast-alist-summary
                  • String>=
                  • String<=
                  • Acons
                  • O-first-expt
                  • Fast-alist-clean!
                  • >=
                  • >
                  • Subst
                  • Logcount
                  • Getpropc
                  • Evens
                  • Er-soft
                  • Digit-to-char
                  • Comp-gcl
                  • Atom-listp
                  • Arities-okp
                  • ACL2-number-listp
                  • /=
                  • Cadr
                  • *standard-ci*
                  • Unary-/
                  • The-true-list
                  • Realfix
                  • O-rst
                  • Fast-alist-len
                  • Complex/complex-rationalp
                  • Array2p
                  • Array1p
                  • Logtest
                  • Logandc1
                  • Char<
                  • Trace-co
                  • Putprop
                  • Get-real-time
                  • Eqlable-alistp
                  • Count-keys
                  • Assoc-string-equal
                  • Logorc1
                  • Logandc2
                  • Denominator
                  • 1-
                  • Packn
                  • Logic-termp
                  • Logic-term-list-listp
                  • Fmt!
                  • Fms
                  • Cw!
                  • Assoc-keyword
                  • String>
                  • Numerator
                  • Logorc2
                  • Char>=
                  • Update-nth-array
                  • The-number
                  • Odds
                  • Makunbound-global
                  • Make-character-list
                  • Make
                  • List$
                  • Int=
                  • Get-cpu-time
                  • Fmt-to-comment-window!
                  • Fms!
                  • F-boundp-global
                  • Complex-rationalp
                  • Alist-to-doublets
                  • Access
                  • Min
                  • Lognor
                  • Listp
                  • Identity
                  • Char>
                  • Char<=
                  • Zpf
                  • Standard-char-listp
                  • O-finp
                  • Number-subtrees
                  • Logic-term-listp
                  • Last-cdr
                  • Fmt1!
                  • Fmt-to-comment-window!+
                  • Character-alistp
                  • Oddp
                  • Minusp
                  • Lognand
                  • Imagpart
                  • Conjugate
                  • Xor
                  • Unquote
                  • String-alistp
                  • Packn-pos
                  • Maybe-flush-and-compress1
                  • Kwote
                  • Fmt1
                  • Fmt-to-comment-window+
                  • Cw-print-base-radix!
                  • Alist-keys-subsetp
                  • Realpart
                  • Plusp
                  • First
                  • Symbol-name-lst
                  • R-symbol-alistp
                  • R-eqlable-alistp
                  • Fmx
                  • Cw!+
                  • Cons-subtrees
                  • Cons-count-bounded
                  • Cddr
                  • Caar
                  • Proper-consp
                  • Kwote-lst
                  • Improper-consp
                  • Cw+
                  • Rest
                  • Standard-char-p+
                  • Mbe1
                  • Caddr
                  • Pairlis-x2
                  • Pairlis-x1
                  • O>=
                  • O<=
                  • O-infp
                  • Merge-sort-lexorder
                  • Fix-true-list
                  • Cdddr
                  • Set-fmt-soft-right-margin
                  • Real-listp
                  • O>
                  • Cddar
                  • Cdar
                  • Cdadr
                  • Cdaar
                  • Cadar
                  • Caadr
                  • Caaar
                  • Cadddr
                  • Caddar
                  • Third
                  • Tenth
                  • Sixth
                  • Seventh
                  • Second
                  • Ninth
                  • Fourth
                  • Fifth
                  • Eighth
                  • Cddddr
                  • Cdddar
                  • Cddadr
                  • Cddaar
                  • Cdaddr
                  • Cdadar
                  • Cdaadr
                  • Cdaaar
                  • Cadadr
                  • Cadaar
                  • Caaddr
                  • Caadar
                  • Caaadr
                  • Caaaar
                  • Hons-shrink-alist!
                  • Hons-shrink-alist
                  • Flush-hons-get-hash-table-link
                  • Delete-assoc
                • Developers-guide
                • System-attachments
                • Advanced-features
                • Set-check-invariant-risk
                • Numbers
                • Efficiency
                • Irrelevant-formals
                • Introduction-to-programming-in-ACL2-for-those-who-know-lisp
                • Redefining-programs
                • Lists
                • Invariant-risk
                • Errors
                • Defabbrev
                • Conses
                • Alists
                • Set-register-invariant-risk
                • Strings
                • Program-wrapper
                • Get-internal-time
                • Basics
                • Packages
                • Oracle-eval
                • Defmacro-untouchable
                • <<
                • Primitive
                • Revert-world
                • Unmemoize
                • Set-duplicate-keys-action
                • Symbols
                • Def-list-constructor
                • Easy-simplify-term
                • Defiteration
                • Fake-oracle-eval
                • Defopen
                • Sleep
              • Operational-semantics
              • Real
              • Start-here
              • Debugging
              • Miscellaneous
              • Output-controls
              • Macros
              • Interfacing-tools
            • Interfacing-tools
            • Hardware-verification
            • Software-verification
            • Math
            • Testing-utilities
          • Loop$
          • Do-loop$

          Do$

          Definition of do$

          Do$ is the logical function that interprets do loop$s. See do-loop$ for a discussion of do$.

          The function takes six arguments but only the first five are relevant to its logical value.

          • measure-fn — a lambda object that computes the measure that supposedly decreases (under l<) on each iteration of the do-fn and is checked after each iteration,
          • alist — an alist that binds the variable symbols used in the body and finally clause (if any) to their values,
          • do-fn — a lambda object that computes the results of one iteration, where the results are represented by a triple consisting of an exit token that indicates where control goes next, the value (if a return was executed), and a new alist,
          • finally-fn— a lambda object that computes the value of the finally clause, and
          • values — the output signature of the value to be returned if the measure fails to decrease.

          Function: do$

          (defun do$ (measure-fn alist do-fn finally-fn values dolia)
           (declare (xargs :guard (and (apply$-guard measure-fn '(nil))
                                       (apply$-guard do-fn '(nil))
                                       (apply$-guard finally-fn '(nil))
                                       (weak-dolia-p dolia))))
           (let* ((triple (true-list-fix (apply$ do-fn (list alist))))
                  (exit-token (car triple))
                  (val (cadr triple))
                  (new-alist (caddr triple)))
            (cond
             ((eq exit-token :return) val)
             ((eq exit-token :loop-finish)
              (let*
               ((triple (true-list-fix (apply$ finally-fn (list new-alist))))
                (exit-token (car triple))
                (val (cadr triple)))
               (if (eq exit-token :return) val nil)))
             ((l< (lex-fix (apply$ measure-fn (list new-alist)))
                  (lex-fix (apply$ measure-fn (list alist))))
              (do$ measure-fn new-alist
                   do-fn finally-fn values dolia))
             (t
              (prog2$
               (let
                 ((all-stobj-names
                       (true-list-fix (access dolia dolia :all-stobj-names)))
                  (untrans-measure (access dolia dolia :untrans-measure))
                  (untrans-do-loop$ (access dolia dolia :untrans-do-loop$)))
                (er
                 hard? 'do$
                 "The measure, ~x0, used in the do loop$ ~
                          statement~%~Y12~%failed to decrease!  Recall that do$ tracks ~
                          the values of do loop$ variables in an alist.  The measure is ~
                          computed using the values in the alist from before and after ~
                          execution of the body.  We cannot print the values of double ~
                          floats and live stobjs, if any are found in the alist, ~
                          because they are raw Lisp objects, not ACL2 objects.  We ~
                          print any double float as its corresponding rational and ~
                          simply print the name of any live stobj (as a ~
                          string).~%~%Before execution of the do body the alist ~
                          was~%~Y32.~|After the execution of the do body the alist ~
                          was~%~Y42.~|Before the execution of the body the measure ~
                          was~%~x5.~|After the execution of the body the measure ~
                          was~%~x6.~|~%Logically, in this situation the do$ returns the ~
                          value of a term whose output signature is ~x7, where the ~
                          value of any component of type :df is #d0.0 and the value of ~
                          any stobj component is the last latched value of that stobj."
                 untrans-measure untrans-do-loop$ nil
                 (eviscerate-do$-alist alist all-stobj-names)
                 (eviscerate-do$-alist new-alist all-stobj-names)
                 (apply$ measure-fn (list alist))
                 (apply$ measure-fn (list new-alist))
                 values))
               (loop$-default-values values new-alist))))))

          The last argument is only relevant in the error message printed if the do$ fails to terminate and that message is not part of the returned value.