• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Community
    • 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-mv-let

    Check if a term may be an mv-let statement term.

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

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

    First, we check if the term is an mv-let, obtaining variables, indices, value term, and body term. Then we check whether the value term is a declar<n> or an assign<n>: in this case, we return the first variable separately from the other variables, and we also return the corresponding declar or assign wrapper. Otherwise, we return all the variables together, with nil as the var? and wrapper? results. We also return, in mv-var, the variable to which the term is let-bound (see ACL2::make-mv-let-call); this is used for reconstructing the transformed term.

    Definitions and Theorems

    Function: atc-check-mv-let

    (defun atc-check-mv-let (term)
      (declare (xargs :guard (pseudo-termp term)))
      (let ((__function__ 'atc-check-mv-let))
        (declare (ignorable __function__))
        (b* (((mv okp mv-var vars indices & val body)
              (fty-check-mv-let-call term))
             ((when (not okp))
              (mv nil nil nil nil nil nil nil nil))
             ((mv okp wrapper & wrapped)
              (atc-check-declar/assign-n val))
             ((when (not okp))
              (mv t
                  nil vars indices val body nil mv-var)))
          (mv t (car vars)
              (cdr vars)
              indices wrapped body wrapper mv-var))))

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

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

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

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

    Theorem: symbol-listp-of-atc-check-mv-let.vars

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

    Theorem: nat-listp-of-atc-check-mv-let.indices

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

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

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

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

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

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

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

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

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

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

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

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

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