• 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
        • C
          • Syntax-for-tools
          • Atc
            • Atc-implementation
              • Atc-abstract-syntax
              • Atc-pretty-printer
              • Atc-event-and-code-generation
                • Atc-symbolic-computation-states
                  • Update-var
                  • Atc-write-var-rules
                  • Atc-write-object-rules
                  • Atc-update-object-rules
                  • Add-var
                  • Atc-update-var-rules
                  • Update-object
                  • Atc-write-static-var-rules
                  • Atc-read-var-rules
                  • Atc-create-var-rules
                    • Update-static-var
                    • Atc-read-object-rules
                    • Add-frame
                    • Var-autop
                    • Var-in-scopes-p
                    • Atc-push-frame-rules
                    • Atc-update-static-var-rules
                    • Atc-compustate-frames-number-rules
                    • Objdesign->base-address
                    • Atc-read-static-var-rules
                    • Atc-exit-scope-rules
                    • Atc-var-autop-rules
                    • Atc-pop-frame-rules
                    • *atc-write-object-rules*
                    • *atc-symbolic-computation-state-rules*
                    • *atc-write-static-var-rules*
                    • *atc-update-object-rules*
                    • *atc-read-object-rules*
                    • *atc-compustate-frames-number-rules*
                    • Atc-enter-scope-rules
                    • *atc-write-var-rules*
                    • *atc-var-autop-rules*
                    • *atc-update-var-rules*
                    • *atc-update-static-var-rules*
                    • *atc-read-var-rules*
                    • *atc-read-static-var-rules*
                    • *atc-push-frame-rules*
                    • *atc-pop-frame-rules*
                    • *atc-exit-scope-rules*
                    • *atc-create-var-rules*
                  • 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-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
              • Pure-expression-execution
            • Transformation-tools
            • Language
            • Representation
            • Insertion-sort
            • Pack
          • Soft
          • Bv
          • Imp-language
          • Ethereum
          • Event-macros
          • Java
          • Riscv
          • Bitcoin
          • Zcash
          • Yul
          • ACL2-programming-language
          • Prime-fields
          • Json
          • Syntheto
          • File-io-light
          • Cryptography
          • Number-theory
          • Axe
          • Lists-light
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Atc-symbolic-computation-states

    Atc-create-var-rules

    Rules about create-var.

    The theorem about create-var turns that into add-var, provided that the variable can be created, which we check via the function create-var-okp introduced below, and also provided that there are frames. The latter condition is motivated by the fact that, during symbolic execution, we always have frames, because we are always executing code in some function; thus, we only need to replace create-var with add-var when there are frames. Additional theorems about create-var-okp go through the layers of the computation states to check this condition. No rule is needed for create-var-ok on update-var, because update-var is pushed past the first enter-scope.

    Definitions and Theorems

    Function: create-var-okp

    (defun create-var-okp (var compst)
      (declare (xargs :guard (and (identp var)
                                  (compustatep compst))))
      (declare (xargs :guard (> (compustate-frames-number compst)
                                0)))
      (let ((__function__ 'create-var-okp))
        (declare (ignorable __function__))
        (b* ((frame (top-frame compst))
             (scopes (frame->scopes frame))
             (scope (car scopes)))
          (not (consp (omap::assoc (ident-fix var) scope))))))

    Theorem: booleanp-of-create-var-okp

    (defthm booleanp-of-create-var-okp
      (b* ((yes/no (create-var-okp var compst)))
        (booleanp yes/no))
      :rule-classes :rewrite)

    Theorem: create-var-okp-of-ident-fix-var

    (defthm create-var-okp-of-ident-fix-var
      (equal (create-var-okp (ident-fix var) compst)
             (create-var-okp var compst)))

    Theorem: create-var-okp-ident-equiv-congruence-on-var

    (defthm create-var-okp-ident-equiv-congruence-on-var
      (implies (ident-equiv var var-equiv)
               (equal (create-var-okp var compst)
                      (create-var-okp var-equiv compst)))
      :rule-classes :congruence)

    Theorem: create-var-okp-of-compustate-fix-compst

    (defthm create-var-okp-of-compustate-fix-compst
      (equal (create-var-okp var (compustate-fix compst))
             (create-var-okp var compst)))

    Theorem: create-var-okp-compustate-equiv-congruence-on-compst

    (defthm create-var-okp-compustate-equiv-congruence-on-compst
      (implies (compustate-equiv compst compst-equiv)
               (equal (create-var-okp var compst)
                      (create-var-okp var compst-equiv)))
      :rule-classes :congruence)

    Theorem: create-var-okp-of-add-frame

    (defthm create-var-okp-of-add-frame
      (create-var-okp var (add-frame fun compst)))

    Theorem: create-var-okp-of-enter-scope

    (defthm create-var-okp-of-enter-scope
      (create-var-okp var (enter-scope compst)))

    Theorem: create-var-okp-of-add-var

    (defthm create-var-okp-of-add-var
      (equal (create-var-okp var (add-var var2 val compst))
             (and (not (equal (ident-fix var)
                              (ident-fix var2)))
                  (create-var-okp var compst))))

    Theorem: create-var-okp-of-update-var

    (defthm create-var-okp-of-update-var
      (equal (create-var-okp var (update-var var2 val compst))
             (create-var-okp var compst)))

    Theorem: create-var-okp-of-update-object

    (defthm create-var-okp-of-update-object
      (equal (create-var-okp var (update-object objdes val compst))
             (create-var-okp var compst)))

    Theorem: create-var-to-add-var

    (defthm create-var-to-add-var
      (implies (and (create-var-okp var compst)
                    (> (compustate-frames-number compst) 0))
               (equal (create-var var val compst)
                      (add-var var val compst))))