• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • 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
          • Language
          • Representation
          • Transformation-tools
            • Simpadd0
              • Simpadd0-implementation
                • Simpadd0-event-generation
                  • Simpadd0-exprs/decls/stmts
                  • Simpadd0-fundef
                  • Simpadd0-expr-cond
                  • Simpadd0-expr-binary
                  • Simpadd0-gen-expr-pure-thm
                    • Simpadd0-gen-block-item-list-thm
                    • Simpadd0-expr-cast
                    • Simpadd0-block-item-stmt
                    • Simpadd0-block-item-list-one
                    • Simpadd0-gen-expr-asg-thm
                    • Simpadd0-gen-block-item-thm
                    • Simpadd0-gen-stmt-thm
                    • Simpadd0-stmt-return
                    • Simpadd0-stmt-expr
                    • Simpadd0-gen-from-params
                    • Simpadd0-expr-unary
                    • Simpadd0-gout
                    • Simpadd0-expr-const
                    • Simpadd0-gen-param-thms
                    • Simpadd0-expr-ident
                    • Simpadd0-gen-init-scope-thm
                    • Simpadd0-gin
                    • Simpadd0-expr-paren
                    • Simpadd0-filepath-transunit-map
                    • Simpadd0-extdecl-list
                    • Simpadd0-extdecl
                    • Simpadd0-transunit-ensemble
                    • Simpadd0-transunit
                    • Simpadd0-gen-var-hyps
                    • Simpadd0-tyspecseq-to-type
                    • Simpadd0-gin-update
                    • Simpadd0-gen-everything
                    • Irr-simpadd0-gout
                  • Simpadd0-process-inputs-and-gen-everything
                  • Simpadd0-fn
                  • Simpadd0-input-processing
                  • Simpadd0-macro-definition
                • Simpadd0-expr-option
                • Simpadd0-structdeclor-list
                • Simpadd0-structdecl-list
                • Simpadd0-spec/qual-list
                • Simpadd0-param-declon-list
                • Simpadd0-initdeclor-list
                • Simpadd0-dirabsdeclor-option
                • Simpadd0-dirabsdeclor
                • Simpadd0-desiniter-list
                • Simpadd0-absdeclor-option
                • Simpadd0-struni-spec
                • Simpadd0-structdeclor
                • Simpadd0-structdecl
                • Simpadd0-statassert
                • Simpadd0-spec/qual
                • Simpadd0-param-declor
                • Simpadd0-param-declon
                • Simpadd0-member-designor
                • Simpadd0-initer-option
                • Simpadd0-initdeclor
                • Simpadd0-genassoc-list
                • Simpadd0-genassoc
                • Simpadd0-expr
                • Simpadd0-enumspec
                • Simpadd0-enumer-list
                • Simpadd0-dirdeclor
                • Simpadd0-desiniter
                • Simpadd0-designor-list
                • Simpadd0-designor
                • Simpadd0-declor-option
                • Simpadd0-decl-spec-list
                • Simpadd0-decl-spec
                • Simpadd0-decl-list
                • Simpadd0-const-expr-option
                • Simpadd0-const-expr
                • Simpadd0-block-item-list
                • Simpadd0-align-spec
                • Simpadd0-absdeclor
                • Simpadd0-type-spec
                • Simpadd0-tyname
                • Simpadd0-stmt
                • Simpadd0-label
                • Simpadd0-initer
                • Simpadd0-expr-list
                • Simpadd0-enumer
                • Simpadd0-declor
                • Simpadd0-decl
                • Simpadd0-block-item
              • Splitgso
              • Constant-propagation
              • Split-fn
              • Specialize
              • Split-all-gso
              • Copy-fn
              • Rename
              • Utilities
            • Insertion-sort
            • Pack
          • Bv
          • Imp-language
          • Event-macros
          • Java
          • Riscv
          • 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
    • Simpadd0-event-generation

    Simpadd0-gen-expr-pure-thm

    Generate a theorem for the transformation of a pure expression.

    Signature
    (simpadd0-gen-expr-pure-thm old 
                                new vartys const-new thm-index hints) 
     
      → 
    (mv thm-event thm-name updated-thm-index)
    Arguments
    old — Guard (exprp old).
    new — Guard (exprp new).
    vartys — Guard (ident-type-mapp vartys).
    const-new — Guard (symbolp const-new).
    thm-index — Guard (posp thm-index).
    hints — Guard (true-listp hints).
    Returns
    thm-event — Type (pseudo-event-formp thm-event).
    thm-name — Type (symbolp thm-name).
    updated-thm-index — Type (posp updated-thm-index).

    This function takes the old and new expressions as inputs, which must satisfy expr-pure-formalp. If the two expressions are syntactically equal, the generated theorem just says that if the execution of the expression does not yield an error, then the resulting value has the type of the expression. If the two expressions are not syntactically equal, the theorem also says that if the result of executing the old expression is not an error then neither is the result of executing the new expression, and the values of the two results are equal.

    Note that the calls of ldm-expr in the theorem are known to succeed (i.e. not return any error), given that expr-pure-formalp holds.

    This function also takes as input a map from identifiers to types, which are the variables in scope with their types. The theorem includes a hypothesis for each of these variables, saying that they are in the computation state and that they contain values of the appropriate types.

    The hints to prove the theorem are passed as input too, since the proof varies depending on the kind of expression.

    Definitions and Theorems

    Function: simpadd0-gen-expr-pure-thm

    (defun simpadd0-gen-expr-pure-thm
           (old new vartys const-new thm-index hints)
     (declare (xargs :guard (and (exprp old)
                                 (exprp new)
                                 (ident-type-mapp vartys)
                                 (symbolp const-new)
                                 (posp thm-index)
                                 (true-listp hints))))
     (declare (xargs :guard (and (expr-unambp old)
                                 (expr-unambp new))))
     (let ((__function__ 'simpadd0-gen-expr-pure-thm))
      (declare (ignorable __function__))
      (b*
       ((old (expr-fix old))
        (new (expr-fix new))
        ((unless (expr-pure-formalp old))
         (raise "Internal error: ~x0 is not in the formalized subset."
                old)
         (mv '(_) nil 1))
        (equalp (equal old new))
        ((unless (or equalp (expr-pure-formalp new)))
         (raise "Internal error: ~x0 is not in the formalized subset."
                new)
         (mv '(_) nil 1))
        (type (expr-type old))
        ((unless (or equalp (equal (expr-type new) type)))
         (raise
          "Internal error: ~
                    the type ~x0 of the new expression ~x1 differs from ~
                    the type ~x2 of the old expression ~x3."
          (expr-type new)
          new type old)
         (mv '(_) nil 1))
        (hyps (simpadd0-gen-var-hyps vartys))
        ((unless (type-formalp type))
         (raise "Internal error: expression ~x0 has type ~x1."
                old type)
         (mv '(_) nil 1))
        ((mv & ctype) (ldm-type type))
        (formula
         (if equalp
          (cons
           'b*
           (cons
            (cons
             (cons
              'expr
              (cons
               (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-expr
                                     (cons (cons 'quote (cons old 'nil))
                                           'nil))
                               'nil)))
               'nil))
             '((result (c::exec-expr-pure expr compst))
               (value (c::expr-value->value result))))
            (cons
             (cons
              'implies
              (cons
                 (cons 'and
                       (append hyps '((not (c::errorp result)))))
                 (cons (cons 'equal
                             (cons '(c::type-of-value value)
                                   (cons (cons 'quote (cons ctype 'nil))
                                         'nil)))
                       'nil)))
             'nil)))
          (cons
           'b*
           (cons
            (cons
             (cons
              'old-expr
              (cons
               (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-expr
                                     (cons (cons 'quote (cons old 'nil))
                                           'nil))
                               'nil)))
               'nil))
             (cons
              (cons
               'new-expr
               (cons
                (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-expr
                                     (cons (cons 'quote (cons new 'nil))
                                           'nil))
                               'nil)))
                'nil))
              '((old-result (c::exec-expr-pure old-expr compst))
                (new-result (c::exec-expr-pure new-expr compst))
                (old-value (c::expr-value->value old-result))
                (new-value (c::expr-value->value new-result)))))
            (cons
             (cons
              'implies
              (cons
               (cons 'and
                     (append hyps '((not (c::errorp old-result)))))
               (cons
                (cons
                 'and
                 (cons
                  '(not (c::errorp new-result))
                  (cons
                   '(equal old-value new-value)
                   (cons
                       (cons 'equal
                             (cons '(c::type-of-value old-value)
                                   (cons (cons 'quote (cons ctype 'nil))
                                         'nil)))
                       'nil))))
                'nil)))
             'nil)))))
        (thm-name (packn-pos (list const-new '-thm- thm-index)
                             const-new))
        (thm-index (1+ (pos-fix thm-index)))
        (thm-event
             (cons 'defthmd
                   (cons thm-name
                         (cons formula
                               (cons ':hints (cons hints 'nil)))))))
       (mv thm-event thm-name thm-index))))

    Theorem: pseudo-event-formp-of-simpadd0-gen-expr-pure-thm.thm-event

    (defthm pseudo-event-formp-of-simpadd0-gen-expr-pure-thm.thm-event
      (b* (((mv ?thm-event ?thm-name ?updated-thm-index)
            (simpadd0-gen-expr-pure-thm
                 old
                 new vartys const-new thm-index hints)))
        (pseudo-event-formp thm-event))
      :rule-classes :rewrite)

    Theorem: symbolp-of-simpadd0-gen-expr-pure-thm.thm-name

    (defthm symbolp-of-simpadd0-gen-expr-pure-thm.thm-name
      (b* (((mv ?thm-event ?thm-name ?updated-thm-index)
            (simpadd0-gen-expr-pure-thm
                 old
                 new vartys const-new thm-index hints)))
        (symbolp thm-name))
      :rule-classes :rewrite)

    Theorem: posp-of-simpadd0-gen-expr-pure-thm.updated-thm-index

    (defthm posp-of-simpadd0-gen-expr-pure-thm.updated-thm-index
      (b* (((mv ?thm-event ?thm-name ?updated-thm-index)
            (simpadd0-gen-expr-pure-thm
                 old
                 new vartys const-new thm-index hints)))
        (posp updated-thm-index))
      :rule-classes :rewrite)

    Theorem: simpadd0-gen-expr-pure-thm-of-expr-fix-old

    (defthm simpadd0-gen-expr-pure-thm-of-expr-fix-old
     (equal
       (simpadd0-gen-expr-pure-thm (expr-fix old)
                                   new vartys const-new thm-index hints)
       (simpadd0-gen-expr-pure-thm
            old
            new vartys const-new thm-index hints)))

    Theorem: simpadd0-gen-expr-pure-thm-expr-equiv-congruence-on-old

    (defthm simpadd0-gen-expr-pure-thm-expr-equiv-congruence-on-old
     (implies
      (c$::expr-equiv old old-equiv)
      (equal
       (simpadd0-gen-expr-pure-thm old
                                   new vartys const-new thm-index hints)
       (simpadd0-gen-expr-pure-thm
            old-equiv
            new vartys const-new thm-index hints)))
     :rule-classes :congruence)

    Theorem: simpadd0-gen-expr-pure-thm-of-expr-fix-new

    (defthm simpadd0-gen-expr-pure-thm-of-expr-fix-new
      (equal
           (simpadd0-gen-expr-pure-thm old (expr-fix new)
                                       vartys const-new thm-index hints)
           (simpadd0-gen-expr-pure-thm
                old
                new vartys const-new thm-index hints)))

    Theorem: simpadd0-gen-expr-pure-thm-expr-equiv-congruence-on-new

    (defthm simpadd0-gen-expr-pure-thm-expr-equiv-congruence-on-new
     (implies
      (c$::expr-equiv new new-equiv)
      (equal
       (simpadd0-gen-expr-pure-thm old
                                   new vartys const-new thm-index hints)
       (simpadd0-gen-expr-pure-thm old new-equiv
                                   vartys const-new thm-index hints)))
     :rule-classes :congruence)