• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • Soft
        • C
          • Syntax-for-tools
          • Atc
            • Atc-implementation
              • Atc-abstract-syntax
              • Atc-pretty-printer
              • Atc-event-and-code-generation
                • Atc-symbolic-computation-states
                • Atc-symbolic-execution-rules
                • Atc-gen-ext-declon-lists
                • Atc-function-and-loop-generation
                • Atc-statement-generation
                • Atc-gen-fileset
                • Atc-gen-everything
                • Atc-gen-obj-declon
                • Atc-gen-fileset-event
                • Atc-tag-tables
                • Atc-expression-generation
                • Atc-generation-contexts
                • Atc-gen-wf-thm
                • Term-checkers-atc
                  • Atc-check-cfun-call
                  • Atc-check-struct-write-array
                  • Atc-check-struct-read-array
                  • Atc-check-struct-write-scalar
                  • Atc-check-loop-call
                  • Atc-check-struct-read-scalar
                  • Atc-check-mv-let
                  • Atc-check-array-write
                  • Atc-check-let
                    • Atc-check-array-read
                    • Atc-check-integer-write
                    • Atc-check-declar/assign-n
                    • Atc-check-condexpr
                    • Atc-check-boolean-from-type
                    • Atc-check-integer-read
                    • Atc-check-sint-from-boolean
                  • Atc-variable-tables
                  • Term-checkers-common
                  • Atc-gen-init-fun-env-thm
                  • Atc-gen-appconds
                  • Read-write-variables
                  • Atc-gen-thm-assert-events
                  • Test*
                  • Atc-gen-prog-const
                  • Atc-gen-expr-bool
                  • Atc-theorem-generation
                  • Atc-tag-generation
                  • Atc-gen-expr-pure
                  • Atc-function-tables
                  • Atc-object-tables
                • Fty-pseudo-term-utilities
                • Atc-term-recognizers
                • Atc-input-processing
                • Atc-shallow-embedding
                • Atc-process-inputs-and-gen-everything
                • Atc-table
                • Atc-fn
                • Atc-pretty-printing-options
                • Atc-types
                • Atc-macro-definition
              • Atc-tutorial
            • Language
            • Representation
            • Transformation-tools
            • Insertion-sort
            • Pack
          • Bv
          • Imp-language
          • Event-macros
          • Java
          • Bitcoin
          • Ethereum
          • Yul
          • Zcash
          • ACL2-programming-language
          • Prime-fields
          • Json
          • Syntheto
          • File-io-light
          • Cryptography
          • Number-theory
          • Lists-light
          • Axe
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Term-checkers-atc

    Atc-check-let

    Check if a term may be a let statement term.

    Signature
    (atc-check-let term) → (mv yes/no var val body wrapper?)
    Arguments
    term — Guard (pseudo-termp term).
    Returns
    yes/no — Type (booleanp yes/no).
    var — Type (symbolp var).
    val — Type (pseudo-termp val).
    body — Type (pseudo-termp body).
    wrapper? — Type (symbolp wrapper?).

    The forms of these terms are described in the user documentation.

    Here we recognize and decompose statement terms that are lets. In translated form, (let ((var val)) body) is ((lambda (var) body) val). However, if body has other free variables in addition to var, those appear as both formal parameters and actual arguments, e.g. ((lambda (var x y) rest<var,x,y>) val x y): this is because ACL2 translated terms have all closed lambda expressions, so ACL2 adds formal parameters and actual arguments to make that happen. Here, we must remove them in order to get the ``true'' let. This is done via a system utility.

    We also return the declar or assign wrapper, if present; nil if absent.

    Definitions and Theorems

    Function: atc-check-let

    (defun atc-check-let (term)
      (declare (xargs :guard (pseudo-termp term)))
      (let ((__function__ 'atc-check-let))
        (declare (ignorable __function__))
        (b* (((acl2::fun (no))
              (mv nil nil nil nil nil))
             ((mv okp formals body actuals)
              (fty-check-lambda-call term))
             ((when (not okp)) (no))
             ((mv formals actuals)
              (fty-remove-equal-formals-actuals formals actuals))
             ((unless (and (list-lenp 1 formals)
                           (list-lenp 1 actuals)))
              (no))
             (var (first formals))
             (possibly-wrapped-val (first actuals))
             ((unless (pseudo-term-case possibly-wrapped-val :fncall))
              (mv t var possibly-wrapped-val body nil))
             ((pseudo-term-fncall possibly-wrapped-val)
              possibly-wrapped-val)
             ((unless (member-eq possibly-wrapped-val.fn
                                 '(declar assign)))
              (mv t var possibly-wrapped-val body nil))
             ((unless (list-lenp 1 possibly-wrapped-val.args))
              (no)))
          (mv t var (first possibly-wrapped-val.args)
              body possibly-wrapped-val.fn))))

    Theorem: booleanp-of-atc-check-let.yes/no

    (defthm booleanp-of-atc-check-let.yes/no
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (booleanp yes/no))
      :rule-classes :rewrite)

    Theorem: symbolp-of-atc-check-let.var

    (defthm symbolp-of-atc-check-let.var
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (symbolp var))
      :rule-classes :rewrite)

    Theorem: pseudo-termp-of-atc-check-let.val

    (defthm pseudo-termp-of-atc-check-let.val
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (pseudo-termp val))
      :rule-classes :rewrite)

    Theorem: pseudo-termp-of-atc-check-let.body

    (defthm pseudo-termp-of-atc-check-let.body
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (pseudo-termp body))
      :rule-classes :rewrite)

    Theorem: symbolp-of-atc-check-let.wrapper?

    (defthm symbolp-of-atc-check-let.wrapper?
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (symbolp wrapper?))
      :rule-classes :rewrite)

    Theorem: pseudo-term-count-of-atc-check-let-val

    (defthm pseudo-term-count-of-atc-check-let-val
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (implies yes/no
                 (< (pseudo-term-count val)
                    (pseudo-term-count term))))
      :rule-classes :linear)

    Theorem: pseudo-term-count-of-atc-check-let-body

    (defthm pseudo-term-count-of-atc-check-let-body
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (implies yes/no
                 (< (pseudo-term-count body)
                    (pseudo-term-count term))))
      :rule-classes :linear)

    Theorem: pseudo-term-count-of-atc-check-let

    (defthm pseudo-term-count-of-atc-check-let
      (b* (((mv ?yes/no ?var ?val ?body ?wrapper?)
            (atc-check-let term)))
        (implies yes/no
                 (< (+ (pseudo-term-count val)
                       (pseudo-term-count body))
                    (pseudo-term-count term))))
      :rule-classes :linear)