summaryrefslogtreecommitdiff
path: root/books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp')
-rw-r--r--books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp7828
1 files changed, 7828 insertions, 0 deletions
diff --git a/books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp b/books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp
new file mode 100644
index 0000000..75da482
--- /dev/null
+++ b/books/workshops/1999/embedded/Proof-Of-Contribution/Proof-Of-Correctness-OneCycle.lisp
@@ -0,0 +1,7828 @@
+
+(in-package "ACL2")
+
+(include-book "Disjoint-lists")
+
+; The following is commented out starting with v2-7 because a more general
+; macro e/d is now part of ACL2.
+; (defmacro e/d (enable disable)
+; `(union-theories ',enable (disable ,@disable)))
+
+(defun in-range (idx l)
+ (and
+ (integerp idx)
+ (>= idx 0)
+ (< idx (len l))))
+
+(in-theory (enable in-range))
+(in-theory (disable mod floor))
+
+(defun mlambda-fn (args form)
+ (declare (xargs :guard (symbol-listp args)))
+ (cond ((atom form)
+ (cond ((member form args) form)
+ (t (list 'QUOTE form))))
+ (t (list 'CONS (mlambda-fn args (car form))
+ (mlambda-fn args (cdr form))))))
+
+(defmacro mlambda (args form)
+ (declare (xargs :guard (symbol-listp args)))
+ (mlambda-fn args form))
+
+
+(defmacro qr-guard (x y)
+ (mlambda (x y)
+ (and (force (rationalp x))
+ (force (rationalp y))
+ (force (not (equal 0 y))))))
+
+(defun type-expected (vars)
+ (cond
+ ( (and (true-listp vars)
+ (equal (len vars) 1))
+ 'Bool)
+ ( (and (true-listp vars)
+ (equal (len vars) (len *rns*)))
+ 'Int)
+ ( t
+ 'Wrong-Typing)))
+
+
+(defthm IN-RANGE-I-ON-M-IMPLIES-IN-RANGE-I-1-ON-CDR-M
+ (IMPLIES (AND (IN-RANGE IDX M)
+ (NOT (ENDP M))
+ (NOT (ZP IDX)))
+ (IN-RANGE (1- IDX) (CDR M))))
+
+(defun positivep (v)
+ (and
+ (integerp v)
+ (> v 0)))
+
+
+(defun positive-list (l)
+ (if (endp l)
+ (null l)
+ (and (positivep (car l))
+ (positive-list (cdr l)))))
+
+
+(defun boolean-to-int (bool)
+ (if bool 1 0))
+
+(defun int-to-bool (int)
+ (equal int 1))
+
+(defun make-n-list (el n)
+ (if
+ (zp n)
+ nil
+ (cons el (make-n-list el (1- n)))))
+
+(defun eventually-make-list (l n)
+ (if (equal (len l) 1)
+ (make-n-list (car l) n)
+ l))
+
+(defun double-induct (idx n)
+ (if (zp idx) (+ idx n)
+ (double-induct (1- idx) (1- n))))
+
+(defthm el-of-makelist-is-el
+ (implies
+ (and
+ (integerp n)
+ (in-range idx (make-n-list el n)))
+ (equal
+ (nth idx (make-n-list el n))
+ el))
+ :hints (("Goal" :induct (double-induct idx n))
+ ("Subgoal *1/1" :use make-n-list)))
+
+
+
+
+
+
+(in-theory (disable my-or-3 my-or-2))
+
+
+
+
+
+(defun opcode (ins) (nth 0 ins))
+(defun par1 (ins) (nth 1 ins))
+(defun par2 (ins) (nth 2 ins))
+(defun par3 (ins) (nth 3 ins))
+(defun par4 (ins) (nth 4 ins))
+
+
+(defun mem (s) (car s))
+(defun pcc (s) (cadr s))
+(defun code (s) (cddr s))
+
+(defun make-state (mem pcc code)
+ (cons mem (cons pcc code)))
+
+
+(defun initial-state (prog)
+ (make-state (car prog) 0 (cdr prog)))
+
+
+
+
+
+
+(defun gem-instruction-p (instr mem)
+ (and
+ (true-listp instr)
+ (or
+ (and
+ (equal (opcode instr) 'gem-add)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int) )
+ (and
+ (equal (opcode instr) 'gem-sub)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int) )
+ (and
+ (equal (opcode instr) 'gem-equ)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Bool) )
+ )))
+
+
+(defun gem-instruction-list-p (instlist mem)
+ (if
+ (endp instlist)
+ (null instlist)
+ (and
+ (gem-instruction-p (car instlist) mem)
+ (gem-instruction-list-p (cdr instlist) mem))))
+
+
+(defun gem-program-p (prog)
+ (and
+ (true-listp prog)
+ (equal (len prog) 2)
+ (is-typed-amem-p (car prog))
+ (bounded-amem-p (car prog))
+ (gem-instruction-list-p (cdr prog) (car prog))))
+
+
+(defun gem-statep (x)
+ (and (consp x)
+ (consp (cdr x))
+ (integerp (pcc x))
+ (is-typed-amem-p (mem x))
+ (bounded-amem-p (mem x)) ;;; new
+ (gem-instruction-list-p (code x) (mem x))))
+
+
+(defthm nth-instruction-of-gem-list-is-gem-instruction
+ (implies
+ (gem-instruction-list-p gl mem)
+ (or
+ (null (nth idx gl))
+ (gem-instruction-p (nth idx gl) mem)))
+ :hints (("Goal" :in-theory (disable gem-instruction-p)))
+ :rule-classes nil)
+
+(defthm an-instruction-of-gem-program-is-null-or-gem-instruction
+ (implies
+ (gem-statep st)
+ (or
+ (null (nth (pcc st) (code st)))
+ (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ :hints (("Goal" :in-theory (disable code mem pcc gem-instruction-list-p gem-instruction-p)
+ :use (:instance nth-instruction-of-gem-list-is-gem-instruction
+ (gl (code st))
+ (idx (pcc st))
+ (mem (mem st)))))
+ :rule-classes nil)
+
+
+
+
+
+
+
+
+
+
+
+(defun rtm-instruction-p (instr mem)
+ (and
+ (true-listp instr)
+ (or
+ (and
+ (equal (opcode instr) 'rtm-add)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int)
+ (positivep (par4 instr)))
+ (and
+ (equal (opcode instr) 'rtm-sub)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int)
+ (positivep (par4 instr)))
+ (and
+ (equal (opcode instr) 'rtm-equ)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int))
+ (and
+ (equal (opcode instr) 'rtm-or)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int))
+ (and
+ (equal (opcode instr) 'rtm-and)
+ (equal (len instr) 4)
+ (is-mem-cell-p (get-cell (par1 instr) mem))
+ (is-mem-cell-p (get-cell (par2 instr) mem))
+ (is-mem-cell-p (get-cell (par3 instr) mem))
+ (equal (var-type (get-cell (par1 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par2 instr) mem)) 'Int)
+ (equal (var-type (get-cell (par3 instr) mem)) 'Int)))))
+
+(defun rtm-instruction-list-p (instlist mem)
+ (if
+ (endp instlist)
+ (null instlist)
+ (and
+ (rtm-instruction-p (car instlist) mem)
+ (rtm-instruction-list-p (cdr instlist) mem))))
+
+
+(defun rtm-program-p (prog)
+ (and
+ (true-listp prog)
+ (equal (len prog) 2)
+ (is-typed-amem-p (car prog))
+ (rtm-instruction-list-p (cdr prog) (car prog))))
+
+
+
+
+(defun rtm-statep (x)
+ (and (consp x)
+ (consp (cdr x))
+ (integerp (pcc x))
+ (is-typed-amem-p (mem x))
+ (rtm-instruction-list-p (code x) (mem x))))
+
+
+
+
+
+
+
+(defthm nth-instruction-of-rtm-list-is-rtm-instruction
+ (implies
+ (rtm-instruction-list-p gl mem)
+ (or
+ (null (nth idx gl))
+ (rtm-instruction-p (nth idx gl) mem)))
+ :hints (("Goal" :in-theory (disable rtm-instruction-p)))
+ :rule-classes nil)
+
+(defthm an-instruction-of-rtm-program-is-null-or-rtm-instruction
+ (implies
+ (rtm-statep st)
+ (or
+ (null (nth (pcc st) (code st)))
+ (rtm-instruction-p (nth (pcc st) (code st)) (mem st))))
+ :hints (("Goal" :in-theory (disable code mem pcc rtm-instruction-list-p rtm-instruction-p)
+ :use (:instance nth-instruction-of-rtm-list-is-rtm-instruction
+ (gl (code st))
+ (idx (pcc st))
+ (mem (mem st)))))
+ :rule-classes nil)
+
+
+
+
+
+
+(defun sum-and-update (c1 c2 c3 prime mem)
+ (make-cell
+ (mod
+ (+
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem)))
+ prime)
+ (var-attribute (get-cell c1 mem))
+ (var-type (get-cell c1 mem))))
+
+
+(DEFUN SUM-AND-UPDATE-NOREST (C1 C2 C3 MEM)
+ (MAKE-CELL (mod
+ (+ (VAR-VALUE (GET-CELL C2 MEM))
+ (VAR-VALUE (GET-CELL C3 MEM)))
+ (prod *rns*))
+ (VAR-ATTRIBUTE (GET-CELL C1 MEM))
+ (VAR-TYPE (GET-CELL C1 MEM))))
+
+(defun sub-and-update (c1 c2 c3 prime mem)
+ (make-cell
+ (mod
+ (-
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem)))
+ prime)
+ (var-attribute (get-cell c1 mem))
+ (var-type (get-cell c1 mem))))
+
+
+(DEFUN SUB-AND-UPDATE-NOREST (C1 C2 C3 MEM)
+ (MAKE-CELL (mod
+ (- (VAR-VALUE (GET-CELL C2 MEM))
+ (VAR-VALUE (GET-CELL C3 MEM)))
+ (prod *rns*))
+ (VAR-ATTRIBUTE (GET-CELL C1 MEM))
+ (VAR-TYPE (GET-CELL C1 MEM))))
+
+
+
+(defun and-update (c1 c2 c3 mem)
+ (make-cell
+ (boolean-to-int
+ (and
+ (int-to-bool (var-value (get-cell c2 mem)))
+ (int-to-bool (var-value (get-cell c3 mem)))))
+ (var-attribute (get-cell c1 mem))
+ (var-type (get-cell c1 mem))))
+
+(defun or-update (c1 c2 c3 mem)
+ (make-cell
+ (boolean-to-int
+ (or
+ (int-to-bool (var-value (get-cell c2 mem)))
+ (int-to-bool (var-value (get-cell c3 mem)))))
+ (var-attribute (get-cell c1 mem))
+ (var-type (get-cell c1 mem))))
+
+(defun gen-eq-update (c1 c2 c3 mem)
+ (make-cell
+ (boolean-to-int
+ (equal
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem))))
+ (var-attribute (get-cell c1 mem))
+ (var-type (get-cell c1 mem))))
+
+
+
+
+
+(defthm sum-and-update-returns-a-mem-cell
+ (implies
+ (and
+ (equal (var-type (get-cell c1 mem)) 'Int) ; This is added to account for booleans
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem))
+ (positivep prime))
+ (is-mem-cell-p (sum-and-update c1 c2 c3 prime mem)))
+ :hints (("Goal" :in-theory (enable mod make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+#|
+(defthm gcd-unfold
+ (equal (g-c-d x y)
+ (IF (ZP X)
+ Y
+ (IF (ZP Y)
+ X
+ (IF (<= X Y)
+ (G-C-D X (- Y X))
+ (G-C-D (- X Y) Y)))))
+ :hints (("Goal" :in-theory (enable g-c-d nonneg-int-gcd
+ (:executable-counterpart nonneg-int-gcd)
+ (:induction nonneg-int-gcd)))))
+|#
+
+
+(defthm posp-all-unfold
+ (equal (posp-all l)
+ (IF (ENDP L)
+ T
+ (AND (POSP (CAR L))
+ (POSP-ALL (CDR L)))))
+ :hints (("Goal" :in-theory (enable posp-all))))
+
+(defun integer>1-listp (l)
+ (if (endp l)
+ (null l)
+ (and (integerp (car l))
+ (> (car l) 1)
+ (integer>1-listp (cdr l)))))
+
+
+(defthm int>1-unfold
+ (equal (integer>1-listp l)
+ (IF (ENDP L)
+ (NULL L)
+ (AND (INTEGERP (CAR L))
+ (> (CAR L) 1)
+ (INTEGER>1-LISTP (CDR L))))))
+
+
+(defthm fact-bout-rns
+ (and
+ (integer-listp *rns*)
+ (rel-prime-moduli *rns*)
+ (posp-all *rns*)
+ (integer>1-listp *rns*)
+ (not (null *rns*))
+ (natp (prod *rns*))
+ (> (prod *rns*) 1))
+ :hints (("Goal" :in-theory (enable prod posp rel-prime-moduli rel-prime-all rel-prime g-c-d (:executable-counterpart nonneg-int-gcd))))
+ :rule-classes nil)
+
+(in-theory (disable
+ ;gcd-unfold
+ posp-all-unfold int>1-unfold))
+
+(defthm greater-one-means-greater-zero
+ (implies (integer>1-listp rns) (posp-all rns))
+ :hints (("Goal"
+ :in-theory (enable posp-all posp)))
+ :rule-classes nil)
+
+(DEFTHM SILS1A
+ (IMPLIES (AND (POSP M) (INTEGERP A))
+ (NATP (MOD A M)))
+ :HINTS
+ (("Goal" :IN-THEORY
+ '((:REWRITE INTEGERP-MOD-EXP)
+ (:DEFINITION NATP)
+ (:DEFINITION POSP))
+ :USE
+ ((:INSTANCE MOD-TYPE-EXP (X A) (Y M))
+ (:INSTANCE MOD-=-0-EXP (X A) (Y M)))))
+ :rule-classes nil)
+
+(defthm sum-and-update-norest-returns-a-mem-cell
+ (implies
+ (and
+ (equal (var-type (get-cell c1 mem)) 'Int)
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem)))
+ (and
+ (is-mem-cell-p (sum-and-update-norest c1 c2 c3 mem))
+ (bounded-value (sum-and-update-norest c1 c2 c3 mem))
+ (equal (var-type (sum-and-update-norest c1 c2 c3 mem)) 'Int)) )
+ :hints (("Goal"
+ :use (fact-bout-rns
+ (:instance sils1a
+ (a (+ (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem))))
+ (m (prod *rns*)))
+ (:instance mod-bounds-exp
+ (x (+ (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem))))
+ (y (prod *rns*))))
+ :in-theory (enable posp make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+
+(defthm sub-and-update-returns-a-mem-cell
+ (implies
+ (and
+ (equal (var-type (get-cell c1 mem)) 'Int)
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem))
+ (positivep prime) )
+ (is-mem-cell-p (sub-and-update c1 c2 c3 prime mem)))
+ :hints (("Goal" :in-theory (enable mod make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+
+(defthm sub-and-update-norest-returns-a-mem-cell
+ (implies
+ (and
+ (equal (var-type (get-cell c1 mem)) 'Int)
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem)))
+ (and
+ (is-mem-cell-p (sub-and-update-norest c1 c2 c3 mem))
+ (bounded-value (sub-and-update-norest c1 c2 c3 mem))
+ (equal (var-type (sub-and-update-norest c1 c2 c3 mem)) 'Int)) )
+ :hints (("Goal"
+ :use (fact-bout-rns
+ (:instance sils1a
+ (a (- (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem))))
+ (m (prod *rns*)))
+ (:instance mod-bounds-exp
+ (x (- (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem))))
+ (y (prod *rns*))))
+ :in-theory (enable posp make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+
+(defthm and-update-returns-a-mem-cell
+ (implies
+ (and
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem)))
+ (is-mem-cell-p (and-update c1 c2 c3 mem)))
+ :hints (("Goal" :in-theory (enable my-or-2 make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+(defthm or-update-returns-a-mem-cell
+ (implies
+ (and
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem)))
+ (is-mem-cell-p (or-update c1 c2 c3 mem)))
+ :hints (("Goal" :in-theory (enable my-or-2 make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+(defthm gen-eq-update-returns-a-mem-cell
+ (implies
+ (and
+ (is-mem-cell-p (get-cell c1 mem))
+ (is-mem-cell-p (get-cell c2 mem))
+ (is-mem-cell-p (get-cell c3 mem)))
+ (and
+ (bounded-value (gen-eq-update c1 c2 c3 mem))
+ (is-mem-cell-p (gen-eq-update c1 c2 c3 mem))))
+ :hints (("Goal"
+ :use (fact-bout-rns
+ (:instance sils1a
+ (a (boolean-to-int (equal (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem)))))
+ (m (prod *rns*)))
+ (:instance mod-bounds-exp
+ (x (boolean-to-int (equal (var-value (get-cell c2 mem)) (var-value (get-cell c3 mem)))))
+ (y (prod *rns*))))
+ :in-theory (enable posp my-or-2 make-cell var-type var-attribute var-value)))
+ :rule-classes :forward-chaining)
+
+
+
+
+
+
+
+
+
+
+
+(defun gem-add (a b c s)
+ (make-state
+ (put-cell a
+ (sum-and-update-norest a b c (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+(defun gem-sub (a b c s)
+ (make-state
+ (put-cell a
+ (sub-and-update-norest a b c (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+(defun rtm-add (a b c d s)
+ (make-state
+ (put-cell a
+ (sum-and-update a b c d (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+(defun rtm-sub (a b c d s)
+ (make-state
+ (put-cell a
+ (sub-and-update a b c d (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+
+(defun rtm-and (a b c s)
+ (make-state
+ (put-cell a
+ (and-update a b c (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+(defun rtm-or (a b c s)
+ (make-state
+ (put-cell a
+ (or-update a b c (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+(defun generic-eql (a b c s)
+ (make-state
+ (put-cell a
+ (gen-eq-update a b c (mem s))
+ (mem s))
+ (1+ (pcc s))
+ (code s)))
+
+
+
+(defun execute-instruction (st)
+ (let
+ ((op (opcode (nth (pcc st) (code st))))
+ (ins (nth (pcc st) (code st))))
+ (case op
+ (gem-add (gem-add (par1 ins) (par2 ins) (par3 ins) st))
+ (gem-sub (gem-sub (par1 ins) (par2 ins) (par3 ins) st))
+ (gem-equ (generic-eql (par1 ins) (par2 ins) (par3 ins) st))
+ (rtm-add (rtm-add (par1 ins) (par2 ins) (par3 ins) (par4 ins) st))
+ (rtm-sub (rtm-sub (par1 ins) (par2 ins) (par3 ins) (par4 ins) st))
+ (rtm-and (rtm-and (par1 ins) (par2 ins) (par3 ins) st))
+ (rtm-or (rtm-or (par1 ins) (par2 ins) (par3 ins) st))
+ (rtm-equ (generic-eql (par1 ins) (par2 ins) (par3 ins) st))
+ (otherwise st))))
+
+
+(defun execute-n-instructions (st n)
+ (if
+ (zp n)
+ st
+ (execute-n-instructions
+ (execute-instruction st)
+ (1- n))))
+
+
+
+(defthm instruction-incrementing-pvv
+ (implies
+ (>= (pcc st) 0)
+ (>= (pcc (execute-instruction st)) 0)))
+
+
+
+
+(defthm in-range-instruction-is-gem-instruction
+ (implies
+ (and
+ (in-range pcc code)
+ (gem-instruction-list-p code mem))
+ (gem-instruction-p (nth pcc code) mem))
+ :hints (("Goal" :in-theory (disable gem-instruction-p)))
+ :rule-classes :forward-chaining)
+
+
+
+(defthm in-range-instruction-is-rtmm-instruction
+ (implies
+ (and
+ (in-range pcc code)
+ (rtm-instruction-list-p code mem))
+ (rtm-instruction-p (nth pcc code) mem))
+ :hints (("Goal" :in-theory (disable rtm-instruction-p)))
+ :rule-classes :forward-chaining)
+
+
+
+
+
+(defthm null-not-in-range
+ (implies
+ (and
+ (integerp idx)
+ (>= idx 0)
+ (not (in-range idx l)))
+ (null (nth idx l)))
+ :rule-classes :forward-chaining)
+
+(defthm pcc-not-in-range-means-null-instruction
+ (implies
+ (and
+ (or
+ (gem-statep st)
+ (rtm-statep st))
+ (>= (pcc st) 0)
+ (not (in-range (pcc st) (code st))))
+ (null (nth (pcc st) (code st))))
+ :hints (("Goal" :cases ( (gem-statep st) (rtm-statep st))))
+ :rule-classes :forward-chaining)
+
+(defthm null-opcode-implies-execution-does-not-touch-state
+ (implies
+ (null (nth (pcc st) (code st)))
+ (equal (execute-instruction st) st)))
+
+(defthm execute-not-in-range-instruction-retrieves-same-state
+ (implies
+ (and
+ (or
+ (gem-statep st)
+ (rtm-statep st) )
+ (>= (pcc st) 0)
+ (not (in-range (pcc st) (code st))))
+ (equal (execute-instruction st) st))
+ :hints (("Goal" :cases ( (gem-statep st) (rtm-statep st) ))
+ ("Subgoal 2" :use ((:instance gem-statep (x st))
+ null-opcode-implies-execution-does-not-touch-state
+ pcc-not-in-range-means-null-instruction))
+ ("Subgoal 1" :use ((:instance rtm-statep (x st))
+ null-opcode-implies-execution-does-not-touch-state
+ pcc-not-in-range-means-null-instruction))))
+
+(in-theory (disable null-opcode-implies-execution-does-not-touch-state
+ execute-not-in-range-instruction-retrieves-same-state))
+
+
+(defthm execute-instruction-does-not-touch-code (equal (code (execute-instruction st)) (code st)))
+
+(defthm execute-n-instruction-does-not-touch-code (equal (code (execute-n-instructions st n)) (code st)))
+
+(defthm execute-n-instruction-decomposition
+ (implies
+ (and
+ (integerp n1)
+ (integerp n2)
+ (>= n1 0)
+ (>= n2 0))
+ (equal
+ (execute-n-instructions st (+ n1 n2))
+ (execute-n-instructions (execute-n-instructions st n1) n2)))
+ :hints (("Goal" :in-theory (disable execute-instruction member-equal))))
+
+
+(defthm putting-a-new-cell-preserves-typed-amem
+ (implies
+ (and
+ (is-typed-amem-p mem)
+ (is-mem-cell-p new-cell))
+ (is-typed-amem-p (put-cell c new-cell mem)))
+:hints (("Goal" :in-theory (enable put-cell))))
+
+(defthm no-influence-of-putting-mem-cells
+ (implies
+ (and
+ (is-mem-cell-p cell)
+ (is-mem-cell-p (get-cell c1 mem)))
+ (is-mem-cell-p (get-cell c1 (put-cell pos cell mem))))
+ :hints ( ("Goal" :in-theory (enable put-cell get-cell) )))
+
+
+(defthm putting-a-new-bounded-cell-preserves-boundedness
+ (implies
+ (and
+ (bounded-amem-p mem)
+ (bounded-value new-cell))
+ (bounded-amem-p (put-cell c new-cell mem)))
+:hints (("Goal" :in-theory (enable put-cell))))
+
+(defthm no-influence-of-putting-bounded-cells
+ (implies
+ (and
+ (bounded-value cell)
+ (bounded-value (get-cell c1 mem)))
+ (bounded-value (get-cell c1 (put-cell pos cell mem))))
+ :hints ( ("Goal" :in-theory (enable put-cell get-cell) )))
+
+
+
+(defthm putting-an-existing-cell-does-not-change-var-inclusion-right
+ (implies
+ (is-mem-cell-p (get-cell v mem))
+ (iff (vars-inclusion m mem) (vars-inclusion m (put-cell v anyvalue mem))))
+ :hints (("Goal" :in-theory (enable put-cell get-cell is-mem-cell-p))))
+
+(defthm putting-an-existing-cell-does-not-change-var-inclusion-left
+ (implies
+ (is-mem-cell-p (get-cell v mem))
+ (iff (vars-inclusion mem m) (vars-inclusion (put-cell v anyvalue mem) m)))
+ :hints (("Goal" :in-theory (enable put-cell get-cell is-mem-cell-p))))
+
+
+
+(defthm execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (and
+ (equal (var-attribute (get-cell cell (mem st)))
+ (var-attribute (get-cell cell (mem (execute-instruction st)))))
+ (equal (var-type (get-cell cell (mem st)))
+ (var-type (get-cell cell (mem (execute-instruction st))))))
+ :hints (("Goal" :in-theory (enable put-cell get-cell make-cell mem make-state var-attribute var-type))))
+
+
+
+(in-theory (disable
+ putting-an-existing-cell-does-not-change-var-inclusion-left
+ putting-an-existing-cell-does-not-change-var-inclusion-right
+ ))
+
+
+
+
+
+
+;;(ld "Properties-of-Execute-Gem-Instruction-New.lisp" :ld-error-action :error)
+
+
+
+(defthm any-mem-cell-is-conserved-after-execute-instruction-on-gemstate
+ (implies (and
+ (gem-statep st)
+ (is-mem-cell-p (get-cell anycell (mem st))))
+ (is-mem-cell-p (get-cell anycell (mem (execute-instruction st)))))
+:hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-gem-program-is-null-or-gem-instruction)
+ ("Subgoal 1" :use (execute-instruction
+ (:instance sum-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sub-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance gen-eq-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st))))
+ :in-theory (disable bounded-value put-cell get-cell execute-instruction
+ sum-and-update-norest sub-and-update-norest gen-eq-update
+ par1 par2 par3 par4 member-equal nth rtm-add rtm-sub is-mem-cell-p))))
+
+(defthm any-bounded-cell-is-bounded-after-execute-instruction-on-gemstate
+ (implies (and
+ (gem-statep st)
+ (bounded-value (get-cell anycell (mem st))))
+ (bounded-value (get-cell anycell (mem (execute-instruction st)))))
+:hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-gem-program-is-null-or-gem-instruction)
+ ("Subgoal 1" :use (execute-instruction
+ (:instance sum-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sub-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance gen-eq-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st))))
+ :in-theory (disable bounded-value put-cell get-cell execute-instruction bounded-value
+ sum-and-update-norest sub-and-update-norest gen-eq-update
+ par1 par2 par3 par4 member-equal nth rtm-add rtm-sub is-mem-cell-p))))
+
+#|
+(defthm execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (and
+ (equal (var-attribute (get-cell cell (mem st)))
+ (var-attribute (get-cell cell (mem (execute-instruction st)))))
+ (equal (var-type (get-cell cell (mem st)))
+ (var-type (get-cell cell (mem (execute-instruction st))))))
+ :hints (("Goal" :in-theory (enable put-cell get-cell make-cell mem make-state var-attribute var-type))))
+|#
+
+(defthm any-gem-instruction-is-conserved-by-execution
+ (implies
+ (and
+ (gem-statep st)
+ (gem-instruction-p instr (mem st)))
+ (gem-instruction-p instr (mem (execute-instruction st))))
+ :hints (("Goal"
+ :in-theory '((:definition gem-instruction-p))
+ :use
+ (
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-gemstate
+ (anycell (par1 instr)))
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-gemstate
+ (anycell (par2 instr)))
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-gemstate
+ (anycell (par3 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par1 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par2 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par3 instr)))))))
+
+
+
+(defthm a-gem-instruction-list-is-such-after-execute-instruction
+ (implies
+ (and
+ (gem-statep st)
+ (gem-instruction-list-p instrlist (mem st)))
+ (gem-instruction-list-p instrlist (mem (execute-instruction st))))
+ :hints (("Goal"
+ :induct (gem-instruction-list-p instrlist (mem st)) ;(len instrlist)
+ :in-theory (disable execute-instruction))
+ ("Subgoal *1/3" :use (:instance gem-instruction-list-p (instlist instrlist) (mem (mem st))))
+ ("Subgoal *1/2"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition gem-instruction-list-p)))
+ :use (:instance any-gem-instruction-is-conserved-by-execution (instr (car instrlist))))))
+
+
+
+
+(defthm execute-gem-retrieves-a-memory
+ (implies
+ (and
+ (gem-statep st)
+ (gem-instruction-p (nth (pcc st) (code st)) (mem st)))
+ (and
+ (bounded-amem-p (mem (execute-instruction st)))
+ (is-typed-amem-p (mem (execute-instruction st)))))
+ :hints (("Goal"
+ :in-theory (disable is-mem-cell-p sum-and-update-norest sub-and-update-norest gen-eq-update)
+ :use (
+ (:instance gen-eq-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sum-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sub-and-update-norest-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))))))
+
+
+
+(defthm executing-gem-instruction-retrieves-a-gem-state-from-gem-state
+ (implies
+ (gem-statep st)
+ (gem-statep (execute-instruction st)))
+ :hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-gem-program-is-null-or-gem-instruction)
+ ("Subgoal 1"
+ :use (
+ (:instance a-gem-instruction-list-is-such-after-execute-instruction (instrlist (code st)))
+ (:instance execute-gem-retrieves-a-memory))
+ :in-theory (disable sum-and-update-norest sub-and-update-norest gen-eq-update gem-instruction-p
+ par1 par2 par3 par4 member-equal nth))))
+
+
+
+
+
+(defthm executing-gem-instruction-preserves-correctness-wrt-arity
+ (implies
+ (and
+ (gem-statep st)
+ (correct-wrt-arity m (mem st)))
+ (correct-wrt-arity m (mem (execute-instruction st))))
+ :hints (("Goal" :in-theory (disable correct-type gemvar-0 var-type gem-statep pcc nth execute-instruction type-0))
+ ("Subgoal *1/3" :use (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var (cell (gemvar-0 m))))))
+
+
+
+
+
+(defthm executing-gem-instruction-keeps-vars-inclusion-right
+ (implies
+ (gem-statep st)
+ (iff (vars-inclusion m (mem st)) (vars-inclusion m (mem (execute-instruction st)))))
+ :hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-gem-program-is-null-or-gem-instruction)
+ ("Subgoal 1" :in-theory (disable par1 par2 par3 par4 sum-and-update-norest opcode code pcc member-equal nth)
+ :cases ( (equal (opcode (nth (pcc st) (code st))) 'gem-equ)
+ (equal (opcode (nth (pcc st) (code st))) 'gem-add)
+ (equal (opcode (nth (pcc st) (code st))) 'gem-sub)))
+ ("Subgoal 1.3" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition generic-eql)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-right
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (gen-eq-update
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))
+ ("Subgoal 1.2" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition gem-add)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-right
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (sum-and-update-norest
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))
+ ("Subgoal 1.1" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition gem-sub)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-right
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (sub-and-update-norest
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))))
+
+(defthm executing-gem-instruction-keeps-vars-inclusion-left
+ (implies
+ (gem-statep st)
+ (iff (vars-inclusion (mem st) m) (vars-inclusion (mem (execute-instruction st)) m)))
+ :hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (gem-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-gem-program-is-null-or-gem-instruction)
+ ("Subgoal 1" :in-theory (disable par1 par2 par3 par4 sum-and-update-norest opcode code pcc member-equal nth)
+ :cases ( (equal (opcode (nth (pcc st) (code st))) 'gem-equ)
+ (equal (opcode (nth (pcc st) (code st))) 'gem-add)
+ (equal (opcode (nth (pcc st) (code st))) 'gem-sub)))
+ ("Subgoal 1.3" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition generic-eql)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-left
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (gen-eq-update
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))
+ ("Subgoal 1.2" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition gem-add)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-left
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (sum-and-update-norest
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))
+ ("Subgoal 1.1" :in-theory '((:rewrite car-cons)
+ (:definition make-state)
+ (:definition mem)
+ (:definition gem-sub)
+ (:definition execute-instruction)
+ (:definition gem-instruction-p))
+ :use (:instance putting-an-existing-cell-does-not-change-var-inclusion-left
+ (mem (mem st))
+ (v (par1 (nth (pcc st) (code st))))
+ (anyvalue (sub-and-update-norest
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (mem st)))))))
+
+
+;;(ld "Properties-of-Execute-n-Rtm-Instructions-New.lisp" :ld-error-action :error)
+
+
+
+(defthm any-mem-cell-is-conserved-after-execute-instruction-on-rtmstate
+ (implies (and
+ (rtm-statep st)
+ (is-mem-cell-p (get-cell anycell (mem st))))
+ (is-mem-cell-p (get-cell anycell (mem (execute-instruction st)))))
+:hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (rtm-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-rtm-program-is-null-or-rtm-instruction)
+ ("Subgoal 1" :use (execute-instruction
+ (:instance gen-eq-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance or-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sum-and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (prime (par4 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sub-and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (prime (par4 (nth (pcc st) (code st))))
+ (mem (mem st))))
+ :in-theory (disable put-cell get-cell execute-instruction
+ sum-and-update sub-and-update and-update or-update gen-eq-update
+ par1 par2 par3 par4 member-equal nth gem-add gem-sub is-mem-cell-p))))
+
+
+(defthm any-rtm-instruction-is-conserved-by-execution
+ (implies
+ (and
+ (rtm-statep st)
+ (rtm-instruction-p instr (mem st)))
+ (rtm-instruction-p instr (mem (execute-instruction st))))
+ :hints (("Goal"
+ :in-theory '((:definition rtm-instruction-p))
+ :use
+ (
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-rtmstate
+ (anycell (par1 instr)))
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-rtmstate
+ (anycell (par2 instr)))
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-rtmstate
+ (anycell (par3 instr)))
+ (:instance any-mem-cell-is-conserved-after-execute-instruction-on-rtmstate
+ (anycell (par4 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par1 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par2 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par3 instr)))
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (par4 instr)))))))
+
+
+
+(defthm a-rtm-instruction-list-is-such-after-execute-instruction
+ (implies
+ (and
+ (rtm-statep st)
+ (rtm-instruction-list-p instrlist (mem st)))
+ (rtm-instruction-list-p instrlist (mem (execute-instruction st))))
+ :hints (("Goal"
+ :induct (rtm-instruction-list-p instrlist (mem st))
+ :in-theory (disable execute-instruction))
+ ("Subgoal *1/3" :use (:instance rtm-instruction-list-p (instlist instrlist) (mem (mem st))))
+ ("Subgoal *1/2"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition rtm-instruction-list-p)))
+ :use (:instance any-rtm-instruction-is-conserved-by-execution (instr (car instrlist))))))
+
+
+(defthm execute-rtm-retrieves-a-memory
+ (implies
+ (and
+ (rtm-statep st)
+ (rtm-instruction-p (nth (pcc st) (code st)) (mem st)))
+ (is-typed-amem-p (mem (execute-instruction st))))
+ :hints (("Goal"
+ :in-theory (disable is-mem-cell-p
+ and-update or-update gen-eq-update sum-and-update sub-and-update )
+ :use (
+ (:instance gen-eq-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance or-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sum-and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (prime (par4 (nth (pcc st) (code st))))
+ (mem (mem st)))
+ (:instance sub-and-update-returns-a-mem-cell
+ (c1 (par1 (nth (pcc st) (code st))))
+ (c2 (par2 (nth (pcc st) (code st))))
+ (c3 (par3 (nth (pcc st) (code st))))
+ (prime (par4 (nth (pcc st) (code st))))
+ (mem (mem st)))))))
+
+
+
+(defthm executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state
+ (implies
+ (rtm-statep st)
+ (rtm-statep (execute-instruction st)))
+ :hints (("Goal" :cases ( (null (nth (pcc st) (code st))) (rtm-instruction-p (nth (pcc st) (code st)) (mem st))))
+ ("Subgoal 3" :use an-instruction-of-rtm-program-is-null-or-rtm-instruction)
+ ("Subgoal 1"
+ :use (
+ (:instance a-rtm-instruction-list-is-such-after-execute-instruction (instrlist (code st)))
+ (:instance execute-rtm-retrieves-a-memory))
+ :in-theory (disable sum-and-update sub-and-update and-update or-update gen-eq-update
+ rtm-instruction-p
+ par1 par2 par3 par4 member-equal nth))))
+
+
+
+
+
+(defthm executing-rtm-instruction-is-attributes-invariant
+ (implies
+ (rtm-statep st)
+ (equal
+ (var-attributes vars (mem st))
+ (var-attributes vars (mem (execute-instruction st)))))
+ :hints (("Goal" :in-theory (disable par1 par2 par3 par4 member-equal nth))
+ ("Subgoal *1/2" :use (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var
+ (cell (car vars))))))
+
+
+
+(defthm executing-rtm-instruction-keeps-m-pointing-to-rtm-var-sets
+ (implies
+ (and
+ (rtm-statep st)
+ (m-entries-point-to-good-rtm-var-sets m (mem st)))
+ (m-entries-point-to-good-rtm-var-sets m (mem (execute-instruction st))))
+ :hints (("Goal" :in-theory (disable par1 par2 par3 par4 member-equal nth))
+ ("Subgoal *1/3" :use (:instance executing-rtm-instruction-is-attributes-invariant
+ (vars (rtmintvars-0 m))))))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(defun listpars1 (st n)
+ (if (zp n)
+ nil
+ (cons (par1 (nth (pcc st) (code st)))
+ (listpars1 (execute-instruction st) (1- n)))))
+
+(defun listpars2 (st n)
+ (if (zp n)
+ nil
+ (cons (par2 (nth (pcc st) (code st)))
+ (listpars2 (execute-instruction st) (1- n)))))
+
+(defun listpars3 (st n)
+ (if (zp n)
+ nil
+ (cons (par3 (nth (pcc st) (code st)))
+ (listpars3 (execute-instruction st) (1- n)))))
+
+(defun listpars4 (st n)
+ (if (zp n)
+ nil
+ (cons (par4 (nth (pcc st) (code st)))
+ (listpars4 (execute-instruction st) (1- n)))))
+
+
+
+
+(defthm lemma12-lp1r
+ (equal (cdr (listpars1 st n)) (listpars1 (execute-instruction st) (1- n)))
+:hints (("Goal" :in-theory (disable execute-instruction))))
+
+
+(defthm lemma12-lp2r
+ (equal (cdr (listpars2 st n)) (listpars2 (execute-instruction st) (1- n)))
+ :hints (("Goal" :in-theory (disable execute-instruction))))
+
+
+(defthm lemma12-lp3r
+ (equal (cdr (listpars3 st n)) (listpars3 (execute-instruction st) (1- n)))
+ :hints (("Goal" :in-theory (disable execute-instruction))))
+
+
+(defthm lemma12-lp4r
+ (equal (cdr (listpars4 st n)) (listpars4 (execute-instruction st) (1- n)))
+ :hints (("Goal" :in-theory (disable execute-instruction))))
+
+(defthm length-of-listpars1-n-is-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (listpars1 st n)) n))
+ :hints (("Goal" :in-theory (disable execute-instruction nth par1 pcc code member-equal))))
+
+(defthm length-of-listpars2-n-is-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (listpars2 st n)) n))
+ :hints (("Goal" :in-theory (disable execute-instruction nth par2 pcc code member-equal))))
+
+(defthm length-of-listpars3-n-is-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (listpars3 st n)) n))
+ :hints (("Goal" :in-theory (disable execute-instruction))))
+
+(defthm length-of-listpars4-n-is-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (listpars4 st n)) n))
+ :hints (("Goal" :in-theory (disable execute-instruction))))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(defthm only-par1-is-involved
+ (implies
+ (and
+ (or
+ (null (nth (pcc gstate) (code gstate)))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub))
+ (not (equal var (par1 (nth (pcc gstate) (code gstate))))) )
+ (equal (get-cell var (mem gstate)) (get-cell var (mem (execute-instruction gstate)))))
+ :hints (("Goal" :in-theory (disable sum-and-update sub-and-update gen-eq-update nth mod))))
+
+(defthm only-par1-is-involved-rtm
+ (implies
+ (and
+ (or
+ (null (nth (pcc gstate) (code gstate)))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'rtm-and)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'rtm-or)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'rtm-equ)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'rtm-add)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'rtm-sub))
+ (not (equal var (par1 (nth (pcc gstate) (code gstate))))) )
+ (equal (get-cell var (mem gstate)) (get-cell var (mem (execute-instruction gstate)))))
+ :hints (("Goal" :in-theory (disable sum-and-update sub-and-update gen-eq-update nth mod))))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(in-theory (enable build-values-by-rns))
+
+
+(in-theory (disable mod floor))
+
+
+
+
+
+(defun rtmintvars-i (gvar m) (cdr (assoc-equal gvar m)))
+
+(DEFUN TYPE-I (gvar M)
+ (COND ((AND (TRUE-LISTP (RTMINTVARS-I gvar M))
+ (EQUAL (LEN (RTMINTVARS-I gvar M)) 1))
+ 'BOOL)
+ ((AND (TRUE-LISTP (RTMINTVARS-I gvar M))
+ (EQUAL (LEN (RTMINTVARS-I gvar M))
+ (LEN *RNS*)))
+ 'INT)
+ (T 'WRONG-TYPING)))
+
+(defthm type-i-is-vartyper
+ (implies
+ (and
+ (assoc-equal gvar1 m)
+ (true-listp m)
+ (correct-wrt-arity m mem))
+ (equal (type-i gvar1 m) (var-type (get-cell gvar1 mem))))
+ :hints (("Goal" :in-theory (enable
+ var-type gemvar-0 rtmintvars-0 var-type type-i type-0))))
+
+(defthm type-i-is-type-expected
+ (implies
+ (and
+ (assoc-equal gvar m)
+ (true-listp m)
+ (correct-wrt-arity m mem))
+ (equal
+ (type-i gvar m)
+ (type-expected (rtmintvars-i gvar m)))))
+
+(defun pos-equal-0 (el l)
+ (cond
+ ( (endp l) 0 )
+ ( (equal el (caar l)) 0 )
+ (t (1+ (pos-equal-0 el (cdr l))))))
+
+(defthm assoc-means-pos-in-range
+ (implies (assoc-equal el l) (in-range (pos-equal-0 el l) l))
+ :rule-classes :forward-chaining)
+
+
+
+(defun retrieve-gemvars (m)
+ (if
+ (endp m)
+ nil
+ (cons (gemvar-0 m) (retrieve-gemvars (cdr m)))))
+
+
+(defthm retrieve-gemvars-same-len
+ (implies
+ (true-listp m)
+ (equal (len (retrieve-gemvars m)) (len m))))
+
+(defthm equal-nth-of-retrieve-car-of-nth
+ (equal (nth idx (retrieve-gemvars m)) (car (nth idx m)))
+ :hints (("Goal" :in-theory (enable gemvar-0))))
+
+
+(defthm no-duplicates-whose-caar-is-nth-idx-means-idx-is-0
+(IMPLIES (AND (NOT (ENDP L))
+ (EQUAL (CAR (NTH IDX L)) (CAAR L))
+ (TRUE-LISTP L)
+ (in-range idx l)
+ (NO-DUPLICATES-P (RETRIEVE-GEMVARS L)))
+ (EQUAL idx 0))
+:hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition in-range)
+ (:definition len)
+ (:rewrite equal-nth-of-retrieve-car-of-nth)))
+ :use
+ (
+ (:instance retrieve-gemvars-same-len (m l))
+ (:instance no-dup-3 (l (retrieve-gemvars l)) (idx2 0)))))
+:rule-classes nil)
+
+
+(defthm subgoal12
+(IMPLIES (AND (NOT (ENDP L))
+ (EQUAL (CAR (NTH IDX L)) (CAAR L))
+ (TRUE-LISTP L)
+ (< (POS-EQUAL-0 (CAR (NTH IDX L)) L)
+ (LEN L))
+ (INTEGERP IDX)
+ (<= 0 IDX)
+ (< IDX (LEN L))
+ (NO-DUPLICATES-P (RETRIEVE-GEMVARS L)))
+ (EQUAL (POS-EQUAL-0 (CAR (NTH IDX L)) L)
+ IDX))
+:hints (("Goal"
+ :use no-duplicates-whose-caar-is-nth-idx-means-idx-is-0)))
+
+
+(defthm no-duplicates-has-pos-equal-right-in-that-place
+ (implies
+ (and
+ (true-listp l)
+ (in-range idx l)
+ (no-duplicates-p (retrieve-gemvars l)))
+ (equal (pos-equal-0 (car (nth idx l)) l) idx))
+ :hints (("Goal" :in-theory (enable gemvar-0))
+ ("Subgoal *1/2" :use subgoal12)))
+
+
+
+
+
+(defthm rtmintvars-i-is-cdr-of-nth-entry
+ (equal (rtmintvars-i gvar m)
+ (cdr (nth (pos-equal-0 gvar m) m))))
+
+
+
+(defun type-i-idx (m idx)
+ (COND ((AND (TRUE-LISTP (cdr (nth idx m)))
+ (EQUAL (LEN (cdr (nth idx m))) 1))
+ 'BOOL)
+ ((AND (TRUE-LISTP (cdr (nth idx m)))
+ (EQUAL (LEN (cdr (nth idx m)))
+ (LEN *RNS*)))
+ 'INT)
+ (T 'WRONG-TYPING)))
+
+(defun listinstr (st n)
+ (if (zp n)
+ nil
+ (cons (nth (pcc st) (code st))
+ (listinstr (execute-instruction st) (1- n)))))
+
+(defthm inclusion-trans
+ (implies
+ (and
+ (vars-inclusion m1 m2)
+ (assoc-equal v m1))
+ (assoc-equal v m2)))
+
+(defthm correct-wrt-arity-has-rtmintvars-i-tl
+ (implies
+ (correct-wrt-arity m mem)
+ (true-listp (rtmintvars-i gvar1 m)))
+ :hints (("Goal" :in-theory (enable correct-wrt-arity type-0 gemvar-0 rtmintvars-0 correct-type))))
+
+(defun rtm-eq-and (v1 v2 tmp res)
+(list
+ (list 'rtm-equ tmp v1 v2)
+ (list 'rtm-and res tmp res)))
+
+(defun rtm-eq-or (v1 v2 tmp res)
+(list
+ (list 'rtm-equ tmp v1 v2)
+ (list 'rtm-or res tmp tmp)))
+
+(defun equality-trans2 (listvars1 listvars2 tmp res)
+ (if (endp listvars1)
+ nil
+ (append
+ (rtm-eq-and (car listvars1) (car listvars2) tmp res)
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res))))
+
+(defun equality-trans3 (listvars1 listvars2 tmp res)
+ (append
+ (rtm-eq-or (car listvars1) (car listvars2) tmp res)
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res)))
+
+(defun all-rtm-adds-for-n-steps (st n)
+ (declare (xargs :measure (acl2-count n)))
+ (if (zp n)
+ t
+ (and
+ (equal (opcode (nth (pcc st) (code st))) 'rtm-add)
+ (all-rtm-adds-for-n-steps (execute-instruction st) (1- n)))))
+
+(defun all-rtm-subs-for-n-steps (st n)
+ (declare (xargs :measure (acl2-count n)))
+ (if (zp n)
+ t
+ (and
+ (equal (opcode (nth (pcc st) (code st))) 'rtm-sub)
+ (all-rtm-subs-for-n-steps (execute-instruction st) (1- n)))))
+
+
+(defun good-translation-gem-rtm (gstate rstate m)
+ (declare (xargs :measure (acl2-count (- (len (code gstate)) (pcc gstate)))))
+ (if
+ (or (not (integerp (pcc gstate)))
+ (< (pcc gstate) 0)
+ (>= (pcc gstate) (len (code gstate))))
+ (>= (pcc rstate) (len (code rstate)))
+ (case (opcode (nth (pcc gstate) (code gstate)))
+ (gem-equ
+ (and
+ (in-range (pcc rstate) (code rstate))
+ (equal (listinstr rstate (* 2 (len *rns*)) )
+ (equality-trans3
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))
+ 'tmp
+ (car (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m))))
+ (not (equal
+ (par1 (nth (pcc gstate) (code gstate)))
+ (par2 (nth (pcc gstate) (code gstate)))))
+ (not (equal
+ (par1 (nth (pcc gstate) (code gstate)))
+ (par3 (nth (pcc gstate) (code gstate)))))
+ (good-translation-gem-rtm
+ (execute-instruction gstate )
+ (execute-n-instructions rstate (* 2 (len *rns*)) )
+ m)))
+ (gem-add
+ (and
+ (in-range (pcc rstate) (code rstate))
+ (all-rtm-adds-for-n-steps rstate (len *rns*) )
+ (equal (listpars1 rstate (len *rns*) )
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m))
+ (equal (listpars2 rstate (len *rns*) )
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))) ;new
+ (equal (listpars3 rstate (len *rns*) )
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))) ;new
+ (equal (listpars4 rstate (len *rns*) ) *rns*)
+ (good-translation-gem-rtm
+ (execute-instruction gstate )
+ (execute-n-instructions rstate (len *rns*) )
+ m)))
+ (gem-sub ;;;gem-add
+ (and
+ (in-range (pcc rstate) (code rstate))
+ (all-rtm-subs-for-n-steps rstate (len *rns*) )
+ (equal (listpars1 rstate (len *rns*) )
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m))
+ (equal (listpars2 rstate (len *rns*) )
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))) ;new
+ (equal (listpars3 rstate (len *rns*) )
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))) ;new
+ (equal (listpars4 rstate (len *rns*) ) *rns*)
+ (good-translation-gem-rtm
+ (execute-instruction gstate )
+ (execute-n-instructions rstate (len *rns*) )
+ m)))
+ (otherwise nil))))
+
+
+
+
+
+(defun equal-get-cells (lcell mem1 mem2)
+ (if (endp lcell)
+ (null lcell)
+ (and
+ (equal (get-cell (car lcell) mem1) (get-cell (car lcell) mem2))
+ (equal-get-cells (cdr lcell) mem1 mem2))))
+
+(defthm equal-get-cells-implies-equal-parts-of-cells
+ (implies
+ (equal-get-cells lcell mem1 mem2)
+ (and
+ (equal
+ (var-attributes lcell mem1)
+ (var-attributes lcell mem2))
+ (equal
+ (var-values lcell mem1)
+ (var-values lcell mem2)))))
+
+
+(defthm equal-get-cells-implies-equal-values-and-attributes-still-works
+ (implies
+ (equal-get-cells lcell mem1 mem2)
+ (iff
+ (equal-values-and-attributes gemcell lcell mem1 type)
+ (equal-values-and-attributes gemcell lcell mem2 type))))
+
+
+(defun idx-different-cell (l mem1 mem2)
+ (cond
+ ( (endp l) 0)
+ ( (not (equal (get-cell (car l) mem1) (get-cell (car l) mem2))) 0 )
+ (t (1+ (idx-different-cell (cdr l) mem1 mem2)))))
+
+
+
+(defthm if-bad-index-in-range-then-cells-must-be-different
+ (implies
+ (in-range (idx-different-cell l mem1 mem2) l)
+ (not (equal
+ (get-cell (nth (idx-different-cell l mem1 mem2) l) mem1)
+ (get-cell (nth (idx-different-cell l mem1 mem2) l) mem2))))
+ :rule-classes :forward-chaining)
+
+
+(defthm if-bad-index-not-in-range-then-every-equal
+ (implies (and (true-listp l)
+ (not (in-range (idx-different-cell l mem1 mem2) l)))
+ (equal-get-cells l mem1 mem2)))
+
+
+
+
+
+
+(in-theory (enable gemvar-0 rtmintvars-0))
+
+(defthm m-correspondent-values-implies-equal-values-and-attribus
+ (implies
+ (and
+ (true-listp m)
+ (m-correspondent-values-p m memgstate memrstate)
+ (assoc-equal gvar1 m))
+ (equal-values-and-attributes
+ (get-cell gvar1 memgstate)
+ (rtmintvars-i gvar1 m)
+ memrstate
+ (type-i gvar1 m)))
+:hints (("Goal" :in-theory (disable equal-values-and-attributes))))
+
+(in-theory (disable gemvar-0 rtmintvars-0))
+
+
+(defun retrieve-rtmvars (m)
+ (if (endp m)
+ nil
+ (cons (cdr (car m))
+ (retrieve-rtmvars (cdr m)))))
+
+
+(defthm rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (equal (rtmintvars-i gvar m)
+ (nth (pos-equal-0 gvar m) (retrieve-rtmvars m))))
+
+
+(defthm lemma-help2
+ (implies
+ (true-listp m)
+ (equal (len m) (len (retrieve-rtmvars m))))
+ :rule-classes nil)
+
+(defthm lemma-help3
+ (implies
+ (true-listp m)
+ (iff (in-range idx m) (in-range idx (retrieve-rtmvars m))))
+ :hints (("Goal" :use lemma-help2))
+ :rule-classes nil)
+
+(defthm lemma-help4
+ (implies
+ (and
+ (assoc-equal gvar1 m)
+ (not (equal gvar1 gvar2)))
+ (not (equal (pos-equal-0 gvar1 m) (pos-equal-0 gvar2 m)))))
+
+(defthm lemma1-different-vars-do-not-belong
+ (implies
+ (and
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (assoc-equal gvar2 m)
+ (not (equal gvar1 gvar2))
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (not (member-equal-bool (nth idx1 (rtmintvars-i gvar1 m))
+ (rtmintvars-i gvar2 m))))
+ :hints (("Goal"
+ :in-theory '((:type-prescription retrieve-rtmvars)
+ (:definition in-range)
+ (:rewrite in-range-is-member-eq-bool))
+ :use (
+ lemma-help4
+ (:instance lemma-help3 (idx (pos-equal-0 gvar1 m)))
+ (:instance lemma-help3 (idx (pos-equal-0 gvar2 m)))
+ (:instance generalized-disjunctivity-unordered-2
+ (el1 (nth idx1 (nth (pos-equal-0 gvar1 m) (retrieve-rtmvars m))))
+ (ll (retrieve-rtmvars m))
+ (idx1 (pos-equal-0 gvar1 m))
+ (idx2 (pos-equal-0 gvar2 m)))
+ (:instance assoc-means-pos-in-range (el gvar1) (l m))
+ (:instance assoc-means-pos-in-range (el gvar2) (l m))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars (gvar gvar1))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars (gvar gvar2))))))
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-non-interessata
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))))
+ (equal
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (get-cell gvar1 (mem gstate))))
+ :hints (("Goal" :use (:instance only-par1-is-involved (var gvar1)))))
+
+
+(defun bad-idx-eqv-va (m gem-mem rtm-mem)
+ (cond
+ ( (endp m)
+ 0 )
+ ( (not (equal-values-and-attributes
+ (get-cell (gemvar-0 m) gem-mem)
+ (rtmintvars-0 m)
+ rtm-mem
+ (type-0 m)))
+ 0 )
+ (t (1+ (bad-idx-eqv-va (cdr m) gem-mem rtm-mem)))))
+
+(defthm if-bad-index-in-range-thne-must-be-different-mc
+ (implies
+ (in-range (bad-idx-eqv-va m gem-mem rtm-mem) m)
+ (not (m-correspondent-values-p m gem-mem rtm-mem)))
+ :hints (("Goal" :in-theory (enable gemvar-0))))
+
+(defthm if-bad-index-in-range-thne-must-be-different-vs
+ (implies
+ (in-range (bad-idx-eqv-va m gem-mem rtm-mem) m)
+ (not
+ (equal-values-and-attributes
+ (get-cell (car (nth (bad-idx-eqv-va m gem-mem rtm-mem) m)) gem-mem)
+ (cdr (nth (bad-idx-eqv-va m gem-mem rtm-mem) m))
+ rtm-mem
+ (type-i-idx m (bad-idx-eqv-va m gem-mem rtm-mem)))))
+ :hints (("Goal" :in-theory (e/d (type-0 gemvar-0 rtmintvars-0)
+ (var-attribute var-attributes apply-direct-rns-to-value-according-to-type
+ var-values-of-1-variable-is-one-element-list-of-var-value
+ var-values equal-values
+ )))))
+
+
+(defthm if-bad-index-not-in-range-then-m-corr
+ (implies
+ (and
+ (true-listp m)
+ (not (in-range (bad-idx-eqv-va m gem-mem rtm-mem) m)))
+ (m-correspondent-values-p m gem-mem rtm-mem))
+ :hints (("Goal" :in-theory (e/d (gemvar-0)
+ ((:type-prescription retrieve-rtmvars)
+ retrieve-rtmvars)))))
+
+(defthm execute-n-instructions-keeps-rtm-state-and-points-to-good
+ (implies
+ (and
+ (rtm-statep st)
+ (m-entries-point-to-good-rtm-var-sets m (mem st)))
+ (and
+ (rtm-statep (execute-n-instructions st n))
+ (m-entries-point-to-good-rtm-var-sets m (mem (execute-n-instructions st n)))))
+ :hints (("Goal" :induct (execute-n-instructions st n) )
+ ("Subgoal *1/2"
+ :in-theory '((:definition execute-n-instructions)
+ (:rewrite executing-rtm-instruction-keeps-m-pointing-to-rtm-var-sets)
+ (:rewrite executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state)))))
+
+
+;;(ld "Proof-Of-Plus.lisp" :ld-error-action :error)
+
+(in-theory (enable
+ (:executable-counterpart build-values-by-rns)
+ (:type-prescription build-values-by-rns)
+ (:induction build-values-by-rns)
+ (:definition build-values-by-rns)
+ posp-all posp mod mod-+-exp mod-prod-makes-same-residues))
+
+(in-theory (disable mod floor))
+
+(defun sum-list (vl2 vl3 rns)
+ (if (endp vl2)
+ nil
+ (cons (mod (+ (car vl2) (car vl3)) (car rns))
+ (sum-list (cdr vl2) (cdr vl3) (cdr rns)))))
+
+(defthm sum-correspondence-by-put-list
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (posp-all rns))
+ (equal (build-values-by-rns (+ gval1 gval2) rns)
+ (sum-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns)))
+ :hints (("Goal" :induct t)))
+
+
+
+
+(defthm sum-correspondence-by-put-list-2-fin
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (posp-all rns))
+ (equal (build-values-by-rns (mod (+ gval1 gval2) (prod rns)) rns)
+ (sum-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns))))
+
+(in-theory (disable mod-prod-makes-same-residues))
+
+
+
+(in-theory (disable mod floor mod-+-exp mod-prod-makes-same-residues))
+
+
+
+
+
+
+
+(defthm sum-correspondence-by-put-list-h
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (integer>1-listp rns))
+ (equal (build-values-by-rns (mod (+ gval1 gval2) (prod rns)) rns)
+ (sum-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns)))
+ :hints (("Goal" :use (sum-correspondence-by-put-list-2-fin greater-one-means-greater-zero))))
+
+
+
+(defthm a-boolean-has-same-rnss-than-list-of-itself
+ (implies
+ (and
+ (integerp val)
+ (or (equal val 0) (equal val 1))
+ (integer>1-listp rns))
+ (equal
+ (build-values-by-rns val rns)
+ (make-n-list val (len rns))))
+ :hints (("Goal" :in-theory (enable mod-x-y-=-x-exp))))
+
+
+
+
+(defthm sum-correspondence-by-put-list-on-boolean
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (or (equal gval2 0) (equal gval2 1))
+ (integer>1-listp rns))
+ (equal (build-values-by-rns (mod (+ gval1 gval2) (prod rns)) rns)
+ (sum-list
+ (build-values-by-rns gval1 rns)
+ (make-n-list gval2 (len rns))
+ rns)))
+ :hints (("Goal" :in-theory nil
+ :use (sum-correspondence-by-put-list-h
+ (:instance a-boolean-has-same-rnss-than-list-of-itself (val gval2))))))
+
+
+
+(defun equal-sum-and-updates (reslist par1list par2list par3list primelist mem memafterputs)
+ (if (endp reslist)
+ (null reslist)
+ (and
+ (equal
+ (get-cell (car reslist) memafterputs)
+ (sum-and-update
+ (car par1list)
+ (car par2list)
+ (car par3list)
+ (car primelist)
+ mem))
+ (equal-sum-and-updates
+ (cdr reslist)
+ (cdr par1list)
+ (cdr par2list)
+ (cdr par3list)
+ (cdr primelist)
+ mem
+ memafterputs))))
+
+
+
+
+
+(defthm equal-sum-and-updates-have-same-attributes
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns rtmmem rtmmemafter))
+ (equal (var-attributes rtmvarsres rtmmemafter) (var-attributes rtmvars1 rtmmem))))
+
+(in-theory (enable sum-list))
+
+(defthm equal-sum-and-updates-have-values-that-are-sum-lists
+ (implies
+ (and
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len rtmvars2) (len rtmvarsres))
+ (equal (len rtmvars3) (len rtmvarsres))
+ (equal-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns rtmmem rtmmemafter))
+ (equal (var-values rtmvarsres rtmmemafter)
+ (sum-list
+ (var-values rtmvars2 rtmmem)
+ (var-values rtmvars3 rtmmem)
+ rns)))
+ :hints ( ("Subgoal *1/2" :in-theory (enable var-value get-cell make-cell))))
+
+
+
+
+
+(defthm behaviour-of-sum-and-update-norest
+ (and
+ (equal
+ (var-attribute (sum-and-update-norest c1 c2 c3 mem))
+ (var-attribute (get-cell c1 mem)))
+ (equal
+ (var-value (sum-and-update-norest c1 c2 c3 mem))
+ (mod
+ (+
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem)))
+ (prod *rns*)))
+ (equal
+ (var-type (sum-and-update-norest c1 c2 c3 mem))
+ (var-type (get-cell c1 mem))))
+ :hints (("Goal" :in-theory (enable var-type var-value var-attribute make-cell))))
+
+
+
+
+(defthm defexpansion
+ (implies
+ (not (null (var-value gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Int)
+ (and
+ (equal-values (var-values rtmvars rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements (var-attribute gcell)
+ (var-attributes rtmvars rtmmem)))))
+ :hints (("Goal" :in-theory '((:definition equal-values-and-attributes)
+ (:definition apply-direct-rns-to-value-according-to-type))
+ :use (:instance build-values-by-rns-extended-behaves-standardly-on-non-nils
+ (gem-value (var-value gcell))
+ (rns *rns*)))))
+
+
+(defthm if-gem-is-sum-and-update-inf-every-rtm-var-is-sum-and-update-then-equal-values-is-kept
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len rtmvars2) (len rtmvarsres))
+ (equal (len rtmvars3) (len rtmvarsres))
+ (not (null (var-value (get-cell gvar1 gemmem))))
+ (integerp (var-value (get-cell gvar2 gemmem)))
+ (integerp (var-value (get-cell gvar3 gemmem)))
+ (equal-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 *rns* rtmmem rtmmemafter)
+ (equal-values-and-attributes (get-cell gvar1 gemmem) rtmvars1 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar2 gemmem) rtmvars2 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar3 gemmem) rtmvars3 rtmmem 'Int))
+ (equal-values-and-attributes
+ (sum-and-update-norest gvar1 gvar2 gvar3 gemmem)
+ rtmvarsres
+ rtmmemafter
+ 'Int))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '(
+ (:definition integer>1-listp)
+ (:definition equal-values)
+ (:rewrite defexpansion)))
+ :use (
+ (:instance greater-one-means-greater-zero (rns *rns*))
+ (:instance equal-sum-and-updates-have-values-that-are-sum-lists (rns *rns*))
+ (:instance equal-sum-and-updates-have-same-attributes (rns *rns*))
+ (:instance sum-correspondence-by-put-list-h
+ (gval1 (var-value (get-cell gvar2 gemmem)))
+ (gval2 (var-value (get-cell gvar3 gemmem)))
+ (rns *rns*))
+ (:instance behaviour-of-sum-and-update-norest
+ (c1 gvar1)
+ (c2 gvar2)
+ (c3 gvar3)
+ (mem gemmem)))))
+ )
+
+
+
+
+
+
+
+(defthm if-a-var-value-is-same-then-var-values-are-list-of
+ (implies
+ (equal (var-value (get-cell (car rtmvars) rtmmem)) (var-value gcell))
+ (equal-values (var-values (make-n-list (car rtmvars) (len rns)) rtmmem)
+ (make-n-list (var-value gcell) (len rns)))))
+
+(defthm if-a-var-attribute-is-same-then-var-attributes-are-list-of
+ (implies
+ (equal (var-attribute (get-cell (car rtmvars) rtmmem)) (var-attribute gcell))
+ (equal-elements
+ (var-attribute gcell)
+ (var-attributes (make-n-list (car rtmvars) (len rns)) rtmmem))))
+
+
+
+(defthm defexpansion-bool-values
+ (implies
+ (or (equal (var-value gcell) 0)
+ (equal (var-value gcell) 1))
+ (implies
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Bool)
+ (equal-values (var-values (make-n-list (car rtmvars) (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))))
+ :hints (("Goal" :use ( (:instance if-a-var-value-is-same-then-var-values-are-list-of
+ (rns *rns*))))))
+
+
+
+
+(defthm equal-values-on-list-entails-equality-on-first-els
+ (implies
+ (and
+ (integerp n)
+ (> n 0)
+ (equal-values (var-values (make-n-list el n) mem)
+ (make-n-list val n)))
+ (equal-values (var-values (list el) mem)
+ (list val)))
+ :hints (("Subgoal *1/3'" :use ( (:instance make-n-list (el el) (n 1))
+ (:instance make-n-list (el val) (n 1)) ))))
+
+
+(defthm cell-types
+ (implies
+ (is-mem-cell-p gcell)
+ (or
+ (equal (var-type gcell) 'Bool)
+ (equal (var-type gcell) 'Int)))
+ :hints (("Goal" :in-theory (enable my-or-2)))
+ :rule-classes nil)
+
+(defthm bool-cell
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Bool))
+ (and
+ (integerp (var-value gcell))
+ (or (equal (var-value gcell) 0)
+ (equal (var-value gcell) 1))))
+ :rule-classes nil)
+
+(defthm int-cell
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Int))
+ (integerp (var-value gcell)))
+ :rule-classes nil)
+
+
+(defthm defexpansion-bool-values-inv
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Bool)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (implies
+ (equal-values (var-values (eventually-make-list rtmvars (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-values
+ (var-values rtmvars rtmmem)
+ (apply-direct-rns-to-value-according-to-type gcell (var-type gcell)))))
+ :hints (("Goal" :use (bool-cell
+ (:instance equal-values-on-list-entails-equality-on-first-els
+ (mem rtmmem)
+ (n (len *rns*))
+ (el (car rtmvars))
+ (val (var-value gcell)))
+ (:instance a-boolean-has-same-rnss-than-list-of-itself
+ (val (var-value gcell)) (rns *rns*))))))
+
+
+
+
+(defthm defexpansion-bool-attrs-1
+ (implies
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Bool)
+ (equal (var-attribute (get-cell (car rtmvars) rtmmem)) (var-attribute gcell))))
+
+
+(defthm defexpansion-bool-attrs
+ (implies
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Bool)
+ (equal-elements
+ (var-attribute gcell)
+ (var-attributes (make-n-list (car rtmvars) (len *rns*)) rtmmem)))
+ :hints (("Goal" :use ( defexpansion-bool-attrs-1
+ (:instance if-a-var-attribute-is-same-then-var-attributes-are-list-of
+ (rns *rns*))))))
+
+
+(defthm defexpansion-bool-attrs-inv-1
+ (implies
+ (equal (type-expected rtmvars) 'Bool)
+ (equal
+ (var-attributes rtmvars rtmmem)
+ (list (var-attribute (get-cell (car rtmvars) rtmmem)))))
+ :hints (("Subgoal 1'" :use (:theorem (implies
+ (and (true-listp rtmvars2)
+ (equal (+ 1 (len rtmvars2)) 1))
+ (endp rtmvars2)))))
+ :otf-flg t)
+
+(defthm defexpansion-bool-attrs-inv-2
+ (implies
+ (and
+ (equal (type-expected rtmvars) 'Bool)
+ (equal val (var-attribute (get-cell (car rtmvars) rtmmem))))
+ (equal-elements val (var-attributes rtmvars rtmmem))))
+
+
+(defthm defexpansion-bool-attrs-inv-3
+ (implies
+ (and
+ (integerp n)
+ (> n 0))
+ (implies
+ (equal-elements
+ val
+ (var-attributes (make-n-list car-rtmvars n) rtmmem))
+ (equal
+ val
+ (var-attribute (get-cell car-rtmvars rtmmem)))))
+ :hints (("Subgoal *1/3'" :use (:instance make-n-list (el car-rtmvars) (n 1))))
+ :rule-classes nil)
+
+
+(defthm defexpansion-bool-attrs-inv
+ (implies
+ (and
+ (equal (var-type gcell) 'Bool)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (implies
+ (equal-elements
+ (var-attribute gcell)
+ (var-attributes (make-n-list (car rtmvars) (len *rns*)) rtmmem))
+ (equal-elements
+ (var-attribute gcell)
+ (var-attributes rtmvars rtmmem))))
+ :hints (("Goal" :use
+ ( defexpansion-bool-attrs-inv-1
+ defexpansion-bool-attrs-inv-2
+ (:instance defexpansion-bool-attrs-inv-3
+ (n (len *rns*))
+ (car-rtmvars (car rtmvars))
+ (val (var-attribute gcell)))))))
+
+(defthm defexpansion-bool
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Bool)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Bool)
+ (and
+ (equal-values (var-values (make-n-list (car rtmvars) (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements
+ (var-attribute gcell)
+ (var-attributes (make-n-list (car rtmvars) (len *rns*)) rtmmem)))))
+ :hints (("Goal" :use
+ ( bool-cell
+ defexpansion-bool-attrs
+ defexpansion-bool-values
+ defexpansion-bool-attrs-inv
+ defexpansion-bool-values-inv))))
+
+
+
+
+
+(defthm defexpansion-generic-bool
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Bool)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem (var-type gcell))
+ (and
+ (equal-values (var-values (eventually-make-list rtmvars (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements (var-attribute gcell)
+ (var-attributes (eventually-make-list rtmvars (len *rns*)) rtmmem)))))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition type-expected)
+ (:definition eventually-make-list)))
+ :use (defexpansion-bool bool-cell))))
+
+(defthm defexpansion-generic-int
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (var-type gcell) 'Int)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem (var-type gcell))
+ (and
+ (equal-values (var-values (eventually-make-list rtmvars (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements (var-attribute gcell)
+ (var-attributes (eventually-make-list rtmvars (len *rns*)) rtmmem)))))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition type-expected)
+ (:definition eventually-make-list)))
+ :use (defexpansion int-cell))))
+
+
+
+
+(defthm defexpansion-generic
+ (implies
+ (and
+ (is-mem-cell-p gcell)
+ (equal (type-expected rtmvars) (var-type gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem (var-type gcell))
+ (and
+ (equal-values (var-values (eventually-make-list rtmvars (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements (var-attribute gcell)
+ (var-attributes (eventually-make-list rtmvars (len *rns*)) rtmmem)))))
+ :hints (("Goal"
+ :cases ( (equal (var-type gcell) 'Bool)
+ (equal (var-type gcell) 'Int) ))
+ ("Subgoal 3" :use cell-types)
+ ("Subgoal 2" :use defexpansion-generic-bool)
+ ("Subgoal 1" :use defexpansion-generic-int)))
+
+
+
+
+
+
+(defthm if-gem-is-sum-and-update-inf-every-rtm-var-is-sum-and-update-then-equal-values-is-kept-g
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len (eventually-make-list rtmvars2 (len *rns*))) (len rtmvarsres))
+ (equal (len (eventually-make-list rtmvars3 (len *rns*))) (len rtmvarsres))
+ (equal (var-type (get-cell gvar2 gemmem)) (type-expected rtmvars2))
+ (equal (var-type (get-cell gvar3 gemmem)) (type-expected rtmvars3))
+ (is-mem-cell-p (get-cell gvar1 gemmem))
+ (equal (var-type (get-cell gvar1 gemmem)) 'Int)
+ (is-mem-cell-p (get-cell gvar2 gemmem))
+ (is-mem-cell-p (get-cell gvar3 gemmem))
+ (equal-sum-and-updates
+ rtmvarsres
+ rtmvars1
+ (eventually-make-list rtmvars2 (len *rns*))
+ (eventually-make-list rtmvars3 (len *rns*))
+ *rns* rtmmem rtmmemafter)
+ (equal-values-and-attributes (get-cell gvar1 gemmem) rtmvars1 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar2 gemmem) rtmvars2 rtmmem (var-type (get-cell gvar2 gemmem)))
+ (equal-values-and-attributes (get-cell gvar3 gemmem) rtmvars3 rtmmem (var-type (get-cell gvar3 gemmem))))
+ (equal-values-and-attributes
+ (sum-and-update-norest gvar1 gvar2 gvar3 gemmem)
+ rtmvarsres
+ rtmmemafter
+ 'Int))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition integer>1-listp)
+ (:definition equal-values)
+ (:definition is-mem-cell-p)
+ (:rewrite defexpansion)))
+ :use (
+ (:instance defexpansion-generic
+ (gcell (get-cell gvar2 gemmem))
+ (rtmvars rtmvars2))
+ (:instance defexpansion-generic
+ (gcell (get-cell gvar3 gemmem))
+ (rtmvars rtmvars3))
+ (:instance equal-sum-and-updates-have-values-that-are-sum-lists
+ (rtmvars2 (eventually-make-list rtmvars2 (len *rns*)))
+ (rtmvars3 (eventually-make-list rtmvars3 (len *rns*)))
+ (rns *rns*))
+ (:instance equal-sum-and-updates-have-same-attributes
+ (rtmvars2 (eventually-make-list rtmvars2 (len *rns*)))
+ (rtmvars3 (eventually-make-list rtmvars3 (len *rns*)))
+ (rns *rns*))
+ (:instance sum-correspondence-by-put-list-h
+ (gval1 (var-value (get-cell gvar2 gemmem)))
+ (gval2 (var-value (get-cell gvar3 gemmem)))
+ (rns *rns*))
+ (:instance behaviour-of-sum-and-update-norest
+ (c1 gvar1)
+ (c2 gvar2)
+ (c3 gvar3)
+ (mem gemmem))))))
+
+
+
+
+
+(in-theory (disable sum-list sum-correspondence-by-put-list
+ equal-sum-and-updates-have-same-attributes
+ equal-sum-and-updates-have-values-that-are-sum-lists
+ behaviour-of-sum-and-update-norest
+ defexpansion
+ if-a-var-value-is-same-then-var-values-are-list-of
+ if-a-var-attribute-is-same-then-var-attributes-are-list-of
+ defexpansion-generic-bool
+ defexpansion-generic-int
+ defexpansion-generic
+ defexpansion-bool-values-inv
+ defexpansion-bool-values
+ defexpansion-bool-attrs-inv
+ defexpansion-bool-attrs-inv-1
+ defexpansion-bool-attrs-inv-2
+ defexpansion-bool-attrs
+ defexpansion-bool-attrs-1
+ equal-values-on-list-entails-equality-on-first-els
+ ))
+
+
+
+
+
+(defun execute-n-rtm-adds (st n)
+ (if
+ (zp n)
+ st
+ (execute-n-rtm-adds
+ (rtm-add
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (par4 (nth (pcc st) (code st)))
+ st)
+ (1- n))))
+
+
+(defthm all-rtm-adds-means-only-adds-are-executed
+ (implies
+ (all-rtm-adds-for-n-steps st n)
+ (equal
+ (execute-n-rtm-adds st n)
+ (execute-n-instructions st n)))
+ :hints (("Goal" :in-theory (disable rtm-add member-equal nth par1 par2 par3))))
+
+
+(defun adds-list-n (l1 l2 l3 l4 mem n)
+ (if (zp n)
+ mem
+ (adds-list-n (cdr l1) (cdr l2) (cdr l3) (cdr l4)
+ (put-cell
+ (car l1)
+ (sum-and-update
+ (car l1)
+ (car l2)
+ (car l3)
+ (car l4)
+ mem)
+ mem)
+ (1- n))))
+
+
+
+
+
+
+
+(in-theory (disable member-equal))
+
+
+(in-theory (enable make-cell))
+
+
+
+(defthm execute-n-rtm-adds-tantamount-to-add-list-n
+ (implies
+ (and
+ (all-rtm-adds-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st))
+ (equal
+ (mem (execute-n-rtm-adds st n))
+ (adds-list-n
+ (listpars1 st n)
+ (listpars2 st n)
+ (listpars3 st n)
+ (listpars4 st n)
+ (mem st)
+ n)))
+ :hints
+ (("Goal" :induct t )
+ ("Subgoal *1/2.2" :in-theory '((:definition all-rtm-adds-for-n-steps)
+ (:definition execute-instruction)
+ (:definition rtm-add)
+ (:definition make-state)
+ (:definition mem))
+ )
+ ("Subgoal *1/2"
+ :use ( execute-n-rtm-adds
+ (:instance adds-list-n
+ (l1 (listpars1 st n))
+ (l2 (listpars2 st n))
+ (l3 (listpars3 st n))
+ (l4 (listpars4 st n))
+ (mem (mem st)))
+ lemma12-lp1r lemma12-lp2r lemma12-lp3r lemma12-lp4r
+ (:theorem
+ (IMPLIES (AND (ALL-RTM-ADDS-FOR-N-STEPS ST N)
+ (>= (pcc st) 0)
+ (not (zp n)))
+ (equal (mem (execute-instruction st))
+ (PUT-CELL (CAR (LISTPARS1 ST N))
+ (SUM-AND-UPDATE (CAR (LISTPARS1 ST N))
+ (CAR (LISTPARS2 ST N))
+ (CAR (LISTPARS3 ST N))
+ (CAR (LISTPARS4 ST N))
+ (MEM ST))
+ (MEM ST)))))
+ executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state
+ instruction-incrementing-pvv))))
+
+
+(in-theory (disable lemma12-lp1r lemma12-lp2r lemma12-lp3r lemma12-lp4r ))
+
+
+
+
+
+
+
+
+
+
+(defun adds-list-e (c1 c2 c3 c4 mem)
+ (if
+ (endp c1)
+ mem
+ (adds-list-e
+ (cdr c1)
+ (cdr c2)
+ (cdr c3)
+ (cdr c4)
+ (put-cell (car c1) (sum-and-update (car c1) (car c2) (car c3) (car c4) mem) mem))))
+
+
+
+(defthm adds-list-e-is-adds-list-n
+ (equal (adds-list-e c1 c2 c3 c4 mem) (adds-list-n c1 c2 c3 c4 mem (len c1)))
+ :rule-classes nil)
+
+
+
+(defthm execute-n-instructions-tantamount-to-add-list-e
+ (implies
+ (and
+ (integerp n)
+ (>= n 0)
+ (all-rtm-adds-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st))
+ (equal
+ (mem (execute-n-instructions st n))
+ (adds-list-e
+ (listpars1 st n)
+ (listpars2 st n)
+ (listpars3 st n)
+ (listpars4 st n)
+ (mem st))))
+ :hints (("Goal" :in-theory nil
+ :use ((:instance adds-list-e-is-adds-list-n
+ (c1 (listpars1 st n))
+ (c2 (listpars2 st n))
+ (c3 (listpars3 st n))
+ (c4 (listpars4 st n))
+ (mem (mem st)))
+ execute-n-rtm-adds-tantamount-to-add-list-n
+ all-rtm-adds-means-only-adds-are-executed
+ length-of-listpars1-n-is-n))))
+
+
+
+
+
+
+
+
+
+
+(defthm not-in-list-untouched-by-adds-list-e
+ (implies
+ (not (member-equal-bool v l1))
+ (equal (get-cell v (adds-list-e l1 l2 l3 l4 mem)) (get-cell v mem)))
+ :hints (("Goal" :in-theory (disable sum-and-update))))
+
+(defthm not-in-list-untouched-by-adds-list-e-1
+ (implies
+ (not (member-equal-bool (car l1) (cdr l1)))
+ (equal (get-cell (car l1) (adds-list-e (cdr l1) (cdr l2) (cdr l3) (cdr l4) mem))
+ (get-cell (car l1) mem))))
+
+
+(defthm sum-and-update-independent-from-firstbn
+ (implies
+ (and
+ (not (member-equal-bool (nth idx l1) (firstn idx l1)))
+ (not (member-equal-bool (nth idx l2) (firstn idx l1)))
+ (not (member-equal-bool (nth idx l3) (firstn idx l1))))
+ (equal (sum-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ (adds-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))
+ (sum-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ mem))))
+
+
+
+(defthm adds-list-decomp
+ (implies
+ (and
+ (in-range idx l1)
+ (in-range idx l2)
+ (in-range idx l3)
+ (in-range idx l4))
+ (equal
+ (adds-list-e l1 l2 l3 l4 mem)
+ (adds-list-e (nthcdr idx l1) (nthcdr idx l2) (nthcdr idx l3) (nthcdr idx l4)
+ (adds-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))))
+ :hints (("Goal" :in-theory (disable sum-and-update))))
+
+
+(defthm if-el-does-not-appear-after-its-position-then-adds-list-e-produces-its-sum
+ (implies
+ (and
+ (not (member-equal-bool (nth idx l1) (cdr (nthcdr idx l1))))
+ (in-range idx l1)
+ (in-range idx l2)
+ (in-range idx l3)
+ (in-range idx l4))
+ (equal
+ (get-cell (nth idx l1) (adds-list-e l1 l2 l3 l4 mem))
+ (sum-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ (adds-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))))
+ :hints (("Goal" :in-theory (disable sum-and-update))))
+
+
+
+
+(defthm rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables
+ (implies
+ (and
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem2 ll))
+ (in-range idx (nth gem3 ll))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll)) (adds-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem))
+ (sum-and-update (nth idx (nth gem1 ll)) (nth idx (nth gem2 ll)) (nth idx (nth gem3 ll)) (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sum-and-update)
+ :use (
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ if-el-does-not-appear-after-its-position-then-adds-list-e-produces-its-sum
+ (:instance adds-list-decomp
+ (l1 (nth gem1 ll)) (l2 (nth gem2 ll)) (l3 (nth gem3 ll)))
+ (:instance sum-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll)) (l2 (nth gem2 ll)) (l3 (nth gem3 ll)))))))
+
+
+
+(defun index-different-sum-and-updates (rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-add)
+ (cond
+ ( (endp rtmvarsres)
+ 0 )
+ ( (not (equal (get-cell (car rtmvarsres) mem-after-add)
+ (sum-and-update (car rtmvars1) (car rtmvars2) (car rtmvars3) (car rns) mem)))
+ 0 )
+ ( t
+ (1+ (index-different-sum-and-updates
+ (cdr rtmvarsres)
+ (cdr rtmvars1)
+ (cdr rtmvars2)
+ (cdr rtmvars3)
+ (cdr rns)
+ mem
+ mem-after-add)))))
+
+(defthm if-bad-index-in-range-thne-must-be-nonsumandupdate
+ (let ((bad-idx (index-different-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-add)))
+ (implies
+ (in-range bad-idx rtmvarsres)
+ (not (equal
+ (get-cell (nth bad-idx rtmvarsres) mem-after-add)
+ (sum-and-update
+ (nth bad-idx rtmvars1)
+ (nth bad-idx rtmvars2)
+ (nth bad-idx rtmvars3)
+ (nth bad-idx rns)
+ mem)))))
+ :hints (("Goal" :in-theory (disable get-cell sum-and-update))))
+
+
+(defthm if-bad-index-not-in-range-then-every-equalsumandupdate
+ (let ((bad-idx (index-different-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-add)))
+ (implies (and (true-listp rtmvarsres)
+ (not (in-range bad-idx rtmvarsres)))
+ (equal-sum-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-add))))
+
+
+(defthm rtm-variable-of-adds-list-e-is-sum-and-updates
+ (implies
+ (and
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (equal (len (nth gem1 ll)) (len (nth gem2 ll)))
+ (equal (len (nth gem1 ll)) (len (nth gem3 ll)))
+ (equal (len (nth gem1 ll)) (len rns))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (true-listp (nth gem1 ll)))
+ (equal-sum-and-updates (nth gem1 ll) (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem
+ (adds-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem)))
+ :hints (("Goal" :use (:instance rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables
+ (idx (index-different-sum-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (nth gem3 ll)
+ rns
+ mem
+ (adds-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem)))))
+ ("Goal'" :cases ( (in-range (index-different-sum-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (nth gem3 ll)
+ rns
+ mem
+ (adds-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem))
+ (nth gem1 ll)) ) )
+ ("Subgoal 1" :in-theory '((:definition in-range)
+ (:rewrite if-bad-index-in-range-thne-must-be-nonsumandupdate)))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equalsumandupdate)))))
+
+
+
+
+(defthm any-element-of-make-list-does-not-appear-into-other-lists
+ (implies
+ (and
+ (integerp n)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem1 ll)) 1)
+ (in-range idx (make-n-list (car (nth gem1 ll)) n)))
+ (not (member-equal-bool
+ (nth idx (make-n-list (car (nth gem1 ll)) n))
+ (nth gem2 ll))))
+ :hints (("Goal" :use
+ (
+ (:instance
+ el-of-makelist-is-el
+ (el (car (nth gem1 ll))))
+ (:instance generalized-disjunctivity-unordered-2
+ (idx1 gem1) (idx2 gem2) (el1 (car (nth gem1 ll)))))))
+ :otf-flg t)
+
+(defthm firstns-do-not-cotain-el-of-make-n-list-if-diff
+ (implies
+ (and
+ (integerp n)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem1 ll)) 1)
+ (in-range idx (make-n-list (car (nth gem1 ll)) n)))
+ (not (member-equal-bool
+ (nth idx (make-n-list (car (nth gem1 ll)) n))
+ (firstn idx (nth gem2 ll)))))
+ :hints (("Goal" :use
+ (
+ (:instance no-member-holds-on-firstn
+ (el (nth idx (make-n-list (car (nth gem1 ll)) n)))
+ (l (nth gem2 ll)))
+ any-element-of-make-list-does-not-appear-into-other-lists))))
+
+
+
+(defthm rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-3-is-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem3))
+ (equal (len (nth gem3 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem2 ll))
+ (in-range idx (make-n-list (car (nth gem3 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (adds-list-e
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (make-n-list (car (nth gem3 ll)) n)
+ rns mem))
+ (sum-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (nth gem2 ll))
+ (nth idx (make-n-list (car (nth gem3 ll)) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sum-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem3) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance adds-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (nth gem2 ll))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))
+ (:instance sum-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (nth gem2 ll))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))))))
+
+(defthm rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-2-is-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem2 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem3 ll))
+ (in-range idx (make-n-list (car (nth gem2 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (adds-list-e
+ (nth gem1 ll)
+ (make-n-list (car (nth gem2 ll)) n)
+ (nth gem3 ll)
+ rns mem))
+ (sum-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (make-n-list (car (nth gem2 ll)) n))
+ (nth idx (nth gem3 ll))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sum-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem2) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance adds-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (nth gem3 ll))
+ (l4 rns))
+ (:instance sum-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (nth gem3 ll))
+ (l4 rns))))))
+
+(defthm rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-2and3-are-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem2))
+ (not (equal gem1 gem3))
+ (equal (len (nth gem2 ll)) 1)
+ (equal (len (nth gem3 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (make-n-list (car (nth gem2 ll)) n))
+ (in-range idx (make-n-list (car (nth gem3 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (adds-list-e
+ (nth gem1 ll)
+ (make-n-list (car (nth gem2 ll)) n)
+ (make-n-list (car (nth gem3 ll)) n)
+ rns mem))
+ (sum-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (make-n-list (car (nth gem2 ll)) n))
+ (nth idx (make-n-list (car (nth gem3 ll)) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sum-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem2) (gem2 gem1))
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem3) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance adds-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))
+ (:instance sum-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))))))
+
+
+
+
+(defthm rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-with-all-vars-types
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal (len (nth gem1 ll)) 1))
+ (in-range idx (nth gem1 ll))
+ (in-range idx (eventually-make-list (nth gem2 ll) n))
+ (in-range idx (eventually-make-list (nth gem3 ll) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (adds-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem))
+ (sum-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (eventually-make-list (nth gem2 ll) n))
+ (nth idx (eventually-make-list (nth gem3 ll) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition eventually-make-list)))
+ :cases
+ ( (and (not (equal (len (nth gem3 ll)) 1)) (equal (len (nth gem2 ll)) 1))
+ (and (equal (len (nth gem3 ll)) 1) (not (equal (len (nth gem2 ll)) 1)))
+ (and (not (equal (len (nth gem3 ll)) 1)) (not (equal (len (nth gem2 ll)) 1)))
+ (and (equal (len (nth gem3 ll)) 1) (equal (len (nth gem2 ll)) 1))))
+ ("Subgoal 4"
+ :use rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-2-is-boolean)
+ ("Subgoal 3"
+ :use rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-3-is-boolean)
+ ("Subgoal 2"
+ :use rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables)
+ ("Subgoal 1"
+ :use rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-when-var-2and3-are-boolean)))
+
+
+
+(defthm sum-and-updates-holding-for-every-variable-type
+ (implies
+ (and
+ (integerp n)
+ (not (equal (len (nth gem1 ll)) 1))
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (equal (len (nth gem1 ll)) (len (eventually-make-list (nth gem2 ll) n)))
+ (equal (len (nth gem1 ll)) (len (eventually-make-list (nth gem3 ll) n)))
+ (equal (len (nth gem1 ll)) (len rns))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (true-listp (nth gem1 ll)))
+ (equal-sum-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem
+ (adds-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem)))
+ :hints (("Goal" :use (:instance rtm-variable-of-adds-list-e-is-sum-of-correspondent-variables-with-all-vars-types
+ (idx (index-different-sum-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns
+ mem
+ (adds-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem)))))
+ ("Goal'" :cases ( (in-range (index-different-sum-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns
+ mem
+ (adds-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem))
+ (nth gem1 ll)) ) )
+ ("Subgoal 1" :in-theory '((:definition in-range)
+ (:rewrite if-bad-index-in-range-thne-must-be-nonsumandupdate)))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equalsumandupdate)))))
+
+
+
+(defthm lemma2-only-adds-in-rtm-add
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m))
+ (all-rtm-adds-for-n-steps rstate (len *rns*)))
+ :hints (("Goal" :expand
+ ( (good-translation-gem-rtm gstate rstate m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate)))
+ :in-theory nil))
+ :rule-classes nil)
+
+
+(defthm cells-untouched-by-execute-on-other-cell-add
+ (implies
+ (and
+ (integerp n)
+ (>= n 0)
+ (all-rtm-adds-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st)
+ (not (member-equal-bool v (listpars1 st n))))
+ (equal (get-cell v (mem st))
+ (get-cell v (mem (execute-n-instructions st n)))))
+ :hints (("Goal"
+ :use (execute-n-instructions-tantamount-to-add-list-e
+ (:instance not-in-list-untouched-by-adds-list-e
+ (v v)
+ (l1 (listpars1 st n))
+ (l2 (listpars2 st n))
+ (l3 (listpars3 st n))
+ (l4 (listpars4 st n))
+ (mem (mem st)))))))
+
+
+(defthm rtm-variable-of-other-cell-untouched-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (equal (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem rstate))
+ (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem (execute-n-instructions rstate (len *rns*))))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :expand ( (in-range (pcc gstate) (code gstate))
+ (good-translation-gem-rtm gstate rstate m) )
+ :use (
+ (:instance lemma1-different-vars-do-not-belong (gvar2 (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance cells-untouched-by-execute-on-other-cell-add (st rstate) (n (len *rns*))
+ (v (nth idx1 (rtmintvars-i gvar1 m))))))))
+
+(defthm rtm-variables-of-other-cell-untouched-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (true-listp (rtmintvars-i gvar1 m))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))))
+ (equal-get-cells
+ (rtmintvars-i gvar1 m) (mem rstate) (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal" :in-theory nil
+ :use ( (:instance rtm-variable-of-other-cell-untouched-add
+ (idx1 (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*)))))) ))
+ ("Goal'" :cases ( (in-range
+ (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*))))
+ (rtmintvars-i gvar1 m))))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equal)))
+ ("Subgoal 1" :in-theory '((:forward-chaining if-bad-index-in-range-then-cells-must-be-different)))))
+
+
+
+
+(defthm properies-of-type-and-existence-of-current-args-add
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add))
+ (and
+ (equal (var-type (get-cell (par1 (nth (pcc gstate) (code gstate))) (mem gstate))) 'Int)
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par2 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par3 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))
+ :rule-classes nil)
+
+
+(defthm par1-of-current-instruction-is-into-mapping-add
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (in-range (pcc gstate) (code gstate)))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (properies-of-type-and-existence-of-current-args-add
+ (:instance inclusion-trans
+ (v (par1 (nth (pcc gstate) (code gstate))))
+ (m1 (mem gstate))
+ (m2 m))
+ (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))))
+
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (assoc-equal gvar1 m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal"
+ :in-theory '((:definition good-translation-gem-rtm))
+ :use (
+ par1-of-current-instruction-is-into-mapping-add
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate)))
+ (:instance in-range (idx (pcc gstate)) (l (code gstate)))
+ (:instance in-range (idx (pcc rstate)) (l (code rstate)))
+ rtm-variables-of-other-cell-untouched-add
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata
+ (:instance equal-get-cells-implies-equal-values-and-attributes-still-works
+ (gemcell (get-cell gvar1 (mem gstate)))
+ (lcell (rtmintvars-i gvar1 m))
+ (mem1 (mem rstate))
+ (mem2 (mem (execute-n-instructions rstate (len *rns*))))
+ (type (type-i gvar1 m)))))))
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-interessata-add
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m))
+ (equal
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (adds-list-e
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ *rns*
+ (mem rstate))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use (good-translation-gem-rtm
+ lemma2-only-adds-in-rtm-add
+ (:instance execute-n-instructions-tantamount-to-add-list-e
+ (n (len *rns*))
+ (st rstate)))))
+ :rule-classes nil)
+
+
+
+
+(defthm posinrg-add
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (in-range (pcc gstate) (code gstate)))
+ (and
+ (in-range (pos-equal-0 (par1 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par2 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par3 (nth (pcc gstate) (code gstate))) m) m)))
+ :hints (("Goal"
+ :use (properies-of-type-and-existence-of-current-args-add
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance assoc-means-pos-in-range
+ (el (par1 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par2 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par3 (nth (pcc gstate) (code gstate))))
+ (l m)))))
+ :rule-classes nil)
+
+(defthm eqlenss-add
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m))
+ (and
+ (equal (len (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)) (len *rns*))
+ (equal (len (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))) (len *rns*))
+ (equal (len (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))) (len *rns*))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use
+ (
+ good-translation-gem-rtm
+ (:instance length-of-listpars1-n-is-n (st rstate) (n (len *rns*)))
+ (:instance length-of-listpars2-n-is-n (st rstate) (n (len *rns*)))
+ (:instance length-of-listpars3-n-is-n (st rstate) (n (len *rns*))))))
+ :rule-classes nil)
+
+
+(defthm equal-sum-and-updates-after-n-instr
+ (implies
+ (and
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (equal-sum-and-updates
+ (rtmintvars-i gvar1 m)
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ *rns*
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:type-prescription retrieve-rtmvars)
+ (:definition positive-list)
+ (:definition positivep)
+ (:definition in-range)))
+ :use
+ (
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance sum-and-updates-holding-for-every-variable-type
+ (n (len *rns*))
+ (ll (retrieve-rtmvars m))
+ (rns *rns*)
+ (gem1 (pos-equal-0 (par1 (nth (pcc gstate) (code gstate))) m))
+ (gem2 (pos-equal-0 (par2 (nth (pcc gstate) (code gstate))) m))
+ (gem3 (pos-equal-0 (par3 (nth (pcc gstate) (code gstate))) m))
+ (mem (mem rstate)))
+ lemma-help2
+ eqlenss-add
+ posinrg-add
+ teorema-main-con-pcc-in-range-su-variabile-interessata-add
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par4 (nth (pcc gstate) (code gstate)))))))))
+
+
+(defthm equal-sum-and-update-norest-afetr-one-instr
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (good-translation-gem-rtm gstate rstate m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (equal (get-cell gvar1 (mem (execute-instruction gstate)))
+ (sum-and-update-norest gvar1 gvar2 gvar3 (mem gstate))))
+ :hints (("Goal" :in-theory (e/d (put-cell get-cell)
+ (par1 par2 par3 par4 opcode pcc code nth gem-instruction-list-p
+ gen-eq-update sum-and-update sub-and-update sub-and-update-norest sum-and-update-norest))))
+ :rule-classes nil)
+
+
+(DEFTHM mem-cellity-of-current-gem-args-add
+ (IMPLIES
+ (AND (GEM-STATEP GSTATE)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (IN-RANGE (PCC GSTATE) (CODE GSTATE)))
+ (AND (is-mem-cell-p (get-cell (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR2 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR3 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))))
+ :HINTS
+ (("Goal"
+ :USE
+ (:INSTANCE IN-RANGE-INSTRUCTION-IS-GEM-INSTRUCTION
+ (PCC (PCC GSTATE))
+ (CODE (CODE GSTATE))
+ (MEM (MEM GSTATE))))))
+
+
+
+(defthm type-is-for-pars-add
+ (implies
+ (and
+ (true-listp m)
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (correct-wrt-arity m (mem gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ (in-range (pcc gstate) (code gstate)))
+ (equal (type-i gvar1 m) 'int))
+ :hints (("Goal"
+ :in-theory (disable type-i-is-type-expected rtmintvars-i-is-pos-equal-0-of-retrieve-vars)
+ :use ( properies-of-type-and-existence-of-current-args-add
+ (:instance type-i-is-vartyper (gvar1 gvar1))
+ (:instance type-i-is-vartyper (gvar1 gvar2))
+ (:instance type-i-is-vartyper (gvar1 gvar3))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate))))))))
+ :rule-classes nil)
+
+
+(defthm m-correspondence-kept-on-same-gvar-add
+ (implies
+ (and
+ (good-translation-gem-rtm gstate rstate m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal" :in-theory nil
+ :use (
+ properies-of-type-and-existence-of-current-args-add
+ mem-cellity-of-current-gem-args-add
+ good-translation-gem-rtm
+ (:instance type-i-is-vartyper (gvar1 gvar1) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar gvar1) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance
+ equal-sum-and-update-norest-afetr-one-instr
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ )
+ eqlenss-add
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance type-is-for-pars-add
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 gvar1))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par3 (nth (pcc gstate) (code gstate)))))
+ equal-sum-and-updates-after-n-instr
+ (:instance
+ if-gem-is-sum-and-update-inf-every-rtm-var-is-sum-and-update-then-equal-values-is-kept-g
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ (rtmvars1 (rtmintvars-i gvar1 m))
+ (rtmvars2 (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m))
+ (rtmvars3 (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m))
+ (rtmvarsres (rtmintvars-i gvar1 m))
+ (gemmem (mem gstate))
+ (rtmmem (mem rstate))
+ (rtmmemafter (mem (execute-n-instructions rstate (len *rns*)))))))))
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (good-translation-gem-rtm gstate rstate m)
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal" :use (m-correspondence-kept-on-same-gvar-add
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-add))))
+
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-idxed-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (no-duplicates-p (retrieve-gemvars m))
+ (good-translation-gem-rtm gstate rstate m)
+ (alistp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (in-range idx m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell (car (nth idx m)) (mem (execute-instruction gstate)))
+ (cdr (nth idx m))
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i-idx m idx)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use ( (:theorem
+ (implies
+ (and
+ (alistp m)
+ (in-range idx m))
+ (and
+ (true-listp m)
+ (assoc-equal (car (nth idx m)) m))))
+ type-i-idx
+ (:instance type-i (gvar (car (nth idx m))))
+ (:instance rtmintvars-i-is-cdr-of-nth-entry (gvar (car (nth idx m))))
+ (:instance equal-values-correspondence-kept-by-any-execution-add (gvar1 (car (nth idx m))))
+ (:instance no-duplicates-has-pos-equal-right-in-that-place (l m)))))
+ :otf-flg t)
+
+(defthm m-correspondence-kept-by-any-execution-idxed-add
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (no-duplicates-p (retrieve-gemvars m))
+ (good-translation-gem-rtm gstate rstate m)
+ (alistp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal" :use (:instance equal-values-correspondence-kept-by-any-execution-idxed-add
+ (idx (bad-idx-eqv-va m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))))))
+ ("Goal'" :cases ( (in-range (bad-idx-eqv-va m (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))) m)))
+ ("Subgoal 2" :in-theory '((:forward-chaining alistp-forward-to-true-listp)
+ (:rewrite if-bad-index-not-in-range-then-m-corr)))
+ ("Subgoal 1" :in-theory '((:rewrite if-bad-index-in-range-thne-must-be-different-vs)))))
+
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-by-any-execution-add
+ (implies
+ (and
+ (alistp m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-add)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (good-translation-gem-rtm gstate rstate m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (and
+ (good-translation-gem-rtm (execute-instruction gstate) (execute-n-instructions rstate (len *rns*)) m)
+ (rtm-statep (execute-n-instructions rstate (len *rns*)))
+ (m-entries-point-to-good-rtm-var-sets m (mem (execute-n-instructions rstate (len *rns*))))
+ (gem-statep (execute-instruction gstate))
+ (correct-wrt-arity m (mem (execute-instruction gstate)))
+ (vars-inclusion (mem (execute-instruction gstate)) m)
+ (vars-inclusion m (mem (execute-instruction gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*))))))
+:hints (("Goal"
+ :in-theory (disable
+ rtm-statep gem-statep
+ pcc code opcode
+ execute-instruction rtmintvars-i par1 par2 par3 nth len member-equal)
+ :use
+ (m-correspondence-kept-by-any-execution-idxed-add
+ good-translation-gem-rtm
+ (:instance execute-n-instructions-keeps-rtm-state-and-points-to-good
+ (st rstate) (n (len *rns*)))
+ (:instance executing-gem-instruction-retrieves-a-gem-state-from-gem-state (st gstate))
+ (:instance executing-gem-instruction-preserves-correctness-wrt-arity (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-right (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-left (st gstate))))))
+
+
+
+
+
+
+
+
+
+
+
+;;(ld "Proof-Of-Minus.lisp" :ld-error-action :error)
+
+
+(in-theory (enable
+ (:executable-counterpart build-values-by-rns)
+ (:type-prescription build-values-by-rns)
+ (:induction build-values-by-rns)
+ (:definition build-values-by-rns)
+ posp-all posp mod mod-- mod-prod-makes-same-residues))
+
+(in-theory (disable mod floor))
+
+(defun sub-list (vl2 vl3 rns)
+ (if (endp vl2)
+ nil
+ (cons (mod (- (car vl2) (car vl3)) (car rns))
+ (sub-list (cdr vl2) (cdr vl3) (cdr rns)))))
+
+
+(defthm sub-correspondence-by-put-list
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (posp-all rns))
+ (equal (build-values-by-rns (- gval1 gval2) rns)
+ (sub-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns)))
+ :hints (("Goal" :induct t)))
+
+
+
+
+(in-theory (disable mod floor))
+
+(defthm sub-correspondence-by-put-list-2-fin
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (posp-all rns))
+ (equal (build-values-by-rns (mod (- gval1 gval2) (prod rns)) rns)
+ (sub-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns)))
+ :hints (("Goal" :in-theory (disable sum-correspondence-by-put-list-2-fin sum-correspondence-by-put-list)
+ :use (sub-correspondence-by-put-list
+ (:instance mod-prod-makes-same-residues (x (- gval1 gval2)))))))
+
+
+
+(in-theory (disable mod floor mod-- mod-prod-makes-same-residues))
+
+
+(defthm sub-correspondence-by-put-list-h
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (integer>1-listp rns))
+ (equal (build-values-by-rns (mod (- gval1 gval2) (prod rns)) rns)
+ (sub-list
+ (build-values-by-rns gval1 rns)
+ (build-values-by-rns gval2 rns)
+ rns)))
+ :hints (("Goal" :use (sub-correspondence-by-put-list-2-fin greater-one-means-greater-zero))))
+
+
+
+
+(defthm a-boolean-has-same-rnss-than-list-of-itself
+ (implies
+ (and
+ (integerp val)
+ (or (equal val 0) (equal val 1))
+ (integer>1-listp rns))
+ (equal
+ (build-values-by-rns val rns)
+ (make-n-list val (len rns)))))
+
+
+
+(defthm sub-correspondence-by-put-list-on-boolean
+ (implies
+ (and
+ (integerp gval1)
+ (integerp gval2)
+ (or (equal gval2 0) (equal gval2 1))
+ (integer>1-listp rns))
+ (equal (build-values-by-rns (mod (- gval1 gval2) (prod rns)) rns)
+ (sub-list
+ (build-values-by-rns gval1 rns)
+ (make-n-list gval2 (len rns))
+ rns)))
+ :hints (("Goal" :in-theory nil
+ :use (sub-correspondence-by-put-list-h
+ (:instance a-boolean-has-same-rnss-than-list-of-itself (val gval2))))))
+
+(in-theory (disable mod--))
+
+
+(defun equal-sub-and-updates (reslist par1list par2list par3list primelist mem memafterputs)
+ (if (endp reslist)
+ (null reslist)
+ (and
+ (equal
+ (get-cell (car reslist) memafterputs)
+ (sub-and-update
+ (car par1list)
+ (car par2list)
+ (car par3list)
+ (car primelist)
+ mem))
+ (equal-sub-and-updates
+ (cdr reslist)
+ (cdr par1list)
+ (cdr par2list)
+ (cdr par3list)
+ (cdr primelist)
+ mem
+ memafterputs))))
+
+
+
+
+
+(defthm equal-sub-and-updates-have-same-attributes
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns rtmmem rtmmemafter))
+ (equal (var-attributes rtmvarsres rtmmemafter) (var-attributes rtmvars1 rtmmem)))
+ :hints (("Goal" :in-theory (enable var-attribute make-cell))))
+
+;(in-theory (enable sub-list))
+
+(defthm equal-sub-and-updates-have-values-that-are-sub-lists
+ (implies
+ (and
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len rtmvars2) (len rtmvarsres))
+ (equal (len rtmvars3) (len rtmvarsres))
+ (equal-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns rtmmem rtmmemafter))
+ (equal (var-values rtmvarsres rtmmemafter)
+ (sub-list
+ (var-values rtmvars2 rtmmem)
+ (var-values rtmvars3 rtmmem)
+ rns)))
+ :hints ( ("Subgoal *1/2" :in-theory (enable var-value get-cell make-cell))))
+
+
+
+
+
+(defthm behaviour-of-sub-and-update-norest
+ (and
+ (equal
+ (var-attribute (sub-and-update-norest c1 c2 c3 mem))
+ (var-attribute (get-cell c1 mem)))
+ (equal
+ (var-value (sub-and-update-norest c1 c2 c3 mem))
+ (mod
+ (-
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem)))
+ (prod *rns*)))
+ (equal
+ (var-type (sub-and-update-norest c1 c2 c3 mem))
+ (var-type (get-cell c1 mem))))
+ :hints (("Goal" :in-theory (enable var-type var-value var-attribute make-cell))))
+
+
+
+
+(defthm defexpansion-sub
+ (implies
+ (not (null (var-value gcell)))
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Int)
+ (and
+ (equal-values (var-values rtmvars rtmmem)
+ (build-values-by-rns (var-value gcell) *rns*))
+ (equal-elements (var-attribute gcell)
+ (var-attributes rtmvars rtmmem)))))
+ :hints (("Goal" :in-theory '((:definition equal-values-and-attributes)
+ (:definition apply-direct-rns-to-value-according-to-type))
+ :use (:instance build-values-by-rns-extended-behaves-standardly-on-non-nils
+ (gem-value (var-value gcell))
+ (rns *rns*)))))
+
+
+
+
+
+(defthm if-gem-is-sub-and-update-inf-every-rtm-var-is-sub-and-update-then-equal-values-is-kept
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len rtmvars2) (len rtmvarsres))
+ (equal (len rtmvars3) (len rtmvarsres))
+ (not (null (var-value (get-cell gvar1 gemmem))))
+ (integerp (var-value (get-cell gvar2 gemmem)))
+ (integerp (var-value (get-cell gvar3 gemmem)))
+ (equal-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 *rns* rtmmem rtmmemafter)
+ (equal-values-and-attributes (get-cell gvar1 gemmem) rtmvars1 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar2 gemmem) rtmvars2 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar3 gemmem) rtmvars3 rtmmem 'Int))
+ (equal-values-and-attributes
+ (sub-and-update-norest gvar1 gvar2 gvar3 gemmem)
+ rtmvarsres
+ rtmmemafter
+ 'Int))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '(
+ (:definition integer>1-listp)
+ (:definition equal-values)
+ (:rewrite defexpansion-sub)))
+ :use (
+ (:instance greater-one-means-greater-zero (rns *rns*))
+ (:instance equal-sub-and-updates-have-values-that-are-sub-lists (rns *rns*))
+ (:instance equal-sub-and-updates-have-same-attributes (rns *rns*))
+ (:instance sub-correspondence-by-put-list-h
+ (gval1 (var-value (get-cell gvar2 gemmem)))
+ (gval2 (var-value (get-cell gvar3 gemmem)))
+ (rns *rns*))
+ (:instance behaviour-of-sub-and-update-norest
+ (c1 gvar1)
+ (c2 gvar2)
+ (c3 gvar3)
+ (mem gemmem)))))
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+(defthm if-gem-is-sub-and-update-inf-every-rtm-var-is-sub-and-update-then-equal-values-is-kept-g
+ (implies
+ (and
+ (true-listp rtmvars1)
+ (true-listp rtmvarsres)
+ (equal (len rtmvars1) (len rtmvarsres))
+ (equal (len (eventually-make-list rtmvars2 (len *rns*))) (len rtmvarsres))
+ (equal (len (eventually-make-list rtmvars3 (len *rns*))) (len rtmvarsres))
+ (equal (var-type (get-cell gvar2 gemmem)) (type-expected rtmvars2))
+ (equal (var-type (get-cell gvar3 gemmem)) (type-expected rtmvars3))
+ (is-mem-cell-p (get-cell gvar1 gemmem))
+ (equal (var-type (get-cell gvar1 gemmem)) 'Int)
+ (is-mem-cell-p (get-cell gvar2 gemmem))
+ (is-mem-cell-p (get-cell gvar3 gemmem))
+ (equal-sub-and-updates
+ rtmvarsres
+ rtmvars1
+ (eventually-make-list rtmvars2 (len *rns*))
+ (eventually-make-list rtmvars3 (len *rns*))
+ *rns* rtmmem rtmmemafter)
+ (equal-values-and-attributes (get-cell gvar1 gemmem) rtmvars1 rtmmem 'Int)
+ (equal-values-and-attributes (get-cell gvar2 gemmem) rtmvars2 rtmmem (var-type (get-cell gvar2 gemmem)))
+ (equal-values-and-attributes (get-cell gvar3 gemmem) rtmvars3 rtmmem (var-type (get-cell gvar3 gemmem))))
+ (equal-values-and-attributes
+ (sub-and-update-norest gvar1 gvar2 gvar3 gemmem)
+ rtmvarsres
+ rtmmemafter
+ 'Int))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition integer>1-listp)
+ (:definition equal-values)
+ (:definition is-mem-cell-p)
+ (:rewrite defexpansion-sub)))
+ :use (
+ (:instance defexpansion-generic
+ (gcell (get-cell gvar2 gemmem))
+ (rtmvars rtmvars2))
+ (:instance defexpansion-generic
+ (gcell (get-cell gvar3 gemmem))
+ (rtmvars rtmvars3))
+ (:instance equal-sub-and-updates-have-values-that-are-sub-lists
+ (rtmvars2 (eventually-make-list rtmvars2 (len *rns*)))
+ (rtmvars3 (eventually-make-list rtmvars3 (len *rns*)))
+ (rns *rns*))
+ (:instance equal-sub-and-updates-have-same-attributes
+ (rtmvars2 (eventually-make-list rtmvars2 (len *rns*)))
+ (rtmvars3 (eventually-make-list rtmvars3 (len *rns*)))
+ (rns *rns*))
+ (:instance sub-correspondence-by-put-list-h
+ (gval1 (var-value (get-cell gvar2 gemmem)))
+ (gval2 (var-value (get-cell gvar3 gemmem)))
+ (rns *rns*))
+ (:instance behaviour-of-sub-and-update-norest
+ (c1 gvar1)
+ (c2 gvar2)
+ (c3 gvar3)
+ (mem gemmem))))))
+
+
+
+
+
+(in-theory (disable sub-list sub-correspondence-by-put-list
+ sub-correspondence-by-put-list-h
+ sub-correspondence-by-put-list-2-fin
+ equal-sub-and-updates-have-same-attributes
+ equal-sub-and-updates-have-values-that-are-sub-lists
+ behaviour-of-sub-and-update-norest
+ defexpansion
+ if-a-var-value-is-same-then-var-values-are-list-of
+ if-a-var-attribute-is-same-then-var-attributes-are-list-of
+ defexpansion-generic-bool
+ defexpansion-generic-int
+ defexpansion-generic
+ defexpansion-bool-values-inv
+ defexpansion-bool-values
+ defexpansion-bool-attrs-inv
+ defexpansion-bool-attrs-inv-1
+ defexpansion-bool-attrs-inv-2
+ defexpansion-bool-attrs
+ defexpansion-bool-attrs-1
+ equal-values-on-list-entails-equality-on-first-els
+ ))
+
+
+
+
+
+(defun execute-n-rtm-subs (st n)
+ (if
+ (zp n)
+ st
+ (execute-n-rtm-subs
+ (rtm-sub
+ (par1 (nth (pcc st) (code st)))
+ (par2 (nth (pcc st) (code st)))
+ (par3 (nth (pcc st) (code st)))
+ (par4 (nth (pcc st) (code st)))
+ st)
+ (1- n))))
+
+
+(defthm all-rtm-subs-means-only-subs-are-executed
+ (implies
+ (all-rtm-subs-for-n-steps st n)
+ (equal
+ (execute-n-rtm-subs st n)
+ (execute-n-instructions st n)))
+ :hints (("Goal" :in-theory (disable rtm-sub member-equal nth par1 par2 par3))))
+
+
+(defun subs-list-n (l1 l2 l3 l4 mem n)
+ (if (zp n)
+ mem
+ (subs-list-n (cdr l1) (cdr l2) (cdr l3) (cdr l4)
+ (put-cell
+ (car l1)
+ (sub-and-update
+ (car l1)
+ (car l2)
+ (car l3)
+ (car l4)
+ mem)
+ mem)
+ (1- n))))
+
+
+
+
+
+
+
+(in-theory (disable member-equal))
+
+
+(in-theory (enable make-cell))
+
+
+
+(defthm execute-n-rtm-subs-tantamount-to-sub-list-n
+ (implies
+ (and
+ (all-rtm-subs-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st))
+ (equal
+ (mem (execute-n-rtm-subs st n))
+ (subs-list-n
+ (listpars1 st n)
+ (listpars2 st n)
+ (listpars3 st n)
+ (listpars4 st n)
+ (mem st)
+ n)))
+ :hints
+ (("Goal" :induct t )
+ ("Subgoal *1/2.2" :in-theory '((:definition all-rtm-subs-for-n-steps)
+ (:definition execute-instruction)
+ (:definition rtm-sub)
+ (:definition make-state)
+ (:definition mem))
+ )
+ ("Subgoal *1/2"
+ :use ( execute-n-rtm-subs
+ (:instance subs-list-n
+ (l1 (listpars1 st n))
+ (l2 (listpars2 st n))
+ (l3 (listpars3 st n))
+ (l4 (listpars4 st n))
+ (mem (mem st)))
+ lemma12-lp1r lemma12-lp2r lemma12-lp3r lemma12-lp4r
+ (:theorem
+ (IMPLIES (AND (ALL-RTM-SUBS-FOR-N-STEPS ST N)
+ (>= (pcc st) 0)
+ (not (zp n)))
+ (equal (mem (execute-instruction st))
+ (PUT-CELL (CAR (LISTPARS1 ST N))
+ (SUB-AND-UPDATE (CAR (LISTPARS1 ST N))
+ (CAR (LISTPARS2 ST N))
+ (CAR (LISTPARS3 ST N))
+ (CAR (LISTPARS4 ST N))
+ (MEM ST))
+ (MEM ST)))))
+ executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state
+ instruction-incrementing-pvv))))
+
+
+(in-theory (disable lemma12-lp1r lemma12-lp2r lemma12-lp3r lemma12-lp4r ))
+
+
+
+
+
+
+
+
+
+
+(defun subs-list-e (c1 c2 c3 c4 mem)
+ (if
+ (endp c1)
+ mem
+ (subs-list-e
+ (cdr c1)
+ (cdr c2)
+ (cdr c3)
+ (cdr c4)
+ (put-cell (car c1) (sub-and-update (car c1) (car c2) (car c3) (car c4) mem) mem))))
+
+
+
+(defthm subs-list-e-is-subs-list-n
+ (equal (subs-list-e c1 c2 c3 c4 mem) (subs-list-n c1 c2 c3 c4 mem (len c1)))
+ :rule-classes nil)
+
+
+
+(defthm execute-n-instructions-tantamount-to-sub-list-e
+ (implies
+ (and
+ (integerp n)
+ (>= n 0)
+ (all-rtm-subs-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st))
+ (equal
+ (mem (execute-n-instructions st n))
+ (subs-list-e
+ (listpars1 st n)
+ (listpars2 st n)
+ (listpars3 st n)
+ (listpars4 st n)
+ (mem st))))
+ :hints (("Goal" :in-theory nil
+ :use ((:instance subs-list-e-is-subs-list-n
+ (c1 (listpars1 st n))
+ (c2 (listpars2 st n))
+ (c3 (listpars3 st n))
+ (c4 (listpars4 st n))
+ (mem (mem st)))
+ execute-n-rtm-subs-tantamount-to-sub-list-n
+ all-rtm-subs-means-only-subs-are-executed
+ length-of-listpars1-n-is-n))))
+
+
+
+
+
+
+
+
+
+
+(defthm not-in-list-untouched-by-subs-list-e
+ (implies
+ (not (member-equal-bool v l1))
+ (equal (get-cell v (subs-list-e l1 l2 l3 l4 mem)) (get-cell v mem)))
+ :hints (("Goal" :in-theory (disable sub-and-update))))
+
+(defthm not-in-list-untouched-by-subs-list-e-1
+ (implies
+ (not (member-equal-bool (car l1) (cdr l1)))
+ (equal (get-cell (car l1) (subs-list-e (cdr l1) (cdr l2) (cdr l3) (cdr l4) mem))
+ (get-cell (car l1) mem))))
+
+
+(defthm sub-and-update-independent-from-firstbn
+ (implies
+ (and
+ (not (member-equal-bool (nth idx l1) (firstn idx l1)))
+ (not (member-equal-bool (nth idx l2) (firstn idx l1)))
+ (not (member-equal-bool (nth idx l3) (firstn idx l1))))
+ (equal (sub-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ (subs-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))
+ (sub-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ mem))))
+
+
+
+(defthm subs-list-decomp
+ (implies
+ (and
+ (in-range idx l1)
+ (in-range idx l2)
+ (in-range idx l3)
+ (in-range idx l4))
+ (equal
+ (subs-list-e l1 l2 l3 l4 mem)
+ (subs-list-e (nthcdr idx l1) (nthcdr idx l2) (nthcdr idx l3) (nthcdr idx l4)
+ (subs-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))))
+ :hints (("Goal" :in-theory (disable sub-and-update))))
+
+
+(defthm if-el-does-not-appear-after-its-position-then-subs-list-e-produces-its-sub
+ (implies
+ (and
+ (not (member-equal-bool (nth idx l1) (cdr (nthcdr idx l1))))
+ (in-range idx l1)
+ (in-range idx l2)
+ (in-range idx l3)
+ (in-range idx l4))
+ (equal
+ (get-cell (nth idx l1) (subs-list-e l1 l2 l3 l4 mem))
+ (sub-and-update
+ (nth idx l1)
+ (nth idx l2)
+ (nth idx l3)
+ (nth idx l4)
+ (subs-list-e (firstn idx l1) (firstn idx l2) (firstn idx l3) (firstn idx l4) mem))))
+ :hints (("Goal" :in-theory (disable sub-and-update))))
+
+
+
+
+(defthm rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables
+ (implies
+ (and
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem2 ll))
+ (in-range idx (nth gem3 ll))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll)) (subs-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem))
+ (sub-and-update (nth idx (nth gem1 ll)) (nth idx (nth gem2 ll)) (nth idx (nth gem3 ll)) (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sub-and-update)
+ :use (
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ if-el-does-not-appear-after-its-position-then-subs-list-e-produces-its-sub
+ (:instance subs-list-decomp
+ (l1 (nth gem1 ll)) (l2 (nth gem2 ll)) (l3 (nth gem3 ll)))
+ (:instance sub-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll)) (l2 (nth gem2 ll)) (l3 (nth gem3 ll)))))))
+
+
+
+(defun index-different-sub-and-updates (rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-sub)
+ (cond
+ ( (endp rtmvarsres)
+ 0 )
+ ( (not (equal (get-cell (car rtmvarsres) mem-after-sub)
+ (sub-and-update (car rtmvars1) (car rtmvars2) (car rtmvars3) (car rns) mem)))
+ 0 )
+ ( t
+ (1+ (index-different-sub-and-updates
+ (cdr rtmvarsres)
+ (cdr rtmvars1)
+ (cdr rtmvars2)
+ (cdr rtmvars3)
+ (cdr rns)
+ mem
+ mem-after-sub)))))
+
+(defthm if-bad-index-in-range-thne-must-be-nonsubandupdate
+ (let ((bad-idx (index-different-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-sub)))
+ (implies
+ (in-range bad-idx rtmvarsres)
+ (not (equal
+ (get-cell (nth bad-idx rtmvarsres) mem-after-sub)
+ (sub-and-update
+ (nth bad-idx rtmvars1)
+ (nth bad-idx rtmvars2)
+ (nth bad-idx rtmvars3)
+ (nth bad-idx rns)
+ mem)))))
+ :hints (("Goal" :in-theory (disable get-cell sub-and-update))))
+
+
+(defthm if-bad-index-not-in-range-then-every-equalsubandupdate
+ (let ((bad-idx (index-different-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-sub)))
+ (implies (and (true-listp rtmvarsres)
+ (not (in-range bad-idx rtmvarsres)))
+ (equal-sub-and-updates rtmvarsres rtmvars1 rtmvars2 rtmvars3 rns mem mem-after-sub))))
+
+
+(defthm rtm-variable-of-subs-list-e-is-sub-and-updates
+ (implies
+ (and
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (equal (len (nth gem1 ll)) (len (nth gem2 ll)))
+ (equal (len (nth gem1 ll)) (len (nth gem3 ll)))
+ (equal (len (nth gem1 ll)) (len rns))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (true-listp (nth gem1 ll)))
+ (equal-sub-and-updates (nth gem1 ll) (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem
+ (subs-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem)))
+ :hints (("Goal" :use (:instance rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables
+ (idx (index-different-sub-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (nth gem3 ll)
+ rns
+ mem
+ (subs-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem)))))
+ ("Goal'" :cases ( (in-range (index-different-sub-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (nth gem3 ll)
+ rns
+ mem
+ (subs-list-e (nth gem1 ll) (nth gem2 ll) (nth gem3 ll) rns mem))
+ (nth gem1 ll)) ) )
+ ("Subgoal 1" :in-theory '((:definition in-range)
+ (:rewrite if-bad-index-in-range-thne-must-be-nonsubandupdate)))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equalsubandupdate)))))
+
+
+
+
+(defthm any-element-of-make-list-does-not-appear-into-other-lists
+ (implies
+ (and
+ (integerp n)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem1 ll)) 1)
+ (in-range idx (make-n-list (car (nth gem1 ll)) n)))
+ (not (member-equal-bool
+ (nth idx (make-n-list (car (nth gem1 ll)) n))
+ (nth gem2 ll))))
+ :hints (("Goal" :use
+ (
+ (:instance
+ el-of-makelist-is-el
+ (el (car (nth gem1 ll))))
+ (:instance generalized-disjunctivity-unordered-2
+ (idx1 gem1) (idx2 gem2) (el1 (car (nth gem1 ll)))))))
+ :otf-flg t)
+
+(defthm firstns-do-not-cotain-el-of-make-n-list-if-diff
+ (implies
+ (and
+ (integerp n)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem1 ll)) 1)
+ (in-range idx (make-n-list (car (nth gem1 ll)) n)))
+ (not (member-equal-bool
+ (nth idx (make-n-list (car (nth gem1 ll)) n))
+ (firstn idx (nth gem2 ll)))))
+ :hints (("Goal" :use
+ (
+ (:instance no-member-holds-on-firstn
+ (el (nth idx (make-n-list (car (nth gem1 ll)) n)))
+ (l (nth gem2 ll)))
+ any-element-of-make-list-does-not-appear-into-other-lists))))
+
+
+
+(defthm rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-3-is-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem3))
+ (equal (len (nth gem3 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem2 ll))
+ (in-range idx (make-n-list (car (nth gem3 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (subs-list-e
+ (nth gem1 ll)
+ (nth gem2 ll)
+ (make-n-list (car (nth gem3 ll)) n)
+ rns mem))
+ (sub-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (nth gem2 ll))
+ (nth idx (make-n-list (car (nth gem3 ll)) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sub-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem3) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance subs-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (nth gem2 ll))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))
+ (:instance sub-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (nth gem2 ll))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))))))
+
+(defthm rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-2-is-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem2))
+ (equal (len (nth gem2 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (nth gem3 ll))
+ (in-range idx (make-n-list (car (nth gem2 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (subs-list-e
+ (nth gem1 ll)
+ (make-n-list (car (nth gem2 ll)) n)
+ (nth gem3 ll)
+ rns mem))
+ (sub-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (make-n-list (car (nth gem2 ll)) n))
+ (nth idx (nth gem3 ll))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sub-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem2) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance subs-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (nth gem3 ll))
+ (l4 rns))
+ (:instance sub-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (nth gem3 ll))
+ (l4 rns))))))
+
+(defthm rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-2and3-are-boolean
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal gem1 gem2))
+ (not (equal gem1 gem3))
+ (equal (len (nth gem2 ll)) 1)
+ (equal (len (nth gem3 ll)) 1)
+ (in-range idx (nth gem1 ll))
+ (in-range idx (make-n-list (car (nth gem2 ll)) n))
+ (in-range idx (make-n-list (car (nth gem3 ll)) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (subs-list-e
+ (nth gem1 ll)
+ (make-n-list (car (nth gem2 ll)) n)
+ (make-n-list (car (nth gem3 ll)) n)
+ rns mem))
+ (sub-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (make-n-list (car (nth gem2 ll)) n))
+ (nth idx (make-n-list (car (nth gem3 ll)) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (disable sub-and-update)
+ :use (
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem2) (gem2 gem1))
+ (:instance firstns-do-not-cotain-el-of-make-n-list-if-diff (gem1 gem3) (gem2 gem1))
+ (:instance no-duplicates-all-implies-no-duplicates-one (idx1 gem1))
+ (:instance no-duplicates-means-an-element-does-not-appear-after-its-position (l (nth gem1 ll)))
+ (:instance subs-list-decomp
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))
+ (:instance sub-and-update-independent-from-firstbn
+ (l1 (nth gem1 ll))
+ (l2 (make-n-list (car (nth gem2 ll)) n))
+ (l3 (make-n-list (car (nth gem3 ll)) n))
+ (l4 rns))))))
+
+
+
+
+(defthm rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-with-all-vars-types
+ (implies
+ (and
+ (integerp n)
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (not (equal (len (nth gem1 ll)) 1))
+ (in-range idx (nth gem1 ll))
+ (in-range idx (eventually-make-list (nth gem2 ll) n))
+ (in-range idx (eventually-make-list (nth gem3 ll) n))
+ (in-range idx rns))
+ (equal
+ (get-cell (nth idx (nth gem1 ll))
+ (subs-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem))
+ (sub-and-update
+ (nth idx (nth gem1 ll))
+ (nth idx (eventually-make-list (nth gem2 ll) n))
+ (nth idx (eventually-make-list (nth gem3 ll) n))
+ (nth idx rns) mem)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition eventually-make-list)))
+ :cases
+ ( (and (not (equal (len (nth gem3 ll)) 1)) (equal (len (nth gem2 ll)) 1))
+ (and (equal (len (nth gem3 ll)) 1) (not (equal (len (nth gem2 ll)) 1)))
+ (and (not (equal (len (nth gem3 ll)) 1)) (not (equal (len (nth gem2 ll)) 1)))
+ (and (equal (len (nth gem3 ll)) 1) (equal (len (nth gem2 ll)) 1))))
+ ("Subgoal 4"
+ :use rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-2-is-boolean)
+ ("Subgoal 3"
+ :use rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-3-is-boolean)
+ ("Subgoal 2"
+ :use rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables)
+ ("Subgoal 1"
+ :use rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-when-var-2and3-are-boolean)))
+
+
+
+(defthm sub-and-updates-holding-for-every-variable-type
+ (implies
+ (and
+ (integerp n)
+ (not (equal (len (nth gem1 ll)) 1))
+ (positive-list rns)
+ (true-listp ll)
+ (no-duplicates-p (append-lists ll))
+ (equal (len (nth gem1 ll)) (len (eventually-make-list (nth gem2 ll) n)))
+ (equal (len (nth gem1 ll)) (len (eventually-make-list (nth gem3 ll) n)))
+ (equal (len (nth gem1 ll)) (len rns))
+ (in-range gem1 ll)
+ (in-range gem2 ll)
+ (in-range gem3 ll)
+ (true-listp (nth gem1 ll)))
+ (equal-sub-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem
+ (subs-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem)))
+ :hints (("Goal" :use (:instance rtm-variable-of-subs-list-e-is-sub-of-correspondent-variables-with-all-vars-types
+ (idx (index-different-sub-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns
+ mem
+ (subs-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem)))))
+ ("Goal'" :cases ( (in-range (index-different-sub-and-updates
+ (nth gem1 ll)
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns
+ mem
+ (subs-list-e
+ (nth gem1 ll)
+ (eventually-make-list (nth gem2 ll) n)
+ (eventually-make-list (nth gem3 ll) n)
+ rns mem))
+ (nth gem1 ll)) ) )
+ ("Subgoal 1" :in-theory '((:definition in-range)
+ (:rewrite if-bad-index-in-range-thne-must-be-nonsubandupdate)))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equalsubandupdate)))))
+
+
+
+(defthm lemma2-only-subs-in-rtm-sub
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m))
+ (all-rtm-subs-for-n-steps rstate (len *rns*)))
+ :hints (("Goal" :expand
+ ( (good-translation-gem-rtm gstate rstate m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate)))
+ :in-theory nil))
+ :rule-classes nil)
+
+
+(defthm cells-untouched-by-execute-on-other-cell-sub
+ (implies
+ (and
+ (integerp n)
+ (>= n 0)
+ (all-rtm-subs-for-n-steps st n)
+ (>= (pcc st) 0)
+ (rtm-statep st)
+ (not (member-equal-bool v (listpars1 st n))))
+ (equal (get-cell v (mem st))
+ (get-cell v (mem (execute-n-instructions st n)))))
+ :hints (("Goal"
+ :use (execute-n-instructions-tantamount-to-sub-list-e
+ (:instance not-in-list-untouched-by-subs-list-e
+ (v v)
+ (l1 (listpars1 st n))
+ (l2 (listpars2 st n))
+ (l3 (listpars3 st n))
+ (l4 (listpars4 st n))
+ (mem (mem st)))))))
+
+
+(defthm rtm-variable-of-other-cell-untouched-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (equal (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem rstate))
+ (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem (execute-n-instructions rstate (len *rns*))))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :expand ( (in-range (pcc gstate) (code gstate))
+ (good-translation-gem-rtm gstate rstate m) )
+ :use (
+ (:instance lemma1-different-vars-do-not-belong (gvar2 (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance cells-untouched-by-execute-on-other-cell-sub (st rstate) (n (len *rns*))
+ (v (nth idx1 (rtmintvars-i gvar1 m))))))))
+
+(defthm rtm-variables-of-other-cell-untouched-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (true-listp (rtmintvars-i gvar1 m))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))))
+ (equal-get-cells
+ (rtmintvars-i gvar1 m) (mem rstate) (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal" :in-theory nil
+ :use ( (:instance rtm-variable-of-other-cell-untouched-sub
+ (idx1 (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*)))))) ))
+ ("Goal'" :cases ( (in-range
+ (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*))))
+ (rtmintvars-i gvar1 m))))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equal)))
+ ("Subgoal 1" :in-theory '((:forward-chaining if-bad-index-in-range-then-cells-must-be-different)))))
+
+
+
+
+(defthm properies-of-type-and-existence-of-current-args-sub
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub))
+ (and
+ (equal (var-type (get-cell (par1 (nth (pcc gstate) (code gstate))) (mem gstate))) 'Int)
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par2 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par3 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))
+ :rule-classes nil)
+
+
+(defthm par1-of-current-instruction-is-into-mapping-sub
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (in-range (pcc gstate) (code gstate)))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (properies-of-type-and-existence-of-current-args-sub
+ (:instance inclusion-trans
+ (v (par1 (nth (pcc gstate) (code gstate))))
+ (m1 (mem gstate))
+ (m2 m))
+ (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))))
+
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (assoc-equal gvar1 m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal"
+ :in-theory '((:definition good-translation-gem-rtm))
+ :use (
+ par1-of-current-instruction-is-into-mapping-sub
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate)))
+ (:instance in-range (idx (pcc gstate)) (l (code gstate)))
+ (:instance in-range (idx (pcc rstate)) (l (code rstate)))
+ rtm-variables-of-other-cell-untouched-sub
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata
+ (:instance equal-get-cells-implies-equal-values-and-attributes-still-works
+ (gemcell (get-cell gvar1 (mem gstate)))
+ (lcell (rtmintvars-i gvar1 m))
+ (mem1 (mem rstate))
+ (mem2 (mem (execute-n-instructions rstate (len *rns*))))
+ (type (type-i gvar1 m)))))))
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-interessata-sub
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m))
+ (equal
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (subs-list-e
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ *rns*
+ (mem rstate))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use (good-translation-gem-rtm
+ lemma2-only-subs-in-rtm-sub
+ (:instance execute-n-instructions-tantamount-to-sub-list-e
+ (n (len *rns*))
+ (st rstate)))))
+ :rule-classes nil)
+
+
+
+
+(defthm posinrg-sub
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (in-range (pcc gstate) (code gstate)))
+ (and
+ (in-range (pos-equal-0 (par1 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par2 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par3 (nth (pcc gstate) (code gstate))) m) m)))
+ :hints (("Goal"
+ :use (properies-of-type-and-existence-of-current-args-sub
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance assoc-means-pos-in-range
+ (el (par1 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par2 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par3 (nth (pcc gstate) (code gstate))))
+ (l m)))))
+ :rule-classes nil)
+
+(defthm eqlenss-sub
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m))
+ (and
+ (equal (len (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)) (len *rns*))
+ (equal (len (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))) (len *rns*))
+ (equal (len (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))) (len *rns*))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use
+ (
+ good-translation-gem-rtm
+ (:instance length-of-listpars1-n-is-n (st rstate) (n (len *rns*)))
+ (:instance length-of-listpars2-n-is-n (st rstate) (n (len *rns*)))
+ (:instance length-of-listpars3-n-is-n (st rstate) (n (len *rns*))))))
+ :rule-classes nil)
+
+
+(defthm equal-sub-and-updates-after-n-instr
+ (implies
+ (and
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (equal-sub-and-updates
+ (rtmintvars-i gvar1 m)
+ (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)) ;new
+ *rns*
+ (mem rstate)
+ (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:type-prescription retrieve-rtmvars)
+ (:definition positive-list)
+ (:definition positivep)
+ (:definition in-range)))
+ :use
+ (
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance sub-and-updates-holding-for-every-variable-type
+ (n (len *rns*))
+ (ll (retrieve-rtmvars m))
+ (rns *rns*)
+ (gem1 (pos-equal-0 (par1 (nth (pcc gstate) (code gstate))) m))
+ (gem2 (pos-equal-0 (par2 (nth (pcc gstate) (code gstate))) m))
+ (gem3 (pos-equal-0 (par3 (nth (pcc gstate) (code gstate))) m))
+ (mem (mem rstate)))
+ lemma-help2
+ eqlenss-sub
+ posinrg-sub
+ teorema-main-con-pcc-in-range-su-variabile-interessata-sub
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance rtmintvars-i-is-pos-equal-0-of-retrieve-vars
+ (gvar (par4 (nth (pcc gstate) (code gstate)))))))))
+
+
+(defthm equal-sub-and-update-norest-afetr-one-instr
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (good-translation-gem-rtm gstate rstate m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (equal (get-cell gvar1 (mem (execute-instruction gstate)))
+ (sub-and-update-norest gvar1 gvar2 gvar3 (mem gstate))))
+ :hints (("Goal" :in-theory (e/d (put-cell get-cell)
+ (par1 par2 par3 par4 opcode pcc code nth gem-instruction-list-p
+ gen-eq-update sub-and-update sub-and-update sub-and-update-norest sub-and-update-norest))))
+ :rule-classes nil)
+
+
+(DEFTHM mem-cellity-of-current-gem-args-sub
+ (IMPLIES
+ (AND (GEM-STATEP GSTATE)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (IN-RANGE (PCC GSTATE) (CODE GSTATE)))
+ (AND (is-mem-cell-p (get-cell (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR2 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR3 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))))
+ :HINTS
+ (("Goal"
+ :USE
+ (:INSTANCE IN-RANGE-INSTRUCTION-IS-GEM-INSTRUCTION
+ (PCC (PCC GSTATE))
+ (CODE (CODE GSTATE))
+ (MEM (MEM GSTATE))))))
+
+
+
+(defthm type-is-for-pars-sub
+ (implies
+ (and
+ (true-listp m)
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (correct-wrt-arity m (mem gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ (in-range (pcc gstate) (code gstate)))
+ (equal (type-i gvar1 m) 'int))
+ :hints (("Goal"
+ :in-theory (disable type-i-is-type-expected rtmintvars-i-is-pos-equal-0-of-retrieve-vars)
+ :use ( properies-of-type-and-existence-of-current-args-sub
+ (:instance type-i-is-vartyper (gvar1 gvar1))
+ (:instance type-i-is-vartyper (gvar1 gvar2))
+ (:instance type-i-is-vartyper (gvar1 gvar3))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate))))))))
+ :rule-classes nil)
+
+
+(defthm m-correspondence-kept-on-same-gvar-sub
+ (implies
+ (and
+ (good-translation-gem-rtm gstate rstate m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal" :in-theory nil
+ :use (
+ properies-of-type-and-existence-of-current-args-sub
+ mem-cellity-of-current-gem-args-sub
+ good-translation-gem-rtm
+ (:instance type-i-is-vartyper (gvar1 gvar1) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar gvar1) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance
+ equal-sub-and-update-norest-afetr-one-instr
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ )
+ eqlenss-sub
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance type-is-for-pars-sub
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 gvar1))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par3 (nth (pcc gstate) (code gstate)))))
+ equal-sub-and-updates-after-n-instr
+ (:instance
+ if-gem-is-sub-and-update-inf-every-rtm-var-is-sub-and-update-then-equal-values-is-kept-g
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ (rtmvars1 (rtmintvars-i gvar1 m))
+ (rtmvars2 (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m))
+ (rtmvars3 (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m))
+ (rtmvarsres (rtmintvars-i gvar1 m))
+ (gemmem (mem gstate))
+ (rtmmem (mem rstate))
+ (rtmmemafter (mem (execute-n-instructions rstate (len *rns*)))))))))
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (good-translation-gem-rtm gstate rstate m)
+ (true-listp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i gvar1 m)))
+ :hints (("Goal" :use (m-correspondence-kept-on-same-gvar-sub
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-sub))))
+
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-idxed-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (no-duplicates-p (retrieve-gemvars m))
+ (good-translation-gem-rtm gstate rstate m)
+ (alistp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (in-range idx m)
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (equal-values-and-attributes
+ (get-cell (car (nth idx m)) (mem (execute-instruction gstate)))
+ (cdr (nth idx m))
+ (mem (execute-n-instructions rstate (len *rns*)))
+ (type-i-idx m idx)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero) '((:definition in-range)))
+ :use ( (:theorem
+ (implies
+ (and
+ (alistp m)
+ (in-range idx m))
+ (and
+ (true-listp m)
+ (assoc-equal (car (nth idx m)) m))))
+ type-i-idx
+ (:instance type-i (gvar (car (nth idx m))))
+ (:instance rtmintvars-i-is-cdr-of-nth-entry (gvar (car (nth idx m))))
+ (:instance equal-values-correspondence-kept-by-any-execution-sub (gvar1 (car (nth idx m))))
+ (:instance no-duplicates-has-pos-equal-right-in-that-place (l m)))))
+ :otf-flg t)
+
+(defthm m-correspondence-kept-by-any-execution-idxed-sub
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (no-duplicates-p (retrieve-gemvars m))
+ (good-translation-gem-rtm gstate rstate m)
+ (alistp m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))))
+ :hints (("Goal" :use (:instance equal-values-correspondence-kept-by-any-execution-idxed-sub
+ (idx (bad-idx-eqv-va m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))))))
+ ("Goal'" :cases ( (in-range (bad-idx-eqv-va m (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*)))) m)))
+ ("Subgoal 2" :in-theory '((:forward-chaining alistp-forward-to-true-listp)
+ (:rewrite if-bad-index-not-in-range-then-m-corr)))
+ ("Subgoal 1" :in-theory '((:rewrite if-bad-index-in-range-thne-must-be-different-vs)))))
+
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-by-any-execution-sub
+ (implies
+ (and
+ (alistp m)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-sub)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (good-translation-gem-rtm gstate rstate m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (and
+ (good-translation-gem-rtm (execute-instruction gstate) (execute-n-instructions rstate (len *rns*)) m)
+ (rtm-statep (execute-n-instructions rstate (len *rns*)))
+ (m-entries-point-to-good-rtm-var-sets m (mem (execute-n-instructions rstate (len *rns*))))
+ (gem-statep (execute-instruction gstate))
+ (correct-wrt-arity m (mem (execute-instruction gstate)))
+ (vars-inclusion (mem (execute-instruction gstate)) m)
+ (vars-inclusion m (mem (execute-instruction gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (len *rns*))))))
+:hints (("Goal"
+ :in-theory (disable
+ rtm-statep gem-statep
+ pcc code opcode
+ execute-instruction rtmintvars-i par1 par2 par3 nth len member-equal)
+ :use
+ (m-correspondence-kept-by-any-execution-idxed-sub
+ good-translation-gem-rtm
+ (:instance execute-n-instructions-keeps-rtm-state-and-points-to-good
+ (st rstate) (n (len *rns*)))
+ (:instance executing-gem-instruction-retrieves-a-gem-state-from-gem-state (st gstate))
+ (:instance executing-gem-instruction-preserves-correctness-wrt-arity (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-right (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-left (st gstate))))))
+
+
+
+
+
+
+
+;;(ld "Proof-Of-Comparison.lisp" :ld-error-action :error)
+
+
+
+(defthm listinstr-of-2-unfolding-f
+ (equal
+ (listinstr st 2)
+ (list
+ (nth (pcc st) (code st))
+ (nth (pcc (execute-instruction st)) (code (execute-instruction st)))))
+ :hints (("Goal"
+ :in-theory (current-theory 'ground-zero)
+ :use ( (:instance listinstr (n 2))
+ (:instance listinstr (st (execute-instruction st)) (n 1))
+ (:instance listinstr (st (execute-instruction (execute-instruction st))) (n 0))))))
+
+
+
+(defthm listinstr-of-2-has-the-two-instructions
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (and
+ (equal (nth (pcc st) (code st))
+ (list 'rtm-equ tmp v1 v2))
+ (equal (nth (pcc (execute-instruction st)) (code (execute-instruction st)))
+ (list 'rtm-and res tmp res))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :use (rtm-eq-and
+ listinstr-of-2-unfolding-f ))))
+
+(defthm listinstr-of-2-has-the-two-opcodes
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (and
+ (equal (opcode (nth (pcc st) (code st))) 'rtm-equ)
+ (equal (par1 (nth (pcc st) (code st))) tmp)
+ (equal (par2 (nth (pcc st) (code st))) v1)
+ (equal (par3 (nth (pcc st) (code st))) v2)
+ (equal (opcode (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) 'rtm-and)
+ (equal (par1 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) res)
+ (equal (par2 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) tmp)
+ (equal (par3 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) res)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition par1)
+ (:definition par2)
+ (:definition par3)
+ (:definition opcode)))
+ :use (listinstr-of-2-has-the-two-instructions
+ (:instance
+ (:theorem (and
+ (equal (nth 0 (list a b c d)) a)
+ (equal (nth 1 (list a b c d)) b)
+ (equal (nth 2 (list a b c d)) c)
+ (equal (nth 3 (list a b c d)) d)))
+ (a 'rtm-equ)
+ (b tmp)
+ (c v1)
+ (d v2))
+ (:instance
+ (:theorem (and
+ (equal (nth 0 (list a b c d)) a)
+ (equal (nth 1 (list a b c d)) b)
+ (equal (nth 2 (list a b c d)) c)
+ (equal (nth 3 (list a b c d)) d)))
+ (a 'rtm-and)
+ (b res)
+ (c tmp)
+ (d res))))))
+
+
+
+(defthm listinstr-of-2-or-the-two-instructions
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (and
+ (equal (nth (pcc st) (code st))
+ (list 'rtm-equ tmp v1 v2))
+ (equal (nth (pcc (execute-instruction st)) (code (execute-instruction st)))
+ (list 'rtm-or res tmp tmp))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :use (rtm-eq-or
+ listinstr-of-2-unfolding-f ))))
+
+(defthm listinstr-of-2-or-has-the-two-opcodes
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (and
+ (equal (opcode (nth (pcc st) (code st))) 'rtm-equ)
+ (equal (par1 (nth (pcc st) (code st))) tmp)
+ (equal (par2 (nth (pcc st) (code st))) v1)
+ (equal (par3 (nth (pcc st) (code st))) v2)
+ (equal (opcode (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) 'rtm-or)
+ (equal (par1 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) res)
+ (equal (par2 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) tmp)
+ (equal (par3 (nth (pcc (execute-instruction st)) (code (execute-instruction st)))) tmp)))
+ :hints (("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition par1)
+ (:definition par2)
+ (:definition par3)
+ (:definition opcode)))
+ :use (listinstr-of-2-or-the-two-instructions
+ (:instance
+ (:theorem (and
+ (equal (nth 0 (list a b c d)) a)
+ (equal (nth 1 (list a b c d)) b)
+ (equal (nth 2 (list a b c d)) c)
+ (equal (nth 3 (list a b c d)) d)))
+ (a 'rtm-equ)
+ (b tmp)
+ (c v1)
+ (d v2))
+ (:instance
+ (:theorem (and
+ (equal (nth 0 (list a b c d)) a)
+ (equal (nth 1 (list a b c d)) b)
+ (equal (nth 2 (list a b c d)) c)
+ (equal (nth 3 (list a b c d)) d)))
+ (a 'rtm-or)
+ (b res)
+ (c tmp)
+ (d tmp))))))
+
+
+
+
+
+(defthm one-steps-of-execution
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (equal (execute-instruction st)
+ (generic-eql tmp v1 v2 st)))
+ :hints (("Goal"
+ :in-theory '((:definition execute-instruction))
+ :use (listinstr-of-2-has-the-two-opcodes))))
+
+(defthm two-steps-of-execution
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (equal (execute-instruction (execute-instruction st))
+ (rtm-and res tmp res (generic-eql tmp v1 v2 st))))
+ :hints (("Goal"
+ :in-theory '((:definition execute-instruction))
+ :use (listinstr-of-2-has-the-two-opcodes))))
+
+
+; Note: Below I have disabled a couple of names. This was not in the
+; original script. In the conversion from Version 2.5 to 2.6, we
+; added the case-split-limitations and choked it down from (nil nil)
+; -- the old default -- to something smaller. The first proof to
+; break was two-steps-inertia, below. In analyzing why it broke, I
+; realized that two-steps-of-execution was being :USEd but not
+; DISABLEd. So it could be rewritten away. Disabling it, however,
+; had no good effect. Then I realized that it could be rewritten away
+; by proving it again, which meant using the definition of
+; execute-instruction. So I disabled that too. And voila, the proof
+; happens very quickly, without significant case analysis -- certainly
+; without approaching the case-split-limitations. You will see a
+; similar pair of disables once more below.
+
+(defthm two-steps-inertia
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (not (equal tmp vx1))
+ (not (equal res vx1)))
+ (equal (get-cell vx1 (mem (execute-instruction (execute-instruction st))))
+ (get-cell vx1 (mem st))))
+ :hints (("Goal" :in-theory (disable execute-instruction ; (See note above.)
+ two-steps-of-execution ; (See note above.)
+ opcode one-steps-of-execution;par1 par2 par3 pcc code
+ gem-add gem-sub rtm-add rtm-sub and-update gen-eq-update)
+ :use (two-steps-of-execution))))
+
+
+
+(defthm two-steps-inertia-on-sequence-of-vars
+ (implies
+ (and
+ (equal (listinstr st 2) (rtm-eq-and v1 v2 tmp res))
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool res listvars1)))
+ (equal
+ (var-values listvars1 (mem st))
+ (var-values listvars1 (mem (execute-instruction (execute-instruction st))))))
+ :hints (("Goal"
+ :induct (var-values listvars1 (mem st))
+ :in-theory (disable listinstr-of-2-unfolding-f
+ two-steps-of-execution execute-instruction one-steps-of-execution))
+ ("Subgoal *1/2" :use (:instance two-steps-inertia (vx1 (car listvars1))))))
+
+
+(defthm two-steps-res
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (not (equal tmp v1))
+ (not (equal tmp v2))
+ (not (equal res v1))
+ (not (equal res v2))
+ (not (equal tmp res)))
+ (equal (var-value (get-cell res (mem (rtm-and res tmp res (generic-eql tmp v1 v2 st)))))
+ (boolean-to-int
+ (and
+ (int-to-bool
+ (boolean-to-int (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st))))))
+ (int-to-bool (var-value (get-cell res (mem st))))))))
+ :hints (("Goal"
+ :in-theory (e/d
+ (make-cell put-cell get-cell var-value)
+ (opcode one-steps-of-execution execute-instruction
+ int-to-bool boolean-to-int
+ gem-add gem-sub rtm-add rtm-sub )))))
+
+
+(defthm one-steps-of-execution-or
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (equal (execute-instruction st)
+ (generic-eql tmp v1 v2 st)))
+ :hints (("Goal"
+ :in-theory '((:definition execute-instruction))
+ :use (listinstr-of-2-or-has-the-two-opcodes))))
+
+(defthm two-steps-of-execution-or
+ (implies
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (equal (execute-instruction (execute-instruction st))
+ (rtm-or res tmp tmp (generic-eql tmp v1 v2 st))))
+ :hints (("Goal"
+ :in-theory '((:definition execute-instruction))
+ :use (listinstr-of-2-or-has-the-two-opcodes))))
+
+
+(defthm two-steps-inertia-or
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (not (equal tmp vx1))
+ (not (equal res vx1)))
+ (equal (get-cell vx1 (mem (execute-instruction (execute-instruction st))))
+ (get-cell vx1 (mem st))))
+ :hints (("Goal" :in-theory (disable execute-instruction ; (See note above.)
+ two-steps-of-execution-or ; (See note above.)
+ opcode one-steps-of-execution-or ;par1 par2 par3 pcc code
+ gem-add gem-sub rtm-add rtm-sub and-update gen-eq-update or-update)
+ :use (two-steps-of-execution-or))))
+
+
+
+(defthm two-steps-inertia-on-sequence-of-vars-or
+ (implies
+ (and
+ (equal (listinstr st 2) (rtm-eq-or v1 v2 tmp res))
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool res listvars1)))
+ (equal
+ (var-values listvars1 (mem st))
+ (var-values listvars1 (mem (execute-instruction (execute-instruction st))))))
+ :hints (("Goal"
+ :induct (var-values listvars1 (mem st))
+ :in-theory (disable listinstr-of-2-unfolding-f
+ two-steps-of-execution-or execute-instruction one-steps-of-execution-or))
+ ("Subgoal *1/2" :use (:instance two-steps-inertia-or (vx1 (car listvars1))))))
+
+
+(defthm two-steps-res-or
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (not (equal tmp v1))
+ (not (equal tmp v2))
+ (not (equal res v1))
+ (not (equal res v2))
+ (not (equal tmp res)))
+ (equal (var-value (get-cell res (mem (rtm-or res tmp tmp (generic-eql tmp v1 v2 st)))))
+ (boolean-to-int
+ (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st)))))))
+ :hints (("Goal"
+ :use (:theorem
+ (equal
+ (or
+ (int-to-bool
+ (boolean-to-int (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st))))))
+ (int-to-bool
+ (boolean-to-int (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st)))))))
+ (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st))))))
+ :in-theory (e/d
+ (make-cell put-cell get-cell var-value)
+ (opcode one-steps-of-execution-or execute-instruction
+ int-to-bool boolean-to-int
+ gem-add gem-sub rtm-add rtm-sub )))))
+
+
+
+(defthm execute-instruction-2-unfolding
+ (equal
+ (execute-n-instructions st 2)
+ (execute-instruction (execute-instruction st)))
+ :hints (("Goal"
+ :in-theory (current-theory 'ground-zero)
+ :use
+ ((:instance execute-n-instructions (n 2))
+ (:instance execute-n-instructions (st (execute-instruction st)) (n 1))
+ (:instance execute-n-instructions (st (execute-instruction (execute-instruction st))) (n 0))))))
+
+
+
+(defthm two-steps-res-2
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-and v1 v2 tmp res))
+ (not (equal tmp v1))
+ (not (equal tmp v2))
+ (not (equal res v1))
+ (not (equal res v2))
+ (not (equal tmp res)))
+ (equal (var-value (get-cell res (mem (execute-n-instructions st 2))))
+ (boolean-to-int
+ (and
+ (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st))))
+ (int-to-bool (var-value (get-cell res (mem st))))))))
+ :hints (("Goal" :in-theory '((:definition int-to-bool)
+ (:definition boolean-to-int))
+ :use (two-steps-res two-steps-of-execution execute-instruction-2-unfolding))))
+
+
+(defthm two-steps-res-or-2
+ (implies
+ (and
+ (equal (listinstr st 2)
+ (rtm-eq-or v1 v2 tmp res))
+ (not (equal tmp v1))
+ (not (equal tmp v2))
+ (not (equal res v1))
+ (not (equal res v2))
+ (not (equal tmp res)))
+ (equal (var-value (get-cell res (mem (execute-n-instructions st 2))))
+ (boolean-to-int
+ (equal (var-value (get-cell v1 (mem st)))
+ (var-value (get-cell v2 (mem st)))))))
+ :hints (("Goal" :in-theory '((:definition int-to-bool)
+ (:definition boolean-to-int))
+ :use (two-steps-res-or two-steps-of-execution-or execute-instruction-2-unfolding))))
+
+
+(defthm int-bool-int-cancellation
+ (equal (int-to-bool (boolean-to-int (equal v1 v2))) (equal v1 v2)))
+
+(defthm bool-int-bool-cancellation
+ (implies
+ (or (equal res 0) (equal res 1))
+ (equal (boolean-to-int (int-to-bool res)) res)))
+
+(defun eq-values (listvars1 listvars2 res mem n)
+ (if (zp n)
+ res
+ (eq-values
+ (cdr listvars1)
+ (cdr listvars2)
+ (boolean-to-int
+ (and
+ (equal (var-value (get-cell (car listvars1) mem))
+ (var-value (get-cell (car listvars2) mem)))
+ (int-to-bool res)))
+ mem
+ (1- n))))
+
+
+(defun equal-lv (listvars1 listvars2 mem n)
+ (declare (xargs :measure (acl2-count n)))
+ (if (zp n)
+ t
+ (and
+ (equal
+ (var-value (get-cell (car listvars1) mem))
+ (var-value (get-cell (car listvars2) mem)))
+ (equal-lv (cdr listvars1) (cdr listvars2) mem (1- n)))))
+
+
+(defthm case-zero
+ (equal (eq-values listvars1 listvars2 0 mem n) 0))
+
+(defthm case-one
+ (equal (eq-values listvars1 listvars2 1 mem n) (boolean-to-int (equal-lv listvars1 listvars2 mem n))))
+
+(defthm eq-values-is-equal-lv
+ (implies
+ (and
+ (or (equal res 0) (equal res 1))
+ (equal n (len listvars2))
+ (equal n (len listvars1)))
+ (equal
+ (eq-values listvars1 listvars2 res mem n)
+ (boolean-to-int
+ (and
+ (equal-lv listvars1 listvars2 mem n)
+ (int-to-bool res)))))
+ :hints (("Goal" :in-theory (disable int-to-bool boolean-to-int))))
+
+
+(defthm equal-lv-is-equal-values
+ (implies
+ (and
+ (equal n (len listvars1))
+ (equal n (len listvars2)))
+ (equal
+ (equal-lv listvars1 listvars2 mem n)
+ (equal-values
+ (var-values listvars1 mem)
+ (var-values listvars2 mem)))))
+
+
+(defthm eq-values-is-equal-values
+ (implies
+ (and
+ (or (equal res 0) (equal res 1))
+ (equal n (len listvars2))
+ (equal n (len listvars1)))
+ (equal
+ (eq-values listvars1 listvars2 res mem n)
+ (boolean-to-int
+ (and
+ (equal-values
+ (var-values listvars1 mem)
+ (var-values listvars2 mem))
+ (int-to-bool res))))))
+
+
+(defun induct-support (listvars1 listvars2 tmp res st)
+ (if
+ (endp listvars1)
+ nil
+ (cons (list (car listvars1) (car listvars2) tmp res (pcc st))
+ (induct-support
+ (cdr listvars1)
+ (cdr listvars2)
+ tmp
+ res
+ (execute-n-instructions st 2)))))
+
+(defthm support-1
+ (implies
+ (and
+ (not (endp listvars1))
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2)))
+ (and
+ (not (member-equal-bool tmp (cdr listvars1)))
+ (not (member-equal-bool tmp (cdr listvars2)))
+ (not (member-equal-bool res (cdr listvars1)))
+ (not (member-equal-bool res (cdr listvars2))))))
+
+(defthm listinstr-is-decomposed
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal
+ (listinstr (execute-n-instructions st n) m)
+ (nthcdr n (listinstr st (+ n m)))))
+ :hints (("Goal"
+ :induct (execute-n-instructions st n)
+ :in-theory (disable execute-instruction))))
+
+(defthm nthcdr-2-unfolding
+ (equal (nthcdr 2 l) (cddr l)))
+
+(defthm nthcdr2ofeqtrans2
+ (implies
+ (not (endp listvars1))
+ (equal
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res)
+ (nthcdr 2 (equality-trans2 listvars1 listvars2 tmp res))))
+ :hints (("Goal" :use
+ ( (:instance nthcdr-2-unfolding
+ (l (equality-trans2 listvars1 listvars2 tmp res)))
+ equality-trans2)
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition rtm-eq-and))))))
+
+(in-theory (disable nthcdr-2-unfolding nthcdr2ofeqtrans2 listinstr-is-decomposed))
+
+(defthm support-2a
+ (implies
+ (not (endp listvars1))
+ (equal (listinstr (execute-n-instructions st 2) (* 2 (len (cdr listvars1))))
+ (nthcdr 2 (listinstr st (* 2 (len listvars1))))))
+ :hints (("Goal"
+ :use (
+ (:instance listinstr-is-decomposed
+ (n 2)
+ (m (* 2 (len (cdr listvars1))))))
+ :in-theory (disable execute-instruction execute-instruction-2-unfolding is-mem-cell-p))))
+
+(defthm support-2
+ (implies
+ (and
+ (not (endp listvars1))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res)))
+ (equal (listinstr (execute-n-instructions st 2) (* 2 (len (cdr listvars1))))
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res)))
+ :hints (("Goal"
+ :in-theory nil
+ :use (nthcdr2ofeqtrans2 support-2a))))
+
+
+
+(defthm listinstr-append
+ (implies
+ (and
+ (integerp n)
+ (integerp m)
+ (>= m 0)
+ (>= n 0))
+ (equal
+ (listinstr st (+ m n))
+ (append (listinstr st m)
+ (listinstr (execute-n-instructions st m) n))))
+ :hints (("Goal"
+ :in-theory (disable execute-instruction))))
+
+(defthm silly-00
+ (implies
+ (and
+ (equal l (append l1 l2))
+ (>= (len l1) 2))
+ (and
+ (equal (car l1) (car l))
+ (equal (cadr l1) (cadr l)))))
+
+(defthm length-of-listintr
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (listinstr st n)) n)))
+
+(defthm first-2-instr-are-same-if-many
+ (implies
+ (and
+ (integerp le)
+ (>= le 2))
+ (and
+ (equal (car (listinstr st 2)) (car (listinstr st le)))
+ (equal (cadr (listinstr st 2)) (cadr (listinstr st le)))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :use
+ (
+ (:theorem (implies (integerp le) (equal (+ 2 -2 le) le)))
+ (:instance silly-00
+ (l1 (listinstr st 2))
+ (l2 (listinstr (execute-n-instructions st 2) (- le 2)))
+ (l (listinstr st le)))
+ (:instance length-of-listintr (n 2))
+ (:instance listinstr-append
+ (m 2)
+ (n (- le 2)))))))
+
+
+(defthm first-2-instr-are-same-if-many-inst
+ (implies
+ (not (endp listvars1))
+ (and
+ (equal (car (listinstr st 2)) (car (listinstr st (* 2 (len listvars1)))))
+ (equal (cadr (listinstr st 2)) (cadr (listinstr st (* 2 (len listvars1)))))))
+ :hints (("Goal"
+ :in-theory (current-theory 'ground-zero)
+ :use (:instance first-2-instr-are-same-if-many (le (* 2 (len listvars1))))))
+ :otf-flg t)
+
+
+
+(defthm first-two-instructions-are-eq-and
+ (implies
+ (and
+ (not (endp listvars1))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res)))
+ (equal (listinstr st 2) (rtm-eq-and (car listvars1) (car listvars2) tmp res)))
+ :hints (("Goal"
+ :in-theory (disable execute-instruction)
+ :use first-2-instr-are-same-if-many-inst)))
+
+
+
+(defthm support-3a
+ (implies
+ (and
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res))
+ (not (endp listvars1))
+ (not (endp listvars2))
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (not (equal tmp res)))
+ (equal
+ (eq-values
+ listvars1
+ listvars2
+ (var-value (get-cell res (mem st)))
+ (mem st)
+ (len listvars1))
+ (eq-values
+ (cdr listvars1)
+ (cdr listvars2)
+ (var-value (get-cell res (mem (execute-n-instructions st 2))))
+ (mem st)
+ (len (cdr listvars1)))))
+ :hints (("Goal"
+ :in-theory (disable listinstr-append listinstr-of-2-unfolding-f
+ execute-instruction one-steps-of-execution execute-instruction-2-unfolding)
+ :use
+ (first-two-instructions-are-eq-and
+ (:instance two-steps-res-2 (v1 (car listvars1)) (v2 (car listvars2)))))))
+
+
+
+
+
+(defthm support-3
+ (implies
+ (and
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res))
+ (not (endp listvars1))
+ (not (endp listvars2))
+ (equal (len listvars1) (len listvars2))
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (not (equal tmp res)))
+ (equal
+ (eq-values
+ listvars1
+ listvars2
+ (var-value (get-cell res (mem st)))
+ (mem st)
+ (len listvars1))
+ (eq-values
+ (cdr listvars1)
+ (cdr listvars2)
+ (var-value (get-cell res (mem (execute-n-instructions st 2))))
+ (mem (execute-instruction (execute-instruction st)))
+ (len (cdr listvars1)))))
+ :hints (("Goal"
+ :in-theory (disable listinstr-append listinstr-of-2-unfolding-f
+ execute-instruction one-steps-of-execution execute-instruction-2-unfolding)
+ :use
+ (first-two-instructions-are-eq-and
+ (:instance two-steps-inertia-on-sequence-of-vars
+ (v1 (car listvars1))
+ (v2 (car listvars2))
+ (listvars1 (cdr listvars1)))
+ (:instance two-steps-inertia-on-sequence-of-vars
+ (v1 (car listvars1))
+ (v2 (car listvars2))
+ (listvars1 (cdr listvars2)))
+ (:instance two-steps-res-2 (v1 (car listvars1)) (v2 (car listvars2)))))))
+
+
+
+
+
+
+
+
+(defthm value-of-result-after-executing-2n-instr
+ (implies
+ (and
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (equal (len listvars1) (len listvars2))
+ (not (equal tmp res))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res)))
+ (equal
+ (var-value
+ (get-cell
+ res
+ (mem (execute-n-instructions st (* 2 (len listvars1))))))
+ (eq-values
+ listvars1
+ listvars2
+ (var-value (get-cell res (mem st)))
+ (mem st)
+ (len listvars1))))
+ :hints (("Goal"
+ :in-theory (disable execute-instruction is-mem-cell-p)
+ :induct (induct-support listvars1 listvars2 tmp res st))
+ ("Subgoal *1/2" :use (support-1 support-2 support-3))))
+
+
+(defthm value-of-result-after-executing-2n-instr-fin
+ (implies
+ (and
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (equal (len listvars1) (len listvars2))
+ (or
+ (equal (var-value (get-cell res (mem st))) 0)
+ (equal (var-value (get-cell res (mem st))) 1))
+ (not (equal tmp res))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans2 listvars1 listvars2 tmp res)))
+ (equal
+ (var-value
+ (get-cell
+ res
+ (mem (execute-n-instructions st (* 2 (len listvars1))))))
+ (boolean-to-int
+ (and
+ (equal-values
+ (var-values listvars1 (mem st))
+ (var-values listvars2 (mem st)))
+ (int-to-bool (var-value (get-cell res (mem st))))))))
+ :hints (("Goal"
+ :in-theory (disable execute-instruction is-mem-cell-p)
+ :use (value-of-result-after-executing-2n-instr))))
+(defthm nthcdr2ofeqtrans3
+ (equal
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res)
+ (nthcdr 2 (equality-trans3 listvars1 listvars2 tmp res)))
+ :hints (("Goal" :use
+ ( (:instance nthcdr-2-unfolding
+ (l (equality-trans3 listvars1 listvars2 tmp res)))
+ equality-trans3)
+ :in-theory (union-theories (current-theory 'ground-zero) '((:definition rtm-eq-or))))))
+
+(in-theory (disable nthcdr-2-unfolding nthcdr2ofeqtrans3 listinstr-is-decomposed))
+
+
+(defthm support-2b
+ (implies
+ (and
+ (not (endp listvars1))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans3 listvars1 listvars2 tmp res)))
+ (equal (listinstr (execute-n-instructions st 2) (* 2 (len (cdr listvars1))))
+ (equality-trans2 (cdr listvars1) (cdr listvars2) tmp res)))
+ :hints (("Goal"
+ :in-theory nil
+ :use (nthcdr2ofeqtrans3 support-2a))))
+
+
+
+(defthm first-two-instructions-are-eq-or
+ (implies
+ (and
+ (not (endp listvars1))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans3 listvars1 listvars2 tmp res)))
+ (equal (listinstr st 2) (rtm-eq-or (car listvars1) (car listvars2) tmp res)))
+ :hints (("Goal"
+ :in-theory (disable nthcdr nthcdr2ofeqtrans3 execute-instruction
+ ;; v2-6 mod:
+ listinstr-append)
+ :use first-2-instr-are-same-if-many-inst)))
+
+
+
+
+(defthm support4
+ (implies
+ (not (endp listvars1))
+ (EQUAL
+ (EXECUTE-N-INSTRUCTIONS (EXECUTE-N-INSTRUCTIONS ST 2) (* 2 (LEN (CDR LISTVARS1))))
+ (EXECUTE-N-INSTRUCTIONS ST (* 2 (LEN LISTVARS1)))))
+ :hints (("Goal"
+ :in-theory (current-theory 'ground-zero)
+ :use
+ (:instance execute-n-instruction-decomposition
+ (n1 2)
+ (n2 (* 2 (1- (len listvars1))))))
+ ("Subgoal 1"
+ :use ((:theorem (equal (+ -2 2 (* 2 (LEN (CDR LISTVARS1))))
+ (* 2 (LEN (CDR LISTVARS1)))))
+ (:theorem (equal (+ 2 (* 2 (LEN (CDR LISTVARS1))))
+ (+ 2 -2 2 (* 2 (LEN (CDR LISTVARS1))))))))))
+
+
+(defthm value-of-result-after-executing-2n-+2instr-fin
+ (implies
+ (and
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (equal (len listvars1) (len listvars2))
+ (not (endp listvars1))
+ (not (equal tmp res))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans3 listvars1 listvars2 tmp res)))
+ (equal
+ (var-value
+ (get-cell
+ res
+ (mem (execute-n-instructions st (* 2 (len listvars1))))))
+ (boolean-to-int
+ (and
+ (equal-values
+ (var-values (cdr listvars1) (mem (execute-n-instructions st 2)))
+ (var-values (cdr listvars2) (mem (execute-n-instructions st 2))))
+ (int-to-bool
+ (boolean-to-int
+ (equal (var-value (get-cell (car listvars1) (mem st)))
+ (var-value (get-cell (car listvars2) (mem st))))))))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition member-equal-bool)
+ (:definition boolean-to-int)))
+ :use
+ (
+ support-2b
+ support4
+ first-two-instructions-are-eq-or
+ (:instance value-of-result-after-executing-2n-instr-fin
+ (st (execute-n-instructions st 2))
+ (listvars1 (cdr listvars1))
+ (listvars2 (cdr listvars2)))
+ (:instance two-steps-res-or-2
+ (v1 (car listvars1))
+ (v2 (car listvars2)))))))
+
+
+(defthm at-the-end-equality-on-all
+ (implies
+ (and
+ (not (endp listvars1))
+ (equal (len listvars1) (len listvars2)))
+ (equal
+ (boolean-to-int
+ (equal-values
+ (var-values listvars1 (mem st ))
+ (var-values listvars2 (mem st ))))
+ (boolean-to-int
+ (and
+ (equal-values
+ (var-values (cdr listvars1) (mem st ))
+ (var-values (cdr listvars2) (mem st )))
+ (int-to-bool
+ (boolean-to-int
+ (equal (var-value (get-cell (car listvars1) (mem st)))
+ (var-value (get-cell (car listvars2) (mem st)))))))))))
+
+
+
+
+
+
+
+(defthm value-of-result-after-executing-2n-+2instr-finale
+ (implies
+ (and
+ (not (member-equal-bool tmp listvars1))
+ (not (member-equal-bool tmp listvars2))
+ (not (member-equal-bool res listvars1))
+ (not (member-equal-bool res listvars2))
+ (equal (len listvars1) (len listvars2))
+ (not (endp listvars1))
+ (not (equal tmp res))
+ (equal (listinstr st (* 2 (len listvars1)))
+ (equality-trans3 listvars1 listvars2 tmp res)))
+ (equal
+ (var-value
+ (get-cell
+ res
+ (mem (execute-n-instructions st (* 2 (len listvars1))))))
+ (boolean-to-int
+ (equal-values
+ (var-values listvars1 (mem st ))
+ (var-values listvars2 (mem st ))))))
+ :hints (("Goal"
+ :in-theory
+ (union-theories (current-theory 'ground-zero)
+ '((:rewrite execute-instruction-2-unfolding)
+ (:definition member-equal-bool)))
+ :use (
+ (:instance two-steps-inertia-on-sequence-of-vars-or
+ (v1 (car listvars1))
+ (v2 (car listvars2))
+ (listvars1 (cdr listvars1)))
+ (:instance two-steps-inertia-on-sequence-of-vars-or
+ (v1 (car listvars1))
+ (v2 (car listvars2))
+ (listvars1 (cdr listvars2)))
+ first-two-instructions-are-eq-or
+ value-of-result-after-executing-2n-+2instr-fin
+ at-the-end-equality-on-all))))
+
+
+(in-theory (disable
+listinstr-of-2-unfolding-f listinstr-of-2-has-the-two-instructions listinstr-of-2-has-the-two-opcodes
+listinstr-of-2-or-the-two-instructions listinstr-of-2-or-has-the-two-opcodes
+one-steps-of-execution two-steps-of-execution two-steps-inertia
+two-steps-inertia-on-sequence-of-vars two-steps-res
+one-steps-of-execution-or two-steps-of-execution-or two-steps-inertia-or
+two-steps-inertia-on-sequence-of-vars-or two-steps-res-or
+execute-instruction-2-unfolding two-steps-res-2 two-steps-res-or-2
+int-bool-int-cancellation bool-int-bool-cancellation case-zero case-one
+equal-lv-is-equal-values eq-values-is-equal-values
+support-1 listinstr-is-decomposed nthcdr-2-unfolding support-2a support-2
+listinstr-append silly-00 length-of-listintr
+first-2-instr-are-same-if-many first-2-instr-are-same-if-many-inst
+first-two-instructions-are-eq-and support-3a support-3
+value-of-result-after-executing-2n-instr value-of-result-after-executing-2n-instr-fin
+equality-trans3 nthcdr2ofeqtrans3 support-2b
+first-two-instructions-are-eq-or support4
+value-of-result-after-executing-2n-+2instr-fin
+at-the-end-equality-on-all value-of-result-after-executing-2n-+2instr-finale))
+
+(defun pars1-instructions (listinstr)
+ (if (endp listinstr)
+ nil
+ (cons (par1 (car listinstr))
+ (pars1-instructions (cdr listinstr)))))
+
+(defthm pars1-instruction-is-listpars1
+ (equal
+ (pars1-instructions (listinstr st n))
+ (listpars1 st n)))
+
+
+
+(defun eqtr2 (l1 tmp res)
+ (if
+ (endp l1)
+ nil
+ (append (list tmp res) (eqtr2 (cdr l1) tmp res))))
+
+(defun eqtr3 (l1 tmp res)
+ (append (list tmp res) (eqtr2 (cdr l1) tmp res)))
+
+(defthm cgr1 (equal (pars1-instructions (equality-trans2 l1 l2 tmp res)) (eqtr2 l1 tmp res)))
+
+(defthm pars1iappend
+ (equal (pars1-instructions (append l1 l2))
+ (append (pars1-instructions l1) (pars1-instructions l2))))
+
+(defthm parsi-instructions-of-eq3-are-eqtr3
+ (equal (pars1-instructions (equality-trans3 l1 l2 tmp res)) (eqtr3 l1 tmp res))
+ :hints (("Subgoal 2" :in-theory nil)
+ ("Goal" :use (eqtr3
+ (:instance pars1iappend
+ (l1 (rtm-eq-or (car l1) (car l2 ) tmp res))
+ (l2 (equality-trans2 (cdr l1) (cdr l2) tmp res)))
+ (:instance cgr1 (l1 (cdr l1)) (l2 (cdr l2)))
+ (:theorem (equal (pars1-instructions (rtm-eq-or (car l1) (car l2) tmp res)) (list tmp res)))
+ (:instance equality-trans3 (listvars1 l1) (listvars2 l2))))))
+
+
+(defthm only-tmp-res-into-eqtr3
+ (implies
+ (and
+ (not (equal v tmp))
+ (not (equal v res)))
+ (not (member-equal-bool v (eqtr3 l1 tmp res))))
+ :otf-flg t)
+
+
+
+
+
+(defthm equality-trans3-has-par1-made-of-tmp-res
+ (implies
+ (and
+ (not (equal v tmp))
+ (not (equal v res))
+ (equal
+ (listinstr st n)
+ (equality-trans3 l1 l2 tmp res)))
+ (not (member-equal-bool v (listpars1 st n))))
+:hints (("Goal" :in-theory nil
+ :use (pars1-instruction-is-listpars1
+ parsi-instructions-of-eq3-are-eqtr3
+ only-tmp-res-into-eqtr3))))
+
+
+
+
+
+
+
+
+(DEFUN LISTOPCODES (ST N)
+ (IF (ZP N)
+ NIL
+ (CONS (OPCODE (NTH (PCC ST) (CODE ST)))
+ (LISTOPCODES (EXECUTE-INSTRUCTION ST)
+ (1- N)))))
+(defun all-par1ops (opcodes)
+ (if (endp opcodes)
+ t
+ (and
+ (or
+ (equal (car opcodes) 'rtm-and)
+ (equal (car opcodes) 'rtm-or)
+ (equal (car opcodes) 'rtm-equ)
+ (equal (car opcodes) 'rtm-add)
+ (equal (car opcodes) 'rtm-sub))
+ (all-par1ops (cdr opcodes)))))
+
+(defun all-par1opso (st n)
+ (declare (xargs :measure (acl2-count n)))
+ (if (zp n)
+ t
+ (and
+ (or
+ (null (NTH (PCC ST) (CODE ST)))
+ (equal (OPCODE (NTH (PCC ST) (CODE ST))) 'rtm-and)
+ (equal (OPCODE (NTH (PCC ST) (CODE ST))) 'rtm-or)
+ (equal (OPCODE (NTH (PCC ST) (CODE ST))) 'rtm-equ)
+ (equal (OPCODE (NTH (PCC ST) (CODE ST))) 'rtm-add)
+ (equal (OPCODE (NTH (PCC ST) (CODE ST))) 'rtm-sub))
+ (all-par1opso (execute-instruction st) (1- n)))))
+
+
+
+(defthm if-only-par1-involving-ops-are-there-then-other-vars-are-untouched
+ (implies
+ (and
+ (all-par1opso st n)
+ (not (member-equal-bool v (listpars1 st n))))
+ (equal (get-cell v (mem st)) (get-cell v (mem (execute-n-instructions st n)))))
+ :hints (("Goal" :in-theory (disable execute-instruction))
+ ("Subgoal *1/2" :use (:instance only-par1-is-involved-rtm
+ (gstate st)
+ (var v)))))
+
+
+
+
+(defun pars1-opcodes (listinstr)
+ (if (endp listinstr)
+ nil
+ (cons (opcode (car listinstr))
+ (pars1-opcodes (cdr listinstr)))))
+
+(defthm pars1-opcodes-is-listopcodes
+ (equal
+ (pars1-opcodes (listinstr st n))
+ (listopcodes st n)))
+
+(defun eqtr2o (l1)
+ (if
+ (endp l1)
+ nil
+ (append (list 'rtm-equ 'rtm-and) (eqtr2o (cdr l1)))))
+
+(defun eqtr3o (l1)
+ (append (list 'rtm-equ 'rtm-or) (eqtr2o (cdr l1))))
+
+(defthm cgr2 (equal (pars1-opcodes (equality-trans2 l1 l2 tmp res)) (eqtr2o l1)))
+
+(defthm pars1oappend
+ (equal (pars1-opcodes (append l1 l2))
+ (append (pars1-opcodes l1) (pars1-opcodes l2))))
+
+(defthm parsi-opcodes-of-eq3-are-eqtr3o
+ (equal (pars1-opcodes (equality-trans3 l1 l2 tmp res)) (eqtr3o l1))
+ :hints (("Subgoal 2" :in-theory nil)
+ ("Goal" :use (eqtr3o
+ (:instance pars1oappend
+ (l1 (rtm-eq-or (car l1) (car l2 ) tmp res))
+ (l2 (equality-trans2 (cdr l1) (cdr l2) tmp res)))
+ (:instance cgr2 (l1 (cdr l1)) (l2 (cdr l2)))
+ (:theorem (equal (pars1-opcodes (rtm-eq-or (car l1) (car l2) tmp res)) (list 'rtm-equ 'rtm-or)))
+ (:instance equality-trans3 (listvars1 l1) (listvars2 l2))))))
+
+
+(defthm eqtr3o-makes-par1-instrs
+ (all-par1ops (eqtr3o l))
+ :otf-flg t)
+
+
+
+(defthm opcodes-on-par1-imply-instructions-on-par1
+ (implies
+ (all-par1ops (pars1-opcodes (listinstr st n)))
+ (all-par1opso st n)))
+
+(defthm if-instructions-are-trans3-and-v-non-in-par1-v-untouched
+ (implies
+ (and
+ (equal (listinstr st n)
+ (equality-trans3 l1 l2 tmp res))
+ (not (member-equal-bool v (listpars1 st n))))
+ (equal
+ (get-cell v (mem st))
+ (get-cell v (mem (execute-n-instructions st n)))))
+ :hints (("Goal"
+ :in-theory nil
+ :use
+ (opcodes-on-par1-imply-instructions-on-par1
+ pars1-opcodes-is-listopcodes
+ parsi-opcodes-of-eq3-are-eqtr3o
+ (:instance eqtr3o-makes-par1-instrs (l l1))
+ if-only-par1-involving-ops-are-there-then-other-vars-are-untouched))))
+
+
+(defthm equality-trans3-means-touching-just-tmp-res
+ (implies
+ (and
+ (not (equal v tmp))
+ (not (equal v res))
+ (equal
+ (listinstr st n)
+ (equality-trans3 l1 l2 tmp res)))
+ (equal
+ (get-cell v (mem st))
+ (get-cell v (mem (execute-n-instructions st n)))))
+ :hints (("Goal"
+ :use
+ (if-instructions-are-trans3-and-v-non-in-par1-v-untouched
+ equality-trans3-has-par1-made-of-tmp-res))))
+
+
+
+
+
+(in-theory (disable
+ pars1-instructions pars1-instruction-is-listpars1
+ eqtr2 eqtr3 cgr1 pars1iappend parsi-instructions-of-eq3-are-eqtr3
+ only-tmp-res-into-eqtr3 equality-trans3-has-par1-made-of-tmp-res
+ all-par1ops all-par1opso
+ if-only-par1-involving-ops-are-there-then-other-vars-are-untouched
+ pars1-opcodes pars1-opcodes-is-listopcodes
+ eqtr2o eqtr3o cgr2 pars1oappend parsi-opcodes-of-eq3-are-eqtr3o
+ eqtr3o-makes-par1-instrs opcodes-on-par1-imply-instructions-on-par1
+ if-instructions-are-trans3-and-v-non-in-par1-v-untouched))
+
+
+
+(defthm lemma2-only-adds-in-rtm-equ
+ (implies
+ (and
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (good-translation-gem-rtm gstate rstate m))
+ (and
+ (equal (listinstr rstate (* 2 (len *rns*)) )
+ (equality-trans3
+ (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*))
+ (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*))
+ 'tmp
+ (car (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m))))
+ (not (equal
+ (par1 (nth (pcc gstate) (code gstate)))
+ (par2 (nth (pcc gstate) (code gstate)))))
+ (not (equal
+ (par1 (nth (pcc gstate) (code gstate)))
+ (par3 (nth (pcc gstate) (code gstate)))))))
+ :hints (("Goal" :expand
+ ( (good-translation-gem-rtm gstate rstate m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate)))
+ :in-theory nil))
+ :rule-classes nil)
+
+
+
+(defthm lemma1-different-vars-do-not-belong-ref
+ (implies
+ (and
+ (true-listp m)
+ (not (endp (rtmintvars-i gvar2 m)))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (assoc-equal gvar2 m)
+ (not (equal gvar1 gvar2))
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (not (equal (nth idx1 (rtmintvars-i gvar1 m))
+ (car (rtmintvars-i gvar2 m)))))
+ :hints (("Goal" :in-theory nil
+ :use (lemma1-different-vars-do-not-belong
+ (:instance member-equal-bool
+ (el (nth idx1 (rtmintvars-i gvar1 m)))
+ (l (rtmintvars-i gvar2 m)))))))
+
+(defun no-tmp-into-mapping (m)
+ (if (endp m)
+ t
+ (and
+ (not (member-equal-bool 'tmp (rtmintvars-0 m)))
+ (no-tmp-into-mapping (cdr m)))))
+
+(defthm a-variable-is-never-tmp
+ (implies
+ (and
+ (no-tmp-into-mapping m)
+ (assoc-equal gvar1 m)
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (not (equal (nth idx1 (rtmintvars-i gvar1 m)) 'tmp)))
+ :hints (("Goal" :in-theory (enable rtmintvars-0))))
+
+
+(defthm an-m-entry-is-never-nil
+ (implies
+ (and
+ (true-listp m)
+ (m-entries-point-to-good-rtm-var-sets m rtm-mem)
+ (assoc-equal var m))
+ (not (endp (rtmintvars-i var m))))
+ :hints (("Goal" :in-theory (enable rtmintvars-0))))
+
+
+(defthm rtm-variable-of-other-cell-untouched-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (no-tmp-into-mapping m)
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (in-range idx1 (rtmintvars-i gvar1 m)))
+ (equal (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem rstate))
+ (get-cell (nth idx1 (rtmintvars-i gvar1 m)) (mem (execute-n-instructions rstate (* 2 (len *rns*)))))))
+ :hints (("Goal" :in-theory (current-theory 'ground-zero)
+ :expand ( (in-range (pcc gstate) (code gstate))
+ (good-translation-gem-rtm gstate rstate m) )
+ :use (
+ (:instance a-variable-is-never-tmp (gvar1 gvar1))
+ (:instance an-m-entry-is-never-nil
+ (rtm-mem (mem rstate))
+ (var (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance equality-trans3-means-touching-just-tmp-res
+ (v (nth idx1 (rtmintvars-i gvar1 m)))
+ (l1 (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)))
+ (l2 (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)))
+ (st rstate)
+ (tmp 'tmp)
+ (res (car (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)))
+ (n (* 2 (len *rns*))))
+ (:instance lemma1-different-vars-do-not-belong-ref (gvar2 (par1 (nth (pcc gstate) (code gstate)))))))))
+
+
+
+(defthm rtm-variables-of-other-cell-untouched-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (>= (pcc rstate) 0)
+ (rtm-statep rstate)
+ (good-translation-gem-rtm gstate rstate m)
+ (in-range (pcc gstate) (code gstate))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m)
+ (true-listp m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (assoc-equal gvar1 m)
+ (true-listp (rtmintvars-i gvar1 m))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))))
+ (equal-get-cells
+ (rtmintvars-i gvar1 m) (mem rstate) (mem (execute-n-instructions rstate (* 2 (len *rns*))))))
+ :hints (("Goal" :in-theory nil
+ :use ( (:instance rtm-variable-of-other-cell-untouched-equ
+ (idx1 (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (* 2 (len *rns*)))))) )))
+ ("Goal'" :cases ( (in-range
+ (idx-different-cell
+ (rtmintvars-i gvar1 m)
+ (mem rstate)
+ (mem (execute-n-instructions rstate (* 2 (len *rns*)))))
+ (rtmintvars-i gvar1 m))))
+ ("Subgoal 2" :in-theory '((:rewrite if-bad-index-not-in-range-then-every-equal)))
+ ("Subgoal 1" :in-theory '((:forward-chaining if-bad-index-in-range-then-cells-must-be-different)))))
+
+
+
+(defthm properies-of-type-and-existence-of-current-args-equ
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ))
+ (and
+ (equal (var-type (get-cell (par1 (nth (pcc gstate) (code gstate))) (mem gstate))) 'Bool)
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par2 (nth (pcc gstate) (code gstate))) (mem gstate))
+ (assoc-equal (par3 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))
+ :rule-classes nil)
+
+
+(defthm par1-of-current-instruction-is-into-mapping-equ
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (in-range (pcc gstate) (code gstate)))
+ (assoc-equal (par1 (nth (pcc gstate) (code gstate))) m))
+ :hints (("Goal" :in-theory (enable get-cell)
+ :use (properies-of-type-and-existence-of-current-args-equ
+ (:instance inclusion-trans
+ (v (par1 (nth (pcc gstate) (code gstate))))
+ (m1 (mem gstate))
+ (m2 m))
+ (:instance in-range-instruction-is-gem-instruction
+ (pcc (pcc gstate))
+ (code (code gstate))
+ (mem (mem gstate)))))))
+
+
+
+
+(defthm teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (assoc-equal gvar1 m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (not (equal gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))
+ (type-i gvar1 m)))
+ :hints (("Goal"
+ :in-theory '((:definition good-translation-gem-rtm))
+ :use (
+ par1-of-current-instruction-is-into-mapping-equ
+ (:instance correct-wrt-arity-has-rtmintvars-i-tl (mem (mem gstate)))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate)))
+ (:instance in-range (idx (pcc gstate)) (l (code gstate)))
+ (:instance in-range (idx (pcc rstate)) (l (code rstate)))
+ rtm-variables-of-other-cell-untouched-equ
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata
+ (:instance equal-get-cells-implies-equal-values-and-attributes-still-works
+ (gemcell (get-cell gvar1 (mem gstate)))
+ (lcell (rtmintvars-i gvar1 m))
+ (mem1 (mem rstate))
+ (mem2 (mem (execute-n-instructions rstate (* 2 (len *rns*)))))
+ (type (type-i gvar1 m)))))))
+
+
+(defthm posinrg-equ
+ (implies
+ (and
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (in-range (pcc gstate) (code gstate)))
+ (and
+ (in-range (pos-equal-0 (par1 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par2 (nth (pcc gstate) (code gstate))) m) m)
+ (in-range (pos-equal-0 (par3 (nth (pcc gstate) (code gstate))) m) m)))
+ :hints (("Goal" :use (properies-of-type-and-existence-of-current-args-equ
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance assoc-means-pos-in-range
+ (el (par1 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par2 (nth (pcc gstate) (code gstate))))
+ (l m))
+ (:instance assoc-means-pos-in-range
+ (el (par3 (nth (pcc gstate) (code gstate))))
+ (l m)))))
+ :rule-classes nil)
+
+
+(defthm equal-eq-update-norest-afetr-one-instr
+ (implies
+ (and
+ (gem-statep gstate)
+ (in-range (pcc gstate) (code gstate))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (good-translation-gem-rtm gstate rstate m)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (equal (get-cell gvar1 (mem (execute-instruction gstate)))
+ (gen-eq-update gvar1 gvar2 gvar3 (mem gstate))))
+ :hints (("Goal" :in-theory (e/d (put-cell get-cell)
+ (par1 par2 par3 par4 opcode pcc code nth gem-instruction-list-p
+ gen-eq-update sum-and-update sub-and-update sub-and-update-norest sum-and-update-norest))))
+ :rule-classes nil)
+
+(DEFTHM mem-cellity-of-current-gem-args-equ
+ (IMPLIES
+ (AND (GEM-STATEP GSTATE)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (IN-RANGE (PCC GSTATE) (CODE GSTATE)))
+ (AND (is-mem-cell-p (get-cell (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR2 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))
+ (is-mem-cell-p (get-cell (PAR3 (NTH (PCC GSTATE) (CODE GSTATE))) (mem gstate)))))
+ :HINTS
+ (("Goal"
+ :USE
+ (:INSTANCE IN-RANGE-INSTRUCTION-IS-GEM-INSTRUCTION
+ (PCC (PCC GSTATE))
+ (CODE (CODE GSTATE))
+ (MEM (MEM GSTATE))))))
+
+
+
+
+(DEFTHM
+ VAR-ATTRIBUTES-OF-1-VARIABLE-IS-ONE-ELEMENT-LIST-OF-VAR-ATTRIBUTE
+ (IMPLIES (AND (TRUE-LISTP VARS)
+ (EQUAL (LEN VARS) 1))
+ (EQUAL (VAR-ATTRIBUTES VARS MEM)
+ (LIST (VAR-ATTRIBUTE (GET-CELL (CAR VARS) MEM)))))
+ :HINTS
+ (("Subgoal *1/2.2"
+ :USE
+ (:THEOREM (IMPLIES (AND (TRUE-LISTP VARS)
+ (EQUAL (LEN VARS) 1))
+ (AND (EQUAL (LEN (CDR VARS)) 0)
+ (TRUE-LISTP (CDR VARS))))))))
+
+
+(defthm equal-values-and-attributes-in-boolean-case
+ (implies
+ (equal (type-expected rtmvars) 'Bool)
+ (equal
+ (equal-values-and-attributes gcell rtmvars rtmmem 'Bool)
+ (and
+ (equal
+ (var-value (get-cell (car rtmvars) rtmmem))
+ (var-value gcell))
+ (equal
+ (var-attribute gcell)
+ (var-attribute (get-cell (car rtmvars) rtmmem)))))))
+
+
+
+
+
+(defthm type-is-for-pars-equ
+ (implies
+ (and
+ (true-listp m)
+ (vars-inclusion (mem gstate) m)
+ (gem-statep gstate)
+ (correct-wrt-arity m (mem gstate))
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (equal gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (equal gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (in-range (pcc gstate) (code gstate)))
+ (equal (type-i gvar1 m) 'bool))
+ :hints (("Goal"
+ :in-theory nil ;(current-theory 'ground-zero)
+ :use ( properies-of-type-and-existence-of-current-args-equ
+ (:instance type-i-is-vartyper (gvar1 gvar1) (mem (mem gstate)))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate))))))))
+:rule-classes nil)
+
+
+
+
+
+(defthm goal15
+(IMPLIES
+ (INTEGERP VAR-VALUE-GCELL2)
+ (EQUAL (BUILD-VALUES-BY-RNS-EXTENDED-FOR-NIL VAR-VALUE-GCELL2
+ '(11 13 15 17 19))
+ (LIST (MOD VAR-VALUE-GCELL2 11)
+ (MOD VAR-VALUE-GCELL2 13)
+ (MOD VAR-VALUE-GCELL2 15)
+ (MOD VAR-VALUE-GCELL2 17)
+ (MOD VAR-VALUE-GCELL2 19))))
+:hints (("Goal" :use (
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns '(11 13 15 17 19)))
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns '(13 15 17 19)))
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns '(15 17 19)))
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns '(17 19)))
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns '(19)))
+ (:instance build-values-by-rns-extended-for-nil
+ (gem-value VAR-VALUE-GCELL2)
+ (rns nil)))))
+:rule-classes nil)
+
+(defthm var-values-of-n-list
+ (equal
+ (var-values (make-n-list gvar n) mem)
+ (make-n-list (var-value (get-cell gvar mem)) n))
+ :rule-classes nil)
+
+(defthm make-n-list-expansion-5
+ (equal
+ (make-n-list el 5)
+ (list el el el el el))
+ :hints (("Goal" :use
+ ( (:instance make-n-list (n 5))
+ (:instance make-n-list (n 4))
+ (:instance make-n-list (n 3))
+ (:instance make-n-list (n 2))
+ (:instance make-n-list (n 1))
+ (:instance make-n-list (n 0)) ) ))
+ :rule-classes nil)
+
+
+
+(defthm subgoal41
+(IMPLIES
+ (EQUAL (VAR-VALUE (GET-CELL RTMINTVARS-I-GVAR3 RTMMEM))
+ 1)
+ (EQUAL (VAR-VALUES (MAKE-N-LIST RTMINTVARS-I-GVAR3 5)
+ RTMMEM)
+ '(1 1 1 1 1)))
+:hints (("Goal" :use ( (:instance make-n-list-expansion-5 (el (VAR-VALUE (GET-CELL RTMINTVARS-I-GVAR3 RTMMEM))))
+ (:instance var-values-of-n-list
+ (gvar RTMINTVARS-I-GVAR3)
+ (n 5)
+ (mem rtmmem)))))
+:rule-classes nil)
+
+(defthm subgoal21
+(IMPLIES
+ (EQUAL (VAR-VALUE (GET-CELL RTMINTVARS-I-GVAR3 RTMMEM))
+ 0)
+ (EQUAL (VAR-VALUES (MAKE-N-LIST RTMINTVARS-I-GVAR3 5)
+ RTMMEM)
+ '(0 0 0 0 0)))
+:hints (("Goal" :use ( (:instance make-n-list-expansion-5 (el (VAR-VALUE (GET-CELL RTMINTVARS-I-GVAR3 RTMMEM))))
+ (:instance var-values-of-n-list
+ (gvar RTMINTVARS-I-GVAR3)
+ (n 5)
+ (mem rtmmem)))))
+:rule-classes nil)
+
+
+
+(defthm var-values-of-evmakelist-is-rns-anyway
+ (implies
+ (and
+ (is-mem-cell-p gcell2)
+ (equal (type-expected rtmintvars-i-gvar2) (var-type gcell2))
+ (equal-values-and-attributes gcell2 rtmintvars-i-gvar2 rtmmem (var-type gcell2)))
+ (equal
+ (var-values (eventually-make-list rtmintvars-i-gvar2 (len *rns*)) rtmmem)
+ (build-values-by-rns (var-value gcell2) *rns*)))
+ :hints (("Goal" :in-theory (enable my-or-2))
+ ("Subgoal 5'''" :use (:instance goal15 (var-value-gcell2 (var-value gcell2))))
+; fcd/Satriani v3.7 Moore - used to Subgoal 4.1
+ ("Subgoal 1.1" :use subgoal41)
+; fcd/Satriani v3.7 Moore - used to Subgoal 2.1
+ ("Subgoal 3.1" :use subgoal21)))
+
+
+
+(defthm ax-on-rns-values
+ (implies
+ (and
+ (natp gval1)
+ (< gval1 (prod *rns*))
+ (natp gval2)
+ (< gval2 (prod *rns*))
+ (not (equal gval1 gval2)))
+ (not (equal (build-values-by-rns gval1 *rns*) (build-values-by-rns gval2 *rns*))))
+ :hints (("Goal" :use ( fact-bout-rns
+ (:instance crt-inversion (val gval1) (rns *rns*))
+ (:instance crt-inversion (val gval2) (rns *rns*))))))
+
+(defthm hlp1
+ (implies
+ (and
+ (is-mem-cell-p cell)
+ (bounded-value cell))
+ (and
+ (natp (var-value cell))
+ (< (var-value cell) (prod *rns*))))
+ :rule-classes nil)
+
+(defthm equal-equality-of-var-values-euqlity-of-evlists
+ (implies
+ (and
+ (is-mem-cell-p gcell2)
+ (is-mem-cell-p gcell3)
+ (bounded-value gcell2)
+ (bounded-value gcell3)
+ (equal (type-expected rtmintvars-i-gvar2) (var-type gcell2))
+ (equal (type-expected rtmintvars-i-gvar3) (var-type gcell3))
+ (equal-values-and-attributes gcell2 rtmintvars-i-gvar2 rtmmem (var-type gcell2))
+ (equal-values-and-attributes gcell3 rtmintvars-i-gvar3 rtmmem (var-type gcell3)))
+ (equal
+ (equal
+ (var-value gcell2)
+ (var-value gcell3) )
+ (equal
+ (var-values (eventually-make-list rtmintvars-i-gvar2 (len *rns*)) rtmmem)
+ (var-values (eventually-make-list rtmintvars-i-gvar3 (len *rns*)) rtmmem))))
+ :hints (("Goal"
+ :in-theory nil
+ :use
+ ( (:instance hlp1 (cell gcell2))
+ (:instance hlp1 (cell gcell3))
+ (:instance ax-on-rns-values
+ (gval1 (var-value gcell2))
+ (gval2 (var-value gcell3)))
+ (:instance var-values-of-evmakelist-is-rns-anyway
+ (gcell2 gcell2)
+ (rtmintvars-i-gvar2 rtmintvars-i-gvar2))
+ (:instance var-values-of-evmakelist-is-rns-anyway
+ (gcell2 gcell3)
+ (rtmintvars-i-gvar2 rtmintvars-i-gvar3))))))
+
+(in-theory (disable ax-on-rns-values))
+
+
+
+
+
+(defthm length-of-makelist-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0))
+ (equal (len (make-n-list l n)) n)))
+
+(defthm if-type-exepcted-is-ok-eventually-always-has-len-of-rns
+ (implies
+ (my-or-2
+ (equal (type-expected l) 'Bool)
+ (equal (type-expected l) 'Int))
+ (equal (len (eventually-make-list l (len *rns*))) (len *rns*))))
+
+(defthm tmp-never-appears
+ (implies
+ (and
+ (no-tmp-into-mapping m)
+ (assoc-equal gvar1 m))
+ (not (member-equal-bool 'tmp (eventually-make-list (rtmintvars-i gvar1 m) n))))
+ :hints (("Goal" :in-theory (enable rtmintvars-0))))
+
+(defthm tmp-never-appears-simple
+ (implies
+ (and
+ (no-tmp-into-mapping m)
+ (assoc-equal gvar1 m))
+ (not (member-equal-bool 'tmp (rtmintvars-i gvar1 m) )))
+ :hints (("Goal" :in-theory (enable rtmintvars-0))))
+
+(defthm type-of-a-mem-cell
+ (implies
+ (is-mem-cell-p cell)
+ (my-or-2
+ (equal (var-type cell) 'Bool)
+ (equal (var-type cell) 'Int)))
+ :hints (("Goal" :in-theory (enable my-or-2)))
+ :rule-classes nil)
+
+
+(defthm sillllly
+ (equal (make-n-list l1 1) (list l1))
+ :hints (("Goal" :use (:instance make-n-list (el l1) (n 1))))
+ :rule-classes nil)
+
+; Added by Matt K. for v3-5. Heuristic changes to linear arithmetic were
+; preventing the next lemma, not-member-equal-bool-holds-on-ev, from going
+; through. But the original proof involved generalization and three levels of
+; induction, so rather than investigate further, we'll just prove the following
+; lemma. With it, the proof of not-member-equal-bool-holds-on-ev goes through
+; without :hints.
+(local
+ (defthm helper-from-matt-k
+ (implies (not (equal el l1))
+ (not (member-equal-bool el (make-n-list l1 n))))))
+
+(defthm not-member-equal-bool-holds-on-ev
+ (implies
+ (and
+ (integerp n)
+ (> n 0)
+ (not (member-equal-bool el l)))
+ (not (member-equal-bool el (eventually-make-list l n))))
+ :hints (("Subgoal *1.1/4''" :use sillllly) ; Modified for v2-6 by Matt K.
+ ("Subgoal *1.1/4.1" :use sillllly))
+ :rule-classes nil)
+
+(defthm not-memb-1
+ (implies
+ (and
+ (true-listp m)
+ (equal (len (rtmintvars-i gvar1 m)) 1)
+ (assoc-equal gvar1 m)
+ (assoc-equal gvar2 m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (not (equal gvar1 gvar2)))
+ (not (member-equal-bool
+ (car (rtmintvars-i gvar1 m))
+ (rtmintvars-i gvar2 m))))
+ :hints (("Goal"
+ :use ( (:instance lemma1-different-vars-do-not-belong (idx1 0)))))
+ :rule-classes nil)
+
+(defthm not-memb-2
+ (implies
+ (and
+ (true-listp m)
+ (equal (len (rtmintvars-i gvar1 m)) 1)
+ (assoc-equal gvar1 m)
+ (assoc-equal gvar2 m)
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (not (equal gvar1 gvar2)))
+ (not (member-equal-bool
+ (car (rtmintvars-i gvar1 m))
+ (eventually-make-list (rtmintvars-i gvar2 m) (len *rns*)))))
+ :hints (("Goal"
+ :use ( not-memb-1
+ (:instance not-member-equal-bool-holds-on-ev
+ (el (car (rtmintvars-i gvar1 m)))
+ (l (rtmintvars-i gvar2 m))
+ (n (len *rns*))))))
+ :rule-classes nil)
+
+
+(defthm eq-and-update-behaviour
+ (and
+ (equal
+ (var-value (gen-eq-update c1 c2 c3 mem))
+ (boolean-to-int (equal
+ (var-value (get-cell c2 mem))
+ (var-value (get-cell c3 mem)))))
+ (equal
+ (var-attribute (gen-eq-update c1 c2 c3 mem))
+ (var-attribute (get-cell c1 mem))))
+ :hints (("Goal" :in-theory (enable var-value var-attribute))))
+
+
+(defthm var-attribute-of-a-var-is-same-after-n-steps
+ (implies
+ (rtm-statep st)
+ (equal (var-attribute (get-cell anyvar (mem st)))
+ (var-attribute (get-cell anyvar (mem (execute-n-instructions st n))))))
+ :hints (("Goal"
+ :induct (execute-n-instructions st n)
+ :in-theory (disable rtm-statep execute-instruction))
+ ("Subgoal *1/2"
+ :use
+ (
+ (:instance execute-instruction-is-type-and-attribute-invariant-on-any-var (cell anyvar))
+ executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state))))
+
+
+(defthm bool-to-int-strip
+ (iff
+ (equal (boolean-to-int (equal a b)) (boolean-to-int (equal-values c d)))
+ (equal (equal a b) (equal c d))))
+
+
+(defthm equal-equality-of-var-values-euqlity-of-evlists-2
+ (implies
+ (and
+ (is-mem-cell-p gcell2)
+ (is-mem-cell-p gcell3)
+ (bounded-value gcell2)
+ (bounded-value gcell3)
+ (equal (type-expected rtmintvars-i-gvar2) (var-type gcell2))
+ (equal (type-expected rtmintvars-i-gvar3) (var-type gcell3))
+ (equal-values-and-attributes gcell2 rtmintvars-i-gvar2 rtmmem (var-type gcell2))
+ (equal-values-and-attributes gcell3 rtmintvars-i-gvar3 rtmmem (var-type gcell3)))
+ (equal
+ (boolean-to-int
+ (equal
+ (var-value gcell2)
+ (var-value gcell3) ))
+ (boolean-to-int
+ (equal-values
+ (var-values (eventually-make-list rtmintvars-i-gvar2 (len *rns*)) rtmmem)
+ (var-values (eventually-make-list rtmintvars-i-gvar3 (len *rns*)) rtmmem)))))
+ :hints (("Goal"
+ :in-theory nil
+ :use
+ ((:instance bool-to-int-strip
+ (a (var-value gcell2))
+ (b (var-value gcell3))
+ (c (var-values (eventually-make-list rtmintvars-i-gvar2 (len *rns*)) rtmmem))
+ (d (var-values (eventually-make-list rtmintvars-i-gvar3 (len *rns*)) rtmmem)))
+ equal-equality-of-var-values-euqlity-of-evlists))))
+
+
+
+(defthm sil-support-2
+ (implies
+ (and
+ (integerp n)
+ (> n 0)
+ (or
+ (equal (type-expected l) 'Bool)
+ (equal (type-expected l) 'Int)))
+ (not (endp (eventually-make-list l n))))
+ :hints (("Subgoal *1.1/3'" :use sillllly))
+ :otf-flg t)
+
+(defthm sil-support-3
+ (implies
+ (my-or-2
+ (equal (type-expected l) 'Bool)
+ (equal (type-expected l) 'Int))
+ (not (endp (eventually-make-list l (len *rns*)))))
+ :hints (("Goal" :use (:instance sil-support-2 (n (len *rns*))))))
+
+
+(defthm not-in-car-if-no-memb
+ (implies
+ (and
+ (equal (len l) 1)
+ (not (member-equal-bool 'tmp l)))
+ (not (equal 'tmp (car l)))))
+
+(defthm sil-support-1
+ (implies
+ (equal (type-i gvar1 m) 'bool)
+ (equal (LEN (RTMINTVARS-I gvar1 m)) 1)))
+
+
+(defthm bounded-are-bounded
+ (implies
+ (and
+ (bounded-amem-p mem)
+ (assoc-equal cell mem))
+ (bounded-value (get-cell cell mem)))
+ :hints (("Goal" :in-theory (enable get-cell)))
+ :rule-classes nil)
+
+
+
+
+(defthm m-correspondence-kept-on-same-gvar-equ
+ (implies
+ (and
+ (NOT (ENDP (EVENTUALLY-MAKE-LIST
+ (RTMINTVARS-I (PAR2 (NTH (PCC GSTATE) (CODE GSTATE)))
+ M)
+ (LEN '(11 13 15 17 19)))))
+ (NOT (EQUAL 'TMP
+ (CAR (RTMINTVARS-I (PAR1 (NTH (PCC GSTATE) (CODE GSTATE)))
+ M))))
+ (EQUAL (LEN (RTMINTVARS-I (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) M)) 1)
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (assoc-equal gvar1 m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))
+ (type-i gvar1 m)))
+ :hints (("Goal" :in-theory nil
+ :use (
+ (:instance gem-statep (x gstate))
+ (:instance bounded-are-bounded (cell (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance bounded-are-bounded (cell (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance eq-and-update-behaviour
+ (c1 gvar1)
+ (c2 (par2 (nth (pcc gstate) (code gstate))))
+ (c3 (par3 (nth (pcc gstate) (code gstate))))
+ (mem (mem gstate)))
+ (:instance var-attribute-of-a-var-is-same-after-n-steps
+ (st rstate)
+ (anyvar (car (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)))
+ (n (* 2 (len *rns*))))
+ (:instance in-range (idx (pcc gstate)) (l (code gstate)))
+ (:instance not-memb-2
+ (gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (gvar2 (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance not-memb-2
+ (gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (gvar2 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance type-of-a-mem-cell (cell (get-cell (par2 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ (:instance type-of-a-mem-cell (cell (get-cell (par3 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ properies-of-type-and-existence-of-current-args-equ
+ mem-cellity-of-current-gem-args-equ
+ good-translation-gem-rtm
+ (:instance tmp-never-appears (n (len *rns*)) (gvar1 (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance tmp-never-appears (n (len *rns*)) (gvar1 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance if-type-exepcted-is-ok-eventually-always-has-len-of-rns
+ (l (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m)))
+ (:instance if-type-exepcted-is-ok-eventually-always-has-len-of-rns
+ (l (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m)))
+ (:instance type-i-is-vartyper (gvar1 gvar1) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar gvar1) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance
+ equal-eq-update-norest-afetr-one-instr
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate))))
+ )
+ (:instance type-is-for-pars-equ
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance equal-values-and-attributes-in-boolean-case
+ (rtmvars (rtmintvars-i gvar1 m))
+ (gcell (get-cell gvar1 (mem gstate)))
+ (rtmmem (mem rstate)))
+ (:instance equal-values-and-attributes-in-boolean-case
+ (rtmvars (rtmintvars-i gvar1 m))
+ (gcell (get-cell gvar1 (mem (execute-instruction gstate))))
+ (rtmmem (mem (execute-n-instructions rstate (* 2 (len *rns*))))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance m-correspondent-values-implies-equal-values-and-attribus
+ (memgstate (mem gstate)) (memrstate (mem rstate))
+ (gvar1 (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance value-of-result-after-executing-2n-+2instr-finale
+ (tmp 'tmp)
+ (res (car (rtmintvars-i (par1 (nth (pcc gstate) (code gstate))) m)))
+ (listvars1 (eventually-make-list (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m) (len *rns*)))
+ (listvars2 (eventually-make-list (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m) (len *rns*)))
+ (st rstate))
+ (:instance equal-equality-of-var-values-euqlity-of-evlists-2
+ (gcell2 (get-cell (par2 (nth (pcc gstate) (code gstate))) (mem gstate)))
+ (gcell3 (get-cell (par3 (nth (pcc gstate) (code gstate))) (mem gstate)))
+ (rtmintvars-i-gvar2 (rtmintvars-i (par2 (nth (pcc gstate) (code gstate))) m))
+ (rtmintvars-i-gvar3 (rtmintvars-i (par3 (nth (pcc gstate) (code gstate))) m))
+ (rtmmem (mem rstate)))))))
+
+
+(defthm m-correspondence-kept-on-same-gvar-equ-supp
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (equal gvar1 (par1 (nth (pcc gstate) (code gstate))))
+ (assoc-equal gvar1 m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (and
+ (NOT (ENDP (EVENTUALLY-MAKE-LIST
+ (RTMINTVARS-I (PAR2 (NTH (PCC GSTATE) (CODE GSTATE)))
+ M)
+ (LEN '(11 13 15 17 19)))))
+ (NOT (EQUAL 'TMP
+ (CAR (RTMINTVARS-I (PAR1 (NTH (PCC GSTATE) (CODE GSTATE)))
+ M))))
+ (EQUAL (LEN (RTMINTVARS-I (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) M)) 1)))
+ :hints (("Goal" :in-theory nil
+ :use (
+ (:instance sil-support-3 (l (RTMINTVARS-I (PAR2 (NTH (PCC GSTATE) (CODE GSTATE))) M) ))
+ (:instance not-in-car-if-no-memb (l (RTMINTVARS-I (PAR1 (NTH (PCC GSTATE) (CODE GSTATE))) m)))
+ (:instance sil-support-1 (gvar1 (PAR1 (NTH (PCC GSTATE) (CODE GSTATE)))))
+ (:instance in-range (idx (pcc gstate)) (l (code gstate)))
+ (:instance type-of-a-mem-cell (cell (get-cell (par2 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ (:instance type-of-a-mem-cell (cell (get-cell (par3 (nth (pcc gstate) (code gstate))) (mem gstate))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ properies-of-type-and-existence-of-current-args-equ
+ mem-cellity-of-current-gem-args-equ
+ (:instance tmp-never-appears-simple (gvar1 (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance type-i-is-vartyper (gvar1 gvar1) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-vartyper (gvar1 (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar gvar1) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par2 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance type-i-is-type-expected (gvar (par3 (nth (pcc gstate) (code gstate)))) (mem (mem gstate)))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par1 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par2 (nth (pcc gstate) (code gstate)))))
+ (:instance inclusion-trans (m1 (mem gstate)) (m2 m)
+ (v (par3 (nth (pcc gstate) (code gstate)))))
+ (:instance type-is-for-pars-equ
+ (gvar2 (par2 (nth (pcc gstate) (code gstate))))
+ (gvar3 (par3 (nth (pcc gstate) (code gstate)))))))))
+
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (true-listp m)
+ (assoc-equal gvar1 m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (M-ENTRIES-POINT-TO-GOOD-RTM-VAR-SETS M (MEM RSTATE))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell gvar1 (mem (execute-instruction gstate)))
+ (rtmintvars-i gvar1 m)
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))
+ (type-i gvar1 m)))
+ :hints (("Goal" :in-theory nil
+ :use (m-correspondence-kept-on-same-gvar-equ
+ m-correspondence-kept-on-same-gvar-equ-supp
+ teorema-main-con-pcc-in-range-su-variabile-non-interessata-final-equ))))
+
+
+(defthm rtmintvars-i-iscdrnth
+ (implies
+ (and
+ (true-listp m)
+ (in-range idx m)
+ (no-duplicates-p (retrieve-gemvars m)))
+ (equal (rtmintvars-i (car (nth idx m)) m)
+ (cdr (nth idx m))))
+ :hints (("Goal"
+ :in-theory nil
+ :use (
+ (:instance no-duplicates-has-pos-equal-right-in-that-place (l m))
+ (:instance rtmintvars-i-is-cdr-of-nth-entry (gvar (car (nth idx m))))))))
+
+(defthm type-i-is-typeidx
+ (implies
+ (and
+ (true-listp m)
+ (in-range idx m)
+ (no-duplicates-p (retrieve-gemvars m)))
+ (equal (type-i (car (nth idx m)) m)
+ (type-i-idx m idx))))
+
+
+
+(defthm equal-values-correspondence-kept-by-any-execution-idxed-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (alistp m)
+ (in-range idx m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (M-ENTRIES-POINT-TO-GOOD-RTM-VAR-SETS M (MEM RSTATE))
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (equal-values-and-attributes
+ (get-cell (car (nth idx m)) (mem (execute-instruction gstate)))
+ (cdr (nth idx m))
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))
+ (type-i-idx m idx)))
+ :hints (("Subgoal 2" :in-theory nil)
+ ("Goal" :in-theory (union-theories (current-theory 'ground-zero)
+ '((:definition in-range)))
+ :use ( (:theorem
+ (implies
+ (and
+ (alistp m)
+ (in-range idx m))
+ (and
+ (true-listp m)
+ (assoc-equal (car (nth idx m)) m))))
+
+ rtmintvars-i-iscdrnth
+ type-i-is-typeidx
+ (:instance equal-values-correspondence-kept-by-any-execution-equ (gvar1 (car (nth idx m)))))))
+ :otf-flg t)
+
+
+
+
+(defthm m-correspondence-kept-by-any-execution-idxed-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (alistp m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (M-ENTRIES-POINT-TO-GOOD-RTM-VAR-SETS M (MEM RSTATE))
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))))
+ :hints (("Goal" :use (:instance equal-values-correspondence-kept-by-any-execution-idxed-equ
+ (idx (bad-idx-eqv-va m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))))))
+ ("Goal'" :cases ( (in-range (bad-idx-eqv-va m (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (* 2 (len *rns*))))) m)))
+ ("Subgoal 2" :in-theory '((:forward-chaining alistp-forward-to-true-listp)
+ (:rewrite if-bad-index-not-in-range-then-m-corr)))
+ ("Subgoal 1" :in-theory '((:rewrite if-bad-index-in-range-thne-must-be-different-vs)))))
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-by-any-execution-idxed-equ
+ (implies
+ (and
+ (equal (opcode (nth (pcc gstate) (code gstate))) 'gem-equ)
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (alistp m)
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (in-range (pcc gstate) (code gstate))
+ (in-range (pcc rstate) (code rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate))
+ (M-ENTRIES-POINT-TO-GOOD-RTM-VAR-SETS M (MEM RSTATE))
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (correct-wrt-arity m (mem gstate)))
+ (and
+ (good-translation-gem-rtm (execute-instruction gstate) (execute-n-instructions rstate (* 2 (len *rns*))) m)
+ (rtm-statep (execute-n-instructions rstate (* 2 (len *rns*))))
+ (m-entries-point-to-good-rtm-var-sets m (mem (execute-n-instructions rstate (* 2 (len *rns*)))))
+ (gem-statep (execute-instruction gstate))
+ (correct-wrt-arity m (mem (execute-instruction gstate)))
+ (vars-inclusion (mem (execute-instruction gstate)) m)
+ (vars-inclusion m (mem (execute-instruction gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (* 2 (len *rns*)))))))
+ :hints (("Goal"
+ :in-theory ;nil
+ (disable
+ rtm-statep gem-statep
+ pcc code opcode
+ execute-instruction rtmintvars-i par1 par2 par3 nth len member-equal)
+ :use
+ (m-correspondence-kept-by-any-execution-idxed-equ
+ good-translation-gem-rtm
+ (:instance execute-n-instructions-keeps-rtm-state-and-points-to-good
+ (st rstate) (n (* 2 (len *rns*))))
+ (:instance executing-gem-instruction-retrieves-a-gem-state-from-gem-state (st gstate))
+ (:instance executing-gem-instruction-preserves-correctness-wrt-arity (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-right (st gstate))
+ (:instance executing-gem-instruction-keeps-vars-inclusion-left (st gstate))))))
+
+
+
+(encapsulate
+ ()
+;;; Modified 12/24/2014 to avoid the nu-rewriter, which is being eliminated.
+; (set-nu-rewriter-mode nil) ; to avoid skip-proofs below
+ (defthm after-n-instructions-out-of-range-rtmstate-untouched
+ (implies
+ (and
+ (rtm-statep rstate)
+ (>= (pcc rstate) (len (code rstate))))
+ (equal (execute-n-instructions rstate n) rstate))
+ :hints (("Goal" :in-theory (enable execute-not-in-range-instruction-retrieves-same-state)))))
+
+
+
+(defun correspondent-steps-to-current-gem-instruction (gstate)
+ (case (opcode (nth (pcc gstate) (code gstate)))
+ (gem-add (len *rns*))
+ (gem-sub (len *rns*))
+ (gem-equ (* 2 (len *rns*)))
+ (otherwise 0)))
+
+
+
+(defun correspondent-steps (n gstate)
+ (if (zp n)
+ 0
+ (+ (correspondent-steps-to-current-gem-instruction gstate)
+ (correspondent-steps (1- n) (execute-instruction gstate)))))
+
+
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-by-out-of-range-execution-2
+ (implies
+ (and
+ (alistp m)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (good-translation-gem-rtm gstate rstate m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (not (in-range (pcc gstate) (code gstate)))
+ (>= (pcc gstate) 0)
+ (>= (pcc rstate) (len (code rstate)))
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (and
+ (good-translation-gem-rtm
+ (execute-instruction gstate)
+ (execute-n-instructions rstate
+ (correspondent-steps-to-current-gem-instruction gstate)) m)
+ (rtm-statep (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate)))
+ (m-entries-point-to-good-rtm-var-sets
+ m
+ (mem (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))))
+ (gem-statep (execute-instruction gstate))
+ (correct-wrt-arity m (mem (execute-instruction gstate)))
+ (vars-inclusion (mem (execute-instruction gstate)) m)
+ (vars-inclusion m (mem (execute-instruction gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))))))
+ :hints (("Goal"
+ :in-theory '((in-range))
+ :use
+ (
+ (:instance after-n-instructions-out-of-range-rtmstate-untouched
+ (n (correspondent-steps-to-current-gem-instruction gstate)))
+ (:instance execute-not-in-range-instruction-retrieves-same-state (st gstate))))))
+
+
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-execution-2
+ (implies
+ (and
+ (alistp m)
+ (no-tmp-into-mapping m)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (good-translation-gem-rtm gstate rstate m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (>= (pcc gstate) 0)
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (and
+ (>= (pcc (execute-instruction gstate)) 0)
+ (good-translation-gem-rtm
+ (execute-instruction gstate)
+ (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate)) m)
+ (rtm-statep (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate)))
+ (m-entries-point-to-good-rtm-var-sets
+ m
+ (mem (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))))
+ (gem-statep (execute-instruction gstate))
+ (correct-wrt-arity m (mem (execute-instruction gstate)))
+ (vars-inclusion (mem (execute-instruction gstate)) m)
+ (vars-inclusion m (mem (execute-instruction gstate)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-instruction gstate))
+ (mem (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))))))
+ :hints (("Goal" :in-theory '((:definition in-range))
+ :use ((:instance instruction-incrementing-pvv (st gstate))
+ correspondent-steps-to-current-gem-instruction
+ good-translation-gem-rtm
+ m-correspondence-and-other-conditions-kept-by-out-of-range-execution-2
+ m-correspondence-and-other-conditions-kept-by-any-execution-add
+ m-correspondence-and-other-conditions-kept-by-any-execution-sub
+ m-correspondence-and-other-conditions-kept-by-any-execution-idxed-equ))))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(defun parallel-exec (gstate rstate n)
+ (if (zp n)
+ (list gstate rstate)
+ (parallel-exec
+ (execute-instruction gstate)
+ (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))
+ (1- n))))
+
+
+
+
+
+
+
+
+
+
+
+
+(defthm m-correspondence-and-other-conditions-kept-execution-on-n
+ (implies
+ (and
+ (integerp n)
+ (>= n 0)
+ (alistp m)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))
+ (no-tmp-into-mapping m)
+ (good-translation-gem-rtm gstate rstate m)
+ (correct-wrt-arity m (mem gstate))
+ (gem-statep gstate)
+ (rtm-statep rstate)
+ (vars-inclusion (mem gstate) m)
+ (vars-inclusion m (mem gstate))
+ (>= (pcc gstate) 0)
+ (m-entries-point-to-good-rtm-var-sets m (mem rstate))
+ (m-correspondent-values-p m (mem gstate) (mem rstate)))
+ (and
+ (>= (pcc (execute-n-instructions gstate n)) 0)
+ (good-translation-gem-rtm
+ (execute-n-instructions gstate n)
+ (execute-n-instructions rstate (correspondent-steps n gstate)) m)
+ (rtm-statep (execute-n-instructions rstate (correspondent-steps n gstate)))
+ (m-entries-point-to-good-rtm-var-sets
+ m
+ (mem (execute-n-instructions rstate (correspondent-steps n gstate))))
+ (gem-statep (execute-n-instructions gstate n))
+ (correct-wrt-arity m (mem (execute-n-instructions gstate n)))
+ (vars-inclusion (mem (execute-n-instructions gstate n)) m)
+ (vars-inclusion m (mem (execute-n-instructions gstate n)))
+ (m-correspondent-values-p
+ m
+ (mem (execute-n-instructions gstate n))
+ (mem (execute-n-instructions rstate (correspondent-steps n gstate))))))
+ :hints (("Goal" :in-theory
+ ;(current-theory 'ground-zero)
+ (disable executing-gem-instruction-preserves-correctness-wrt-arity
+ execute-instruction-is-type-and-attribute-invariant-on-any-var
+ ;executing-gem-instruction-is-type-attribute-invariant
+ executing-gem-instruction-keeps-vars-inclusion-left
+ executing-gem-instruction-keeps-vars-inclusion-right
+ execute-n-instructions-keeps-rtm-state-and-points-to-good
+ correspondent-steps-to-current-gem-instruction
+ execute-n-instructions-tantamount-to-add-list-e
+ m-correspondence-and-other-conditions-kept-by-any-execution-add
+ m-correspondence-and-other-conditions-kept-by-any-execution-sub
+ m-correspondence-and-other-conditions-kept-by-any-execution-idxed-equ
+ m-correspondence-and-other-conditions-kept-by-out-of-range-execution-2
+ executing-gem-instruction-retrieves-a-gem-state-from-gem-state
+ executing-rtm-instruction-retrieves-a-rtm-state-from-rtm-state
+ instruction-incrementing-pvv
+ good-translation-gem-rtm
+ all-rtm-adds-for-n-steps
+ null-opcode-implies-execution-does-not-touch-state
+ bad-idx-eqv-va
+ mem pcc code opcode retrieve-rtmvars gem-statep rtm-statep execute-instruction)
+ :induct (parallel-exec gstate rstate n))
+ ("Subgoal *1/2" :use
+ (
+ (:instance execute-n-instruction-decomposition
+ (n1 (correspondent-steps (1- n) gstate))
+ (n2 (correspondent-steps-to-current-gem-instruction gstate))
+ (st rstate))
+ (:instance m-correspondence-and-other-conditions-kept-execution-2
+ (gstate (execute-instruction gstate))
+ (rstate (execute-n-instructions rstate (correspondent-steps-to-current-gem-instruction gstate))))))))
+
+
+
+
+(defthm simple-fact-about-initial-gemstate
+ (implies
+ (gem-program-p gemprog)
+ (and
+ (>= (pcc (initial-state gemprog)) 0)
+ (gem-statep (initial-state gemprog)))))
+
+(defthm simple-fact-about-initial-rtmstate
+ (implies
+ (rtm-program-p rtmprog)
+ (and
+ (>= (pcc (initial-state rtmprog)) 0)
+ (rtm-statep (initial-state rtmprog)))))
+
+
+(defun good-mapping (m)
+ (and
+ (alistp m)
+ (no-tmp-into-mapping m)
+ (no-duplicates-p (retrieve-gemvars m))
+ (no-duplicates-p (append-lists (retrieve-rtmvars m)))))
+
+(defun good-mapping-wrt-memories (m mem-gstate mem-rstate)
+ (and
+ (correct-wrt-arity m mem-gstate)
+ (vars-inclusion mem-gstate m)
+ (vars-inclusion m mem-gstate)
+ (m-entries-point-to-good-rtm-var-sets m mem-rstate)
+ (m-correspondent-values-p m mem-gstate mem-rstate)))
+
+
+
+
+(defun correct-translation (gemprog rtmprog m)
+ (good-translation-gem-rtm (initial-state gemprog) (initial-state rtmprog) m))
+
+
+(defthm execution-of-correctly-translated-gem-and-rtm-yields-same-output
+ (let
+ ((gstate (initial-state gemprog))
+ (rstate (initial-state rtmprog))
+ (n (len (code gstate))))
+ (implies
+ (and
+ (gem-program-p gemprog)
+ (rtm-program-p rtmprog)
+ (good-mapping m)
+ (good-mapping-wrt-memories m (mem gstate) (mem rstate))
+ (correct-translation gemprog rtmprog m))
+ (equal-memories
+ (decode m (projectio (mem (execute-n-instructions rstate (correspondent-steps n gstate))) attr))
+ (projectio (mem (execute-n-instructions gstate n)) attr))))
+ :hints (("Goal"
+ :in-theory (union-theories (current-theory 'ground-zero)
+ '((:rewrite equalities-on-io)
+ (:definition correct-translation)
+ (:definition good-mapping-wrt-memories)
+ (:definition gem-statep)
+ (:definition rtm-statep)
+ (:definition good-mapping)))
+ :use
+ (
+ fact-bout-rns
+ simple-fact-about-initial-rtmstate
+ simple-fact-about-initial-gemstate
+ (:instance m-correspondence-and-other-conditions-kept-execution-on-n
+ (gstate (initial-state gemprog))
+ (rstate (initial-state rtmprog))
+ (n (len (code gstate))))))))
+
+