• 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
          • Xargs
            • Guard
              • Verify-guards
              • Mbe
              • Set-guard-checking
              • Ec-call
              • Print-gv
              • The
              • Guards-and-evaluation
              • Guard-debug
              • Set-check-invariant-risk
              • Guard-evaluation-table
              • Guard-evaluation-examples-log
              • Guard-example
              • Defthmg
              • Invariant-risk
              • With-guard-checking
              • Guard-miscellany
              • Guard-holders
              • Guard-formula-utilities
                • Guard-simplification
                • Guard-obligation
                • Gthm
                • Verify-guards-formula
                • Guard-theorem-example
                  • Guard-theorem
                  • Verify-guard-implication
                • Set-verify-guards-eagerness
                • Guard-quick-reference
                • Set-register-invariant-risk
                • Guards-for-specification
                • Guard-evaluation-examples-script
                • Guard-introduction
                • Program-only
                • Non-exec
                • Set-guard-msg
                • Safe-mode
                • Set-print-gv-defaults
                • Guard-theorem-example
                  • With-guard-checking-event
                  • With-guard-checking-error-triple
                  • Guard-checking-inhibited
                  • Extra-info
                • Otf-flg
                • Normalize
              • Type-spec
              • Declare-stobjs
              • Set-ignore-ok
              • Set-irrelevant-formals-ok
            • System-utilities
            • Stobj
            • State
            • Mutual-recursion
            • Memoize
            • Mbe
            • Io
            • Defpkg
            • Apply$
            • Loop$
            • Programming-with-state
            • Arrays
            • Characters
            • Time$
            • Defmacro
            • Loop$-primer
            • Fast-alists
            • Defconst
            • Evaluation
            • Guard
              • Verify-guards
              • Mbe
              • Set-guard-checking
              • Ec-call
              • Print-gv
              • The
              • Guards-and-evaluation
              • Guard-debug
              • Set-check-invariant-risk
              • Guard-evaluation-table
              • Guard-evaluation-examples-log
              • Guard-example
              • Defthmg
              • Invariant-risk
              • With-guard-checking
              • Guard-miscellany
              • Guard-holders
              • Guard-formula-utilities
                • Guard-simplification
                • Guard-obligation
                • Gthm
                • Verify-guards-formula
                • Guard-theorem-example
                  • Guard-theorem
                  • Verify-guard-implication
                • Set-verify-guards-eagerness
                • Guard-quick-reference
                • Set-register-invariant-risk
                • Guards-for-specification
                • Guard-evaluation-examples-script
                • Guard-introduction
                • Program-only
                • Non-exec
                • Set-guard-msg
                • Safe-mode
                • Set-print-gv-defaults
                • Guard-theorem-example
                  • With-guard-checking-event
                  • With-guard-checking-error-triple
                  • Guard-checking-inhibited
                  • Extra-info
                • Equality-variants
                • Compilation
                • Hons
                • ACL2-built-ins
                • 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
          • Lemma-instance
          • Guard
          • Hints
          • Guard-theorem
          • Guard-formula-utilities

          Guard-theorem-example

          How to use a previously-proved guard theorem

          See lemma-instance for a discussion of :guard-theorem lemma instances, and see gthm for a related user-level query utility. In this topic, we illustrate the use of such lemma instances to take advantage of a guard theorem already proved for an existing definition, when attempting to admit a new definition.

          The following example is contrived but should get the idea across. Suppose that the event displayed just below was previously executed, for example when including a book. The mbe call generates a guard proof obligation, but there is only one thing to know about that for this example: without the local lemma shown, the guard proof fails for f1.

          (encapsulate
            ()
            (local (defthm append-revappend
                     (equal (append (revappend x y) z)
                            (revappend x (append y z)))))
          
            (defun f1 (x y)
              (declare (xargs :guard (and (true-listp x)
                                          (true-listp y))))
              (mbe :logic (append (reverse x) y)
                   :exec (revappend x y))))

          Now suppose that later, we wish to admit a function with the same guard and body. Since the lemma append-revappend above is local, guard verification will likely fail. However, we can tell the prover to use the guard theorem already proved for f1, as follows; then the guard verification proof succeeds.

          (defun f2 (x y)
            (declare (xargs :guard (and (true-listp x)
                                        (true-listp y))
                            :guard-hints (("Goal" :use ((:guard-theorem f1))))))
            (mbe :logic (append (reverse x) y)
                 :exec (revappend x y)))

          See termination-theorem-example for an example use of the analogous lemma instance type, :termination-theorem. That topic also includes discussion of the use of event names in prover output.