• 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-stmt-thm

    Generate a theorem for the transformation of a statement.

    Signature
    (simpadd0-gen-stmt-thm old new vartys const-new thm-index hints) 
      → 
    (mv thm-event thm-name updated-thm-index)
    Arguments
    old — Guard (stmtp old).
    new — Guard (stmtp 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 is analogous to simpadd0-gen-expr-pure-thm, but for statments instead of pure expressions; see that function's documentation first.

    The theorem says that the old statement returns a value of the appropriate type, regardless of whether old and new statements are syntactically equal or not; if the type is void, then the theorem says that execution returns nil, according to our formal dynamic semantics. If old and new statements are not equal, the theorem also says that their execution returns equal values (or both nil) and equal computation states, and that the execution of the new statement does not yield an error.

    Definitions and Theorems

    Function: simpadd0-gen-stmt-thm

    (defun simpadd0-gen-stmt-thm
           (old new vartys const-new thm-index hints)
     (declare (xargs :guard (and (stmtp old)
                                 (stmtp new)
                                 (ident-type-mapp vartys)
                                 (symbolp const-new)
                                 (posp thm-index)
                                 (true-listp hints))))
     (declare (xargs :guard (and (stmt-unambp old)
                                 (stmt-unambp new))))
     (let ((__function__ 'simpadd0-gen-stmt-thm))
      (declare (ignorable __function__))
      (b*
       ((old (stmt-fix old))
        (new (stmt-fix new))
        ((unless (stmt-formalp old))
         (raise "Internal error: ~x0 is not in the formalized subset."
                old)
         (mv '(_) nil 1))
        (equalp (equal old new))
        ((unless (or equalp (stmt-formalp new)))
         (raise "Internal error: ~x0 is not in the formalized subset."
                new)
         (mv '(_) nil 1))
        (type (stmt-type old))
        ((unless (or equalp (equal (stmt-type new) type)))
         (raise
          "Internal error: ~
                    the type ~x0 of the new statement ~x1 differs from ~
                    the type ~x2 of the old statement ~x3."
          (stmt-type new)
          new type old)
         (mv '(_) nil 1))
        ((unless (type-formalp type))
         (raise "Internal error: statement ~x0 has type ~x1."
                old type)
         (mv '(_) nil 1))
        ((mv & ctype) (ldm-type type))
        (hyps (simpadd0-gen-var-hyps vartys))
        (formula
         (if equalp
          (cons
           'b*
           (cons
            (cons
             (cons
              'stmt
              (cons
               (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-stmt
                                     (cons (cons 'quote (cons old 'nil))
                                           'nil))
                               'nil)))
               'nil))
             '(((mv result &)
                (c::exec-stmt stmt compst fenv limit))))
            (cons
             (cons
              'implies
              (cons
               (cons 'and
                     (append hyps '((not (c::errorp result)))))
               (cons
                (if (type-case type :void)
                    '(not result)
                 (cons
                  'and
                  (cons
                   'result
                   (cons
                       (cons 'equal
                             (cons '(c::type-of-value result)
                                   (cons (cons 'quote (cons ctype 'nil))
                                         'nil)))
                       'nil))))
                'nil)))
             'nil)))
          (cons
           'b*
           (cons
            (cons
             (cons
              'old-stmt
              (cons
               (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-stmt
                                     (cons (cons 'quote (cons old 'nil))
                                           'nil))
                               'nil)))
               'nil))
             (cons
              (cons
               'new-stmt
               (cons
                (cons
                   'mv-nth
                   (cons '1
                         (cons (cons 'ldm-stmt
                                     (cons (cons 'quote (cons new 'nil))
                                           'nil))
                               'nil)))
                'nil))
              '(((mv old-result old-compst)
                 (c::exec-stmt old-stmt compst old-fenv limit))
                ((mv new-result new-compst)
                 (c::exec-stmt new-stmt compst new-fenv limit)))))
            (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-result new-result)
                   (cons
                    '(equal old-compst new-compst)
                    (if (type-case type :void)
                        '((not old-result))
                     (cons
                      'old-result
                      (cons
                       (cons 'equal
                             (cons '(c::type-of-value old-result)
                                   (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-stmt-thm.thm-event

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

    Theorem: symbolp-of-simpadd0-gen-stmt-thm.thm-name

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

    Theorem: posp-of-simpadd0-gen-stmt-thm.updated-thm-index

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

    Theorem: simpadd0-gen-stmt-thm-of-stmt-fix-old

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

    Theorem: simpadd0-gen-stmt-thm-stmt-equiv-congruence-on-old

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

    Theorem: simpadd0-gen-stmt-thm-of-stmt-fix-new

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

    Theorem: simpadd0-gen-stmt-thm-stmt-equiv-congruence-on-new

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