• 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
        • Bv
        • Imp-language
        • Event-macros
        • Java
        • Bitcoin
        • Ethereum
        • Yul
        • Zcash
        • ACL2-programming-language
        • Prime-fields
        • Json
        • Syntheto
          • Process-syntheto-toplevel-fn
          • Translation
          • Language
            • Static-semantics
              • Check-expression-fns
              • Subtypep
              • Match-type
              • Check-product-update-expression
              • Get-builtin-function-in/out/pre-post
              • Check-sum-update-expression
              • Check-sum-field-expression
              • Check-strict-binary-expression
              • Check-lt/le/gt/ge-expression
              • Check-eq/ne-expression
              • Check-div/rem-expression
              • Check-add/sub/mul-expression
              • Align-let-vars-values
              • Check-iff-expression
              • Check-function-definition-top/nontop
              • Check-sum-construct-expression
              • Check-rem-expression
              • Check-mul-expression
              • Check-sub-expression
              • Check-div-expression
              • Check-add-expression
              • Check-ne-expression
              • Check-lt-expression
              • Check-le-expression
              • Check-gt-expression
              • Check-ge-expression
              • Check-eq-expression
              • Check-function-specifier
              • Type-result
              • Check-product-construct-expression
              • Supremum-type
              • Check-call-expression
              • Check-product-field-expression
              • Check-function-definer
              • Make-subproof-obligations
              • Get-function-in/out/pre/post
              • Check-sum-test-expression
              • Match-field
              • Decompose-expression
              • Match-to-target
              • Check-unary-expression
              • Max-supertype
              • Match-type-list
              • Check-minus-expression
              • Check-type-definition
              • Check-not-expression
              • Check-type-product
              • Match-field-list
              • Check-type-subset
              • Check-type-definition-in-recursion
              • Align-let-vars-values-aux
              • Non-trivial-proof-obligation
              • Check-type-recursion
              • Check-function-specification
              • Check-toplevel
              • Supremum-type-list
              • Check-component-expression
                • Check-branch-list
                • Check-function-recursion
                • Check-function-definition
                • Binding
                • Check-function-header
                • Check-function-definition-list
                • Check-type-definition-list-in-recursion
                • Check-theorem
                • Check-nonstrict-binary-expression
                • Context-add-variables
                • Decompose-expression-aux
                • Check-alternative
                • Check-multi-expression
                • Check-type-sum
                • Check-type
                • Check-alternative-list
                • Context-add-condition
                • Check-type-definer
                • Check-transform
                • Check-variable
                • Check-transform-args
                • Check-toplevel-list
                • Context-add-condition-list
                • Check-if/when/unless-expression
                • Initializers-to-variable-substitution
                • Context-add-binding
                • Check-function-header-list
                • Context-add-toplevel
                • Ensure-single-type
                • Max-supertypes
                • Check-bind-expression
                • Check-type-list
                • Check-literal
                • Literal-type
                • Check-expression-list
                • Variable-context
                • Check-cond-expression
                • Check-branch
                • Args-without-defaults
                • Check-expression
                • *builtin-function-names*
                • Function-called-in
              • Abstract-syntax
              • Outcome
              • Abstract-syntax-operations
              • Outcome-list
              • Outcomes
            • Process-syntheto-toplevel
            • Shallow-embedding
          • File-io-light
          • Cryptography
          • Number-theory
          • Lists-light
          • Axe
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Static-semantics

    Check-component-expression

    Check if a multi-valued component expression is statically well-formed.

    Signature
    (check-component-expression multi multi-result index) → result
    Arguments
    multi — Guard (expressionp multi).
    multi-result — Guard (type-resultp multi-result).
    index — Guard (natp index).
    Returns
    result — Type (type-resultp result).

    The expression must be a multi-valued one, i.e. have at least two types. The index must be below the number of types. The type corresponding to the index is the type of the expression.

    Definitions and Theorems

    Function: check-component-expression

    (defun check-component-expression (multi multi-result index)
     (declare (xargs :guard (and (expressionp multi)
                                 (type-resultp multi-result)
                                 (natp index))))
     (let ((__function__ 'check-component-expression))
      (declare (ignorable __function__))
      (type-result-case
       multi-result
       :err (type-result-err multi-result.info)
       :ok
       (cond
        ((< (len multi-result.types) 2)
         (type-result-err
          (list
               :non-multi-component-expression (expression-fix multi))))
        ((>= (nfix index)
             (len multi-result.types))
         (type-result-err (list :multi-component-out-of-range
                                (expression-fix multi)
                                (nfix index))))
        (t (make-type-result-ok
                :types (list (nth (nfix index) multi-result.types))
                :obligations multi-result.obligations))))))

    Theorem: type-resultp-of-check-component-expression

    (defthm type-resultp-of-check-component-expression
      (b*
        ((result (check-component-expression multi multi-result index)))
        (type-resultp result))
      :rule-classes :rewrite)

    Theorem: check-component-expression-of-expression-fix-multi

    (defthm check-component-expression-of-expression-fix-multi
      (equal (check-component-expression (expression-fix multi)
                                         multi-result index)
             (check-component-expression multi multi-result index)))

    Theorem: check-component-expression-expression-equiv-congruence-on-multi

    (defthm
        check-component-expression-expression-equiv-congruence-on-multi
     (implies
      (expression-equiv multi multi-equiv)
      (equal
           (check-component-expression multi multi-result index)
           (check-component-expression multi-equiv multi-result index)))
     :rule-classes :congruence)

    Theorem: check-component-expression-of-type-result-fix-multi-result

    (defthm check-component-expression-of-type-result-fix-multi-result
     (equal
        (check-component-expression multi (type-result-fix multi-result)
                                    index)
        (check-component-expression multi multi-result index)))

    Theorem: check-component-expression-type-result-equiv-congruence-on-multi-result

    (defthm
     check-component-expression-type-result-equiv-congruence-on-multi-result
     (implies
      (type-result-equiv multi-result multi-result-equiv)
      (equal
           (check-component-expression multi multi-result index)
           (check-component-expression multi multi-result-equiv index)))
     :rule-classes :congruence)

    Theorem: check-component-expression-of-nfix-index

    (defthm check-component-expression-of-nfix-index
     (equal (check-component-expression multi multi-result (nfix index))
            (check-component-expression multi multi-result index)))

    Theorem: check-component-expression-nat-equiv-congruence-on-index

    (defthm check-component-expression-nat-equiv-congruence-on-index
     (implies
      (nat-equiv index index-equiv)
      (equal
           (check-component-expression multi multi-result index)
           (check-component-expression multi multi-result index-equiv)))
     :rule-classes :congruence)