Equality lifting transformation of a non-empty list of block items.
(xeq-block-item-list-cons item item-new item-thm-name
items items-new items-thm-name gin)
→
(mv item+items gout)The resulting list of block items is obtained by consing the possibly transformed first item and the possibly transformed rest of the items.
We generate a theorem iff theorems were generated for both the first item and (the list of) the rest of the items.
Function:
(defun xeq-block-item-list-cons (item item-new item-thm-name items items-new items-thm-name gin) (declare (xargs :guard (and (block-itemp item) (block-itemp item-new) (symbolp item-thm-name) (block-item-listp items) (block-item-listp items-new) (symbolp items-thm-name) (ginp gin)))) (declare (xargs :guard (and (block-item-unambp item) (block-item-annop item) (block-item-unambp item-new) (block-item-annop item-new) (block-item-list-unambp items) (block-item-list-annop items) (block-item-list-unambp items-new) (block-item-list-annop items-new)))) (let ((__function__ 'xeq-block-item-list-cons)) (declare (ignorable __function__)) (b* (((gin gin) gin) (item (block-item-fix item)) (items (block-item-list-fix items)) (item-new (block-item-fix item-new)) (items-new (block-item-list-fix items-new)) (item+items (cons item items)) (item+items-new (cons item-new items-new)) (gout-no-thm (gout-no-thm gin)) ((unless (and item-thm-name items-thm-name)) (mv item+items-new gout-no-thm)) (first-types (block-item-types item)) (rest-types (block-item-list-types items)) ((mv & old-item) (ldm-block-item item)) ((mv & new-item) (ldm-block-item item-new)) ((mv & old-items) (ldm-block-item-list items)) ((mv & new-items) (ldm-block-item-list items-new)) ((mv & first-ctypes) (ldm-type-option-set first-types)) ((mv & rest-ctypes) (ldm-type-option-set rest-types)) (hints (cons (cons '"Goal" (cons ':in-theory (cons ''(c::stmt-value-kind-possibilities (:e delete) (:e union) c::compustate-frames-number-of-exec-block-item c::compustatep-when-compustate-resultp-and-not-errorp block-item-list-cons-compustate-vars) (cons ':use (cons (cons (cons ':instance (cons item-thm-name '((limit (1- limit))))) (cons (cons ':instance (cons items-thm-name (cons (cons 'compst (cons (cons 'mv-nth (cons '1 (cons (cons 'c::exec-block-item (cons (cons 'quote (cons old-item 'nil)) '(compst old-fenv (1- limit)))) 'nil))) 'nil)) '((limit (1- limit)))))) (cons (cons ':instance (cons 'block-item-list-cons-first-congruence (cons (cons 'old-item (cons (cons 'quote (cons old-item 'nil)) 'nil)) (cons (cons 'old-items (cons (cons 'quote (cons old-items 'nil)) 'nil)) (cons (cons 'new-item (cons (cons 'quote (cons new-item 'nil)) 'nil)) (cons (cons 'new-items (cons (cons 'quote (cons new-items 'nil)) 'nil)) (cons (cons 'first-types (cons (cons 'quote (cons first-ctypes 'nil)) 'nil)) (cons (cons 'rest-types (cons (cons 'quote (cons rest-ctypes 'nil)) 'nil)) 'nil)))))))) (cons (cons ':instance (cons 'block-item-list-cons-rest-congruence (cons (cons 'old-item (cons (cons 'quote (cons old-item 'nil)) 'nil)) (cons (cons 'old-items (cons (cons 'quote (cons old-items 'nil)) 'nil)) (cons (cons 'new-item (cons (cons 'quote (cons new-item 'nil)) 'nil)) (cons (cons 'new-items (cons (cons 'quote (cons new-items 'nil)) 'nil)) (cons (cons 'first-types (cons (cons 'quote (cons first-ctypes 'nil)) 'nil)) (cons (cons 'rest-types (cons (cons 'quote (cons rest-ctypes 'nil)) 'nil)) 'nil)))))))) (cons (cons ':instance (cons 'block-item-list-cons-first-errors (cons (cons 'item (cons (cons 'quote (cons old-item 'nil)) 'nil)) (cons (cons 'items (cons (cons 'quote (cons old-items 'nil)) 'nil)) '((fenv old-fenv)))))) (cons (cons ':instance (cons 'block-item-list-cons-rest-errors (cons (cons 'item (cons (cons 'quote (cons old-item 'nil)) 'nil)) (cons (cons 'items (cons (cons 'quote (cons old-items 'nil)) 'nil)) '((fenv old-fenv)))))) 'nil)))))) 'nil))))) 'nil)) ((mv thm-event thm-name thm-index) (gen-block-item-list-thm item+items item+items-new gin.vartys gin.const-new gin.thm-index hints))) (mv item+items-new (make-gout :events (cons thm-event gin.events) :thm-index thm-index :thm-name thm-name :vartys gin.vartys)))))
Theorem:
(defthm block-item-listp-of-xeq-block-item-list-cons.item+items (b* (((mv ?item+items ?gout) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin))) (block-item-listp item+items)) :rule-classes :rewrite)
Theorem:
(defthm goutp-of-xeq-block-item-list-cons.gout (b* (((mv ?item+items ?gout) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin))) (goutp gout)) :rule-classes :rewrite)
Theorem:
(defthm xeq-block-item-list-cons-of-block-item-fix-item (equal (xeq-block-item-list-cons (block-item-fix item) item-new item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin)))
Theorem:
(defthm xeq-block-item-list-cons-block-item-equiv-congruence-on-item (implies (c$::block-item-equiv item item-equiv) (equal (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item-equiv item-new item-thm-name items items-new items-thm-name gin))) :rule-classes :congruence)
Theorem:
(defthm xeq-block-item-list-cons-of-block-item-fix-item-new (equal (xeq-block-item-list-cons item (block-item-fix item-new) item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin)))
Theorem:
(defthm xeq-block-item-list-cons-block-item-equiv-congruence-on-item-new (implies (c$::block-item-equiv item-new item-new-equiv) (equal (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item item-new-equiv item-thm-name items items-new items-thm-name gin))) :rule-classes :congruence)
Theorem:
(defthm xeq-block-item-list-cons-of-block-item-list-fix-items (equal (xeq-block-item-list-cons item item-new item-thm-name (block-item-list-fix items) items-new items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin)))
Theorem:
(defthm xeq-block-item-list-cons-block-item-list-equiv-congruence-on-items (implies (c$::block-item-list-equiv items items-equiv) (equal (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items-equiv items-new items-thm-name gin))) :rule-classes :congruence)
Theorem:
(defthm xeq-block-item-list-cons-of-block-item-list-fix-items-new (equal (xeq-block-item-list-cons item item-new item-thm-name items (block-item-list-fix items-new) items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin)))
Theorem:
(defthm xeq-block-item-list-cons-block-item-list-equiv-congruence-on-items-new (implies (c$::block-item-list-equiv items-new items-new-equiv) (equal (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin) (xeq-block-item-list-cons item item-new item-thm-name items items-new-equiv items-thm-name gin))) :rule-classes :congruence)
Theorem:
(defthm block-item-list-unambp-of-xeq-block-item-list-cons (implies (and (block-item-unambp item-new) (block-item-list-unambp items-new)) (b* (((mv ?item+items ?gout) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin))) (block-item-list-unambp item+items))))
Theorem:
(defthm block-item-list-annop-of-xeq-block-item-list-cons (implies (and (block-item-annop item-new) (block-item-list-annop items-new)) (b* (((mv ?item+items ?gout) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin))) (block-item-list-annop item+items))))
Theorem:
(defthm block-item-list-aidentp-of-xeq-block-item-list-cons (implies (and (block-item-aidentp item-new gcc) (block-item-list-aidentp items-new gcc)) (b* (((mv ?item+items ?gout) (xeq-block-item-list-cons item item-new item-thm-name items items-new items-thm-name gin))) (block-item-list-aidentp item+items gcc))))