• 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
          • Syntax-for-tools
          • Atc
          • Language
          • Representation
          • Transformation-tools
            • Simpadd0
              • Simpadd0-implementation
                • Simpadd0-event-generation
                  • Simpadd0-exprs/decls/stmts
                  • Simpadd0-expr-binary
                  • Simpadd0-gen-from-params
                  • Simpadd0-gen-expr-pure-thm
                  • Simpadd0-fundef
                  • Simpadd0-gen-block-item-list-thm
                  • Simpadd0-gen-block-item-thm
                  • Simpadd0-gen-stmt-thm
                  • Simpadd0-expr-unary
                  • Simpadd0-gout
                  • Simpadd0-expr-ident
                    • Simpadd0-expr-const
                    • Simpadd0-gen-param-thms
                    • Simpadd0-block-item-stmt
                    • Simpadd0-block-item-list-one
                    • Simpadd0-stmt-return
                    • Simpadd0-gen-init-scope-thm
                    • Simpadd0-gin
                    • Simpadd0-expr-paren
                    • Simpadd0-filepath-transunit-map
                    • Simpadd0-extdecl-list
                    • Simpadd0-extdecl
                    • Simpadd0-transunit-ensemble
                    • Simpadd0-tyspecseq-to-type-and-value-kind
                    • Simpadd0-gen-var-hyps
                    • Simpadd0-transunit
                    • 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-strunispec
                • 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
              • Deftrans
              • Splitgso
              • Constant-propagation
              • Split-fn
              • Copy-fn
              • Specialize
              • Split-all-gso
              • Rename
              • Utilities
            • 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
    • Simpadd0-event-generation

    Simpadd0-expr-ident

    Transform an identifier expression (i.e. a variable).

    Signature
    (simpadd0-expr-ident ident info gin) → (mv expr gout)
    Arguments
    ident — Guard (identp ident).
    info — Guard (var-infop info).
    gin — Guard (simpadd0-ginp gin).
    Returns
    expr — Type (exprp expr).
    gout — Type (simpadd0-goutp gout).

    This undergoes no actual transformation, but we introduce it for uniformity, also because we may eventually evolve the simpadd0 implementation into a much more general transformation. Thus, the output expression consists of the identifier and validation information passed as inputs.

    If the variable has a type supported in our C formalization, which we check in the validation information, then we generate a theorem saying that the expression, when executed, yields a value of the appropriate type. The generated theorem is proved via a general supporting lemma, which is proved below.

    Definitions and Theorems

    Function: simpadd0-expr-ident

    (defun simpadd0-expr-ident (ident info gin)
     (declare (xargs :guard (and (identp ident)
                                 (var-infop info)
                                 (simpadd0-ginp gin))))
     (let ((__function__ 'simpadd0-expr-ident))
      (declare (ignorable __function__))
      (b*
       ((ident (ident-fix ident))
        ((var-info info) (var-info-fix info))
        ((simpadd0-gin gin) gin)
        (expr (make-expr-ident :ident ident
                               :info info))
        ((unless (and (type-formalp info.type)
                      (not (type-case info.type :void))
                      (not (type-case info.type :char))))
         (mv expr
             (make-simpadd0-gout :events nil
                                 :thm-name nil
                                 :thm-index gin.thm-index
                                 :names-to-avoid gin.names-to-avoid
                                 :vartys nil
                                 :diffp nil)))
        (vartys (omap::update ident info.type nil))
        ((unless (type-formalp info.type))
         (raise "Internal error: variable ~x0 has type ~x1."
                ident info.type)
         (mv (irr-expr) (irr-simpadd0-gout)))
        ((mv & ctype) (ldm-type info.type))
        (hints
         (cons
          (cons
           '"Goal"
           (cons
            ':in-theory
            (cons
             ''((:e expr-ident)
                (:e expr-pure-formalp)
                (:e ident))
             (cons
              ':use
              (cons
               (cons
                ':instance
                (cons
                 'simpadd0-expr-ident-support-lemma
                 (cons
                  (cons 'ident
                        (cons (cons 'quote (cons ident 'nil))
                              'nil))
                  (cons
                   (cons 'info
                         (cons (cons 'quote (cons info 'nil))
                               'nil))
                   (cons
                    (cons 'type
                          (cons (cons 'quote (cons ctype 'nil))
                                'nil))
                    (cons
                     (cons
                        'kind
                        (cons (cons 'quote
                                    (cons (type-to-value-kind info.type)
                                          'nil))
                              'nil))
                     'nil))))))
               'nil)))))
          'nil))
        ((mv thm-event thm-name thm-index)
         (simpadd0-gen-expr-pure-thm
              expr expr vartys
              gin.const-new gin.thm-index hints)))
       (mv expr
           (make-simpadd0-gout
                :events (list thm-event)
                :thm-name thm-name
                :thm-index thm-index
                :names-to-avoid (cons thm-name gin.names-to-avoid)
                :vartys vartys
                :diffp nil)))))

    Theorem: exprp-of-simpadd0-expr-ident.expr

    (defthm exprp-of-simpadd0-expr-ident.expr
      (b* (((mv ?expr ?gout)
            (simpadd0-expr-ident ident info gin)))
        (exprp expr))
      :rule-classes :rewrite)

    Theorem: simpadd0-goutp-of-simpadd0-expr-ident.gout

    (defthm simpadd0-goutp-of-simpadd0-expr-ident.gout
      (b* (((mv ?expr ?gout)
            (simpadd0-expr-ident ident info gin)))
        (simpadd0-goutp gout))
      :rule-classes :rewrite)

    Theorem: expr-unambp-of-simpadd0-expr-ident

    (defthm expr-unambp-of-simpadd0-expr-ident
      (b* (((mv ?expr ?gout)
            (simpadd0-expr-ident ident info gin)))
        (expr-unambp expr)))

    Theorem: simpadd0-expr-ident-support-lemma

    (defthm simpadd0-expr-ident-support-lemma
      (b* ((expr (mv-nth 1 (ldm-expr (expr-ident ident info))))
           (result (c::exec-expr-pure expr compst))
           (value (c::expr-value->value result)))
        (implies (and (expr-pure-formalp (expr-ident ident info))
                      (b* ((var (mv-nth 1 (ldm-ident ident)))
                           (objdes (c::objdesign-of-var var compst))
                           (val (c::read-object objdes compst)))
                        (and objdes (c::valuep val)
                             (equal (c::type-of-value val) type)
                             (equal (c::value-kind val) kind))))
                 (and (equal (c::value-kind value) kind)
                      (equal (c::type-of-value value)
                             type)))))

    Theorem: simpadd0-expr-ident-of-ident-fix-ident

    (defthm simpadd0-expr-ident-of-ident-fix-ident
      (equal (simpadd0-expr-ident (ident-fix ident)
                                  info gin)
             (simpadd0-expr-ident ident info gin)))

    Theorem: simpadd0-expr-ident-ident-equiv-congruence-on-ident

    (defthm simpadd0-expr-ident-ident-equiv-congruence-on-ident
      (implies (c$::ident-equiv ident ident-equiv)
               (equal (simpadd0-expr-ident ident info gin)
                      (simpadd0-expr-ident ident-equiv info gin)))
      :rule-classes :congruence)

    Theorem: simpadd0-expr-ident-of-var-info-fix-info

    (defthm simpadd0-expr-ident-of-var-info-fix-info
      (equal (simpadd0-expr-ident ident (var-info-fix info)
                                  gin)
             (simpadd0-expr-ident ident info gin)))

    Theorem: simpadd0-expr-ident-var-info-equiv-congruence-on-info

    (defthm simpadd0-expr-ident-var-info-equiv-congruence-on-info
      (implies (c$::var-info-equiv info info-equiv)
               (equal (simpadd0-expr-ident ident info gin)
                      (simpadd0-expr-ident ident info-equiv gin)))
      :rule-classes :congruence)

    Theorem: simpadd0-expr-ident-of-simpadd0-gin-fix-gin

    (defthm simpadd0-expr-ident-of-simpadd0-gin-fix-gin
      (equal (simpadd0-expr-ident ident info (simpadd0-gin-fix gin))
             (simpadd0-expr-ident ident info gin)))

    Theorem: simpadd0-expr-ident-simpadd0-gin-equiv-congruence-on-gin

    (defthm simpadd0-expr-ident-simpadd0-gin-equiv-congruence-on-gin
      (implies (simpadd0-gin-equiv gin gin-equiv)
               (equal (simpadd0-expr-ident ident info gin)
                      (simpadd0-expr-ident ident info gin-equiv)))
      :rule-classes :congruence)