Transform an identifier expression (i.e. a variable).
(simpadd0-expr-ident ident info gin) → (mv expr 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 type
Function:
(defun simpadd0-expr-ident (ident info gin) (declare (xargs :guard (and (identp ident) (c$::var-infop info) (simpadd0-ginp gin)))) (let ((__function__ 'simpadd0-expr-ident)) (declare (ignorable __function__)) (b* ((ident (ident-fix ident)) ((c$::var-info info) (c$::var-info-fix info)) ((simpadd0-gin gin) gin) (expr (make-expr-ident :ident ident :info info)) ((unless (c$::type-case info.type :sint)) (mv expr (make-simpadd0-gout :events nil :thm-name nil :thm-index gin.thm-index :names-to-avoid gin.names-to-avoid :vars nil :diffp nil))) (vars (insert ident nil)) (hints (cons (cons '"Goal" (cons ':in-theory (cons ''((:e c$::expr-ident) (:e c$::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)) 'nil)))) 'nil))))) 'nil)) ((mv thm-event thm-name thm-index) (simpadd0-gen-expr-pure-thm expr expr vars 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 (list thm-name) :vars vars :diffp nil)))))
Theorem:
(defthm exprp-of-simpadd0-expr-ident.expr (b* (((mv ?expr ?gout) (simpadd0-expr-ident ident info gin))) (exprp expr)) :rule-classes :rewrite)
Theorem:
(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:
(defthm expr-unambp-of-simpadd0-expr-ident (b* (((mv ?expr ?gout) (simpadd0-expr-ident ident info gin))) (expr-unambp expr)))
Theorem:
(defthm simpadd0-expr-ident-support-lemma (b* ((expr (mv-nth 1 (c$::ldm-expr (c$::expr-ident ident info)))) (result (c::exec-expr-pure expr compst)) (value (c::expr-value->value result))) (implies (and (c$::expr-pure-formalp (c$::expr-ident ident info)) (b* ((var (mv-nth 1 (c$::ldm-ident ident))) (objdes (c::objdesign-of-var var compst)) (val (c::read-object objdes compst))) (and objdes (c::valuep val) (c::value-case val :sint)))) (equal (c::value-kind value) :sint))))
Theorem:
(defthm simpadd0-expr-ident-of-ident-fix-ident (equal (simpadd0-expr-ident (ident-fix ident) info gin) (simpadd0-expr-ident ident info gin)))
Theorem:
(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:
(defthm simpadd0-expr-ident-of-var-info-fix-info (equal (simpadd0-expr-ident ident (c$::var-info-fix info) gin) (simpadd0-expr-ident ident info gin)))
Theorem:
(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:
(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:
(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)