diff options
Diffstat (limited to 'books/workshops/2003/hbl/support/sol2.lisp')
-rw-r--r-- | books/workshops/2003/hbl/support/sol2.lisp | 3010 |
1 files changed, 3010 insertions, 0 deletions
diff --git a/books/workshops/2003/hbl/support/sol2.lisp b/books/workshops/2003/hbl/support/sol2.lisp new file mode 100644 index 0000000..0fd14aa --- /dev/null +++ b/books/workshops/2003/hbl/support/sol2.lisp @@ -0,0 +1,3010 @@ +;(acl2::set-match-free-error nil) +(in-package "ACL2") +(include-book "misc/records" :dir :system) +(include-book "arithmetic/top-with-meta" :dir :system) +(include-book "ordinals/e0-ordinal" :dir :system) +(set-well-founded-relation e0-ord-<) +;------------------- +;; use record book instead of using list + +(defmacro make-rc (ptrs ram map) + `(s 'ptrs ,ptrs (s 'ram ,ram (s 'map ,map nil)))) + + +;; not this ptrs is expected to a list of 3 turples +;; (typ addr n) + +(defmacro ptrs (rc) `(g 'ptrs ,rc)) +(defmacro ram (rc) `(g 'ram ,rc)) +(defmacro getmap (rc) `(g 'map ,rc)) + +(defmacro set-ptrs (ptrs rc) `(s 'ptrs ,ptrs ,rc)) +(defmacro set-ram (ram rc) `(s 'ram ,ram ,rc)) +(defmacro set-map (map rc) `(s 'map ,map ,rc)) + +(defun set-equal (a b) + (and (subsetp a b) + (subsetp b a))) + +(defthm subsetp-append + (subsetp a (append b a))) + +(defthm append-nil-x-x + (equal (append nil a) a)) + +(defthm subsetp-reflexive + (subsetp a a) + :hints (("Goal" + :use ((:instance subsetp-append (b nil)))))) + +(defthm subsetp-transitive + (implies (and (subsetp a b) + (subsetp b c)) + (subsetp a c))) + +(defequiv set-equal) + +(defun seq-int (start len) + (if (zp len) + nil + (cons (+ 0 start) + (seq-int (1+ start) (1- len))))) + +(defun struct-equiv-1-aux-m (typ-or-typs n mode) + (cond ((equal mode 'ATOM) + (cons (+ 1 (nfix n)) 0)) + ((equal mode 'LIST) + (cons (+ 1 (nfix n)) (len typ-or-typs))) + (t 0))) + +(defun struct-equiv-1-aux (typ-or-typs ptr-or-ptrs n ram1 ram2 map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) t + (if (zp ptr) t + (if (not (assoc-equal typ map)) t + (if (not (equal (g ptr ram1) + (g ptr ram2))) nil + (let ((addr (g ptr ram1))) + (struct-equiv-1-aux desc + (seq-int addr size) + (- n 1) + ram1 ram2 map 'LIST)))))))) + ((equal mode 'LIST) + (if (endp typs) t + (if (not (assoc-equal (car typs) map)) + (struct-equiv-1-aux + (cdr typs) (cdr ptrs) n ram1 ram2 map 'LIST) + (and (struct-equiv-1-aux (car typs) (car ptrs) n ram1 ram2 map 'ATOM) + (struct-equiv-1-aux (cdr typs) (cdr ptrs) n ram1 ram2 map 'LIST))))) + (t t)))) + +(defun struct-equiv-1 (typ addr n ram1 ram2 map) + (struct-equiv-1-aux typ addr n ram1 ram2 map 'ATOM)) + +(defun struct-equiv-1-list (typs addrs n ram1 ram2 map) + (struct-equiv-1-aux typs addrs n ram1 ram2 map 'LIST)) + +;-------- +(defun typ (ptrs) (car ptrs)) +(defun addr (ptrs) (cadr ptrs)) +(defun n (ptrs) (caddr ptrs)) + +(defun typ-list (ptrs) + (if (endp ptrs) nil + (cons (typ (car ptrs)) (typ-list (cdr ptrs))))) + +(defun addr-list (ptrs) + (if (endp ptrs) nil + (cons (addr (car ptrs)) (addr-list (cdr ptrs))))) + +(defun n-list (ptrs) + (if (endp ptrs) nil + (cons (n (car ptrs)) (n-list (cdr ptrs))))) + +(defun all-struct-equiv-1 (typs addrs ns ram1 ram2 map) + (if (endp typs) t + (and (struct-equiv-1 (car typs) (car addrs) (car ns) ram1 ram2 map) + (all-struct-equiv-1 (cdr typs) (cdr addrs) (cdr ns) ram1 ram2 map)))) + +(defun struct-equiv (rc1 rc2) + (and (set-equal (ptrs rc1) (ptrs rc2)) + (equal (getmap rc1) (getmap rc2)) + (all-struct-equiv-1 (typ-list (ptrs rc1)) + (addr-list (ptrs rc1)) + (n-list (ptrs rc1)) + (ram rc1) (ram rc2) (getmap rc1)))) + +;------------- prove this a equivalence relation ---- + +(defthm struct-equiv-1-aux-reflexive + (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n ram ram map mode)) + +(defthm struct-equiv-1-aux-symentric + (implies (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n ram1 ram2 map mode) + (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n ram2 ram1 map mode))) + +(defthm struct-equiv-1-aux-implies-g-ptr-equal + (implies (and (struct-equiv-1-aux typ ptr n ram1 ram2 map mode) + (not (zp n)) + (not (zp ptr)) + (equal mode 'ATOM) + (assoc-equal typ map)) + (equal (g ptr ram1) (g ptr ram2))) + :rule-classes :forward-chaining) + +(defthm struct-equiv-1-aux-transitive + (implies (and (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n + ram1 ram2 map mode) + (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n + ram2 ram3 map mode)) + (struct-equiv-1-aux typ-of-typs ptr-or-ptrs n + ram1 ram3 map mode))) + +(defthm all-struct-equiv-1-reflexive + (all-struct-equiv-1 typs addrs ns ram ram map)) + +(defthm all-struct-equiv-1-symentric + (implies (all-struct-equiv-1 typs addrs ns ram1 ram2 map) + (all-struct-equiv-1 typs addrs ns ram2 ram1 map))) + +(defthm all-struct-equiv-1-transitive + (implies (and (all-struct-equiv-1 typs addrs ns ram1 ram2 map) + (all-struct-equiv-1 typs addrs ns ram2 ram3 map)) + (all-struct-equiv-1 typs addrs ns ram1 ram3 map))) + + +;------------ + +(in-theory (disable struct-equiv-1)) + +(defthm all-struct-equiv-1-mem + (implies (and (member ptr ptrs) + (not (struct-equiv-1 (typ ptr) (addr ptr) (n ptr) ram1 ram2 map))) + (not (all-struct-equiv-1 (typ-list ptrs) (addr-list ptrs) (n-list ptrs) + ram1 ram2 map)))) + + + +(defthm all-struct-equiv-1-subsetp + (implies (and (subsetp ptrs2 ptrs1) + (all-struct-equiv-1 (typ-list ptrs1) + (addr-list ptrs1) + (n-list ptrs1) + ram1 ram2 map)) + (all-struct-equiv-1 (typ-list ptrs2) + (addr-list ptrs2) + (n-list ptrs2) + ram1 ram2 map))) + + + +(defthm struct-equiv-transitive + (implies (and (struct-equiv rc1 rc2) + (struct-equiv rc2 rc3)) + (struct-equiv rc1 rc3))) + +;; (in-theory (disable set-equal)) + +(defequiv struct-equiv) + + +;-------------- + +(defun collect-link-cells-1-aux + (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) nil + (if (zp ptr) nil + (if (not (assoc-equal typ map)) + nil + (let ((addr (g ptr ram))) + (cons ptr (collect-link-cells-1-aux desc + (seq-int addr size) + (- n 1) + ram map 'LIST)))))))) + + ((equal mode 'LIST) + (if (endp typs) nil + (if (not (assoc-equal (car typs) map)) ;; skip non pointer + (collect-link-cells-1-aux (cdr typs) (cdr ptrs) n ram map 'LIST) + (append (collect-link-cells-1-aux (car typs) + (car ptrs) + n + ram map 'ATOM) + (collect-link-cells-1-aux (cdr typs) + (cdr ptrs) + n + ram map 'LIST))))) + (t nil)))) + + +;--------------- +(defun collect-link-cells-1 (typ addr n ram map) + (collect-link-cells-1-aux typ addr n ram map 'ATOM)) + +(defun collect-link-cells-1-list (typs addrs n ram map) + (collect-link-cells-1-aux typs addrs n ram map 'LIST)) + + +(defun all-collect-link-cells-1 (typs addrs ns ram map) + (if (endp typs) + nil + (append (collect-link-cells-1 (car typs) (car addrs) (car ns) ram map) + (all-collect-link-cells-1 (cdr typs) (cdr addrs) (cdr ns) ram map)))) + +;--------------- + +(defun collect-link-cells (rc) + (all-collect-link-cells-1 (typ-list (ptrs rc)) + (addr-list (ptrs rc)) + (n-list (ptrs rc)) + (ram rc) (getmap rc))) + + +;; next task (defcong struct-equiv + +(defthm member-append-1 + (implies (member x b) + (member x (append a b)))) + +(defthm member-append-2 + (implies (member x a) + (member x (append a b)))) + +(defthm subsetp-append-x-1 + (implies (subsetp a b) + (subsetp (append a c) + (append b c)))) + +(defthm subsetp-append-x-2 + (implies (subsetp a b) + (subsetp (append c a) + (append c b)))) + + + +(defcong set-equal set-equal (append a b) 1) +(defcong set-equal set-equal (append a b) 2) + +(defthm subsetp-append-b + (subsetp a (append a b))) + +(defthm subsetp-collect-link-cells-1-subsetp + (implies (member ptr ptrs) + (subsetp (collect-link-cells-1 (typ ptr) + (addr ptr) + (n ptr) + ram map) + (all-collect-link-cells-1 (typ-list ptrs) + (addr-list ptrs) + (n-list ptrs) + ram map))) + :hints (("Goal" :in-theory (disable collect-link-cells-1) + :do-not '(generalize)))) + +(in-theory (disable typ addr n)) + +(defthm subsetp-merged-still-subsetp + (implies (and (subsetp a b) + (subsetp c b)) + (subsetp (append a c) b))) + + +(defthm subsetp-all-collect-link-cells-1-subsetp + (implies (subsetp ptrs1 ptrs2) + (subsetp (all-collect-link-cells-1 (typ-list ptrs1) + (addr-list ptrs1) + (n-list ptrs1) + ram map) + (all-collect-link-cells-1 (typ-list ptrs2) + (addr-list ptrs2) + (n-list ptrs2) + ram map))) + :hints (("Goal" :in-theory (disable collect-link-cells-1)))) + + + +(defthm set-equal-collect-link-cells-1-set-equal + (implies (and (set-equal ptrs1 ptrs2) + ;; Added for mod to ACL2 v2-8 that does better matching for + ;; calls of equivalence relations against the current context: + (syntaxp (not (term-order ptrs1 ptrs2)))) + (set-equal (all-collect-link-cells-1 (typ-list ptrs1) + (addr-list ptrs1) + (n-list ptrs1) + ram map) + (all-collect-link-cells-1 (typ-list ptrs2) + (addr-list ptrs2) + (n-list ptrs2) + ram map)))) + + +(defthm struct-equiv-1-aux-implies-collect-link-cells-aux-equal + (implies (struct-equiv-1-aux typ-or-typs ptr-or-ptrs n ram1 ram2 map mode) + (equal (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs n + ram1 map mode) + (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs n + ram2 map mode)))) + + +(defthm struct-equiv-1-equal-collect-link-cells-1-equal + (implies (all-struct-equiv-1 typs addrs ns ram1 ram2 map) + (equal (all-collect-link-cells-1 typs + addrs + ns + ram1 map) + (all-collect-link-cells-1 typs + addrs + ns + ram2 map))) + :hints (("Goal" :in-theory (enable struct-equiv-1)))) + + +;-------------- +(in-theory (disable set-equal)) + + +(defcong struct-equiv set-equal (collect-link-cells rc) 1) + +;-- need to prove update to the non link cell keep the struct-equiv + +(defthm not-member-append-f-1 + (implies (not (member x (append a b))) + (not (member x a))) + :rule-classes :forward-chaining) + +(defthm not-member-append-f-2 + (implies (not (member x (append a b))) + (not (member x b))) + :rule-classes :forward-chaining) + + +(defun struct-equiv-1-induct (addrx typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) t + (if (zp ptr) t + (if (not (assoc-equal typ map)) t + (if (equal addrx ptr) t + (let ((addr (g ptr ram))) + (struct-equiv-1-induct addrx desc (seq-int addr size) + (- n 1) ram map 'LIST)))))))) + ((equal mode 'LIST) + (if (endp typs) t + (if (not (assoc-equal (car typs) map)) + (struct-equiv-1-induct addrx (cdr typs) (cdr ptrs) n ram map 'LIST) + (list (struct-equiv-1-induct addrx (car typs) (car ptrs) n ram map 'ATOM) + (struct-equiv-1-induct addrx (cdr typs) (cdr ptrs) n ram map 'LIST))))) + (t (list addrx typ-or-typs ptr-or-ptrs n ram map mode))))) + + +(defthm struct-equiv-1-aux-atom-implies-member + (implies (AND + (NOT (ZP N)) + (NOT (ZP ADDR)) + (ASSOC-EQUAL TYP MAP)) + (MEMBER ADDR + (COLLECT-LINK-CELLS-1-AUX TYP ADDR N RAM MAP + 'ATOM))) + :hints (("Goal" :expand (COLLECT-LINK-CELLS-1-AUX TYP ADDR N RAM MAP 'ATOM)))) + +(defthm struct-equiv-1-aux-s-add-v-struct-equiv-1-aux + (implies (not (member addr (collect-link-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (struct-equiv-1-aux typ-or-typs ptr-or-ptrs n + (s addr any ram) ram map mode)) + :hints (("Goal" :induct (struct-equiv-1-induct addr typ-or-typs ptr-or-ptrs n ram + map mode) + :do-not '(generalize)))) + +;----------------------- + +(defthm all-struct-equiv-1-s-add-v-all-struct-equiv-1 + (implies (not (member addr (all-collect-link-cells-1 + typs ptrs ns ram map))) + (all-struct-equiv-1 typs ptrs ns + (s addr any ram) ram map)) + :hints (("Goal" :in-theory (enable struct-equiv-1)))) + + +(defthm struct-equiv-preserved-if-update-non-link-cell + (implies (not (member addr (collect-link-cells rc))) + (struct-equiv (set-ram (s addr v (ram rc)) rc) + rc))) + +;----------------------- + +;; +;; done with the proof that (s addr v ram) preserve struct-equiv +;; so far, we have +;; +;; (defcong struct-equiv set-equal (collect-link-cells rc) 1) +;; +;; and +;; +;; struct-equiv-preserved-if-update-non-link-cell +;; + + +; +;--- define the generic mark algorithm, that only change data cells +; + +;; +;; we need to be able to tell that data cell value only depend on data cells +;; + + +(defun collect-data-cells-1-aux (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) nil + (if (zp ptr) nil + (if (not (assoc-equal typ map)) + nil + ;; maybe I should modify it so that it matches with + ;; collect-updates. i.e. collect data cells here in one + ;; batch. Still want a try with the other proof. + (let ((addr (g ptr ram))) + (collect-data-cells-1-aux desc + (seq-int addr size) + (- n 1) + ram map 'LIST))))))) + ((equal mode 'LIST) + (if (endp typs) nil + (if (not (assoc-equal (car typs) map)) + ;; this is a data cell, recorded it. + (cons (car ptrs) + (collect-data-cells-1-aux (cdr typs) (cdr ptrs) + n ram map 'LIST)) + (append (collect-data-cells-1-aux (car typs) + (car ptrs) + n + ram map 'ATOM) + (collect-data-cells-1-aux (cdr typs) + (cdr ptrs) + n + ram map 'LIST))))) + (t nil)))) + + +;----------- + +(defun collect-data-cells-1 (typ addr n ram map) + (collect-data-cells-1-aux typ addr n ram map 'ATOM)) + +(defun collect-data-cells-1-list (typs addrs n ram map) + (collect-link-cells-1-aux typs addrs n ram map 'LIST)) + + +(defun all-collect-data-cells-1 (typs addrs ns ram map) + (if (endp typs) + nil + (append (collect-data-cells-1 (car typs) (car addrs) (car ns) ram map) + (all-collect-data-cells-1 (cdr typs) (cdr addrs) (cdr ns) ram map)))) + +;------------ + +(defun collect-data-cells (rc) + (all-collect-data-cells-1 (typ-list (ptrs rc)) + (addr-list (ptrs rc)) + (n-list (ptrs rc)) + (ram rc) (getmap rc))) + +;; prove (defcong .... ) + +(defthm subsetp-collect-data-cells-1-subsetp + (implies (member ptr ptrs) + (subsetp (collect-data-cells-1 (typ ptr) + (addr ptr) + (n ptr) + ram map) + (all-collect-data-cells-1 (typ-list ptrs) + (addr-list ptrs) + (n-list ptrs) + ram map))) + :hints (("Goal" :in-theory (disable collect-data-cells-1) + :do-not '(generalize)))) + + +(defthm subsetp-all-collect-data-cells-1-subsetp + (implies (subsetp ptrs1 ptrs2) + (subsetp (all-collect-data-cells-1 (typ-list ptrs1) + (addr-list ptrs1) + (n-list ptrs1) + ram map) + (all-collect-data-cells-1 (typ-list ptrs2) + (addr-list ptrs2) + (n-list ptrs2) + ram map))) + :hints (("Goal" :in-theory (disable collect-data-cells-1)))) + + +(defthm set-equal-collect-data-cells-1-set-equal + (implies (and (set-equal ptrs1 ptrs2) + ;; Added for mod to ACL2 v2-8 that does better matching for + ;; calls of equivalence relations against the current context: + (syntaxp (not (term-order ptrs1 ptrs2)))) + (set-equal (all-collect-data-cells-1 (typ-list ptrs1) + (addr-list ptrs1) + (n-list ptrs1) + ram map) + (all-collect-data-cells-1 (typ-list ptrs2) + (addr-list ptrs2) + (n-list ptrs2) + ram map))) + :hints (("Goal" :in-theory (enable set-equal)))) + + +(defthm struct-equiv-1-aux-implies-collect-data-cells-aux-equal + (implies (struct-equiv-1-aux typ-or-typs ptr-or-ptrs n ram1 ram2 map mode) + (equal (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs n + ram1 map mode) + (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs n + ram2 map mode)))) + + +(defthm struct-equiv-1-equal-collect-data-cells-1-equal + (implies (all-struct-equiv-1 typs addrs ns ram1 ram2 map) + (equal (all-collect-data-cells-1 typs + addrs + ns + ram1 map) + (all-collect-data-cells-1 typs + addrs + ns + ram2 map))) + :hints (("Goal" :in-theory (enable struct-equiv-1)))) + +(defcong struct-equiv set-equal (collect-data-cells rc) 1) + +;---------------- +;; +;; the problem here is how to characterize all possible updates? +;; +;; A constraint function is good. However to argue it can model all possible +;; computation need some efforts. +;; +;; Because in this mark function, we update in the pre-order, once we reach +;; some node, we update, then we continue, etc. +;; +;; It is hard to argue that we could implement all kinds of update order, +;; because it is possible that the data value depends on the order we do them. +;; +;; In J's model, the value of new data fills only depends on the old data +;; within the same node. +;; +;; In my model, I want to extend that to all possible data fields reachable. +;; +;; Then I have to face this problem. +;; + + + +;; say only change up + +(encapsulate + ((new-field-value (typ ptr i n ram map) t)) + (local (defun new-field-value (typ ptr i n ram map) + (declare (ignore typ ptr i n ram map)) + 0)) + (defthm new-field-value-s-commutes + (implies (not (member addr (append (collect-data-cells-1 typ ptr n ram map) + (collect-link-cells-1 typ ptr n ram map)))) + (equal (new-field-value typ ptr i n (s addr val ram) map) + (new-field-value typ ptr i n ram map))))) + +;; +;; This is to say, any write outside the reachable data+link fields, +;; doesn't matter to the new-field-value +;; + +(defun single-update1 (typ ptr i n ram map) + (declare (xargs :measure (nfix (- (len (cdr (assoc-equal typ map))) + (nfix i))))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) ram + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (single-update1 typ ptr (+ i 1) n ram map) + ;; else not a struct type, update the value + (let ((ram (s (+ addr i) (new-field-value typ ptr i n ram map) ram))) + ;; let the new value depends on the changes to the previous slos + (single-update1 typ ptr (+ i 1) n ram map))) + ram)))) + +;; (defstub single-update2 (types addr size ram map) ram) ;; update in inorder +;; (defstub single-update3 (type ptr size ram map) ram) ;; update in postorder + +;; +;; chose not to deal with those now. +;; +;; +;; assume our constainted new-value is so powerful that it can emulates all +;; possible changes with in-order and post-order updates, arbitary updates. +;; +;; not so sure. this is possible, +;; +;; I could find a particular way of updating memory that cause the program +;; enter into a loop, however oracle in the single-updates have to garantee to +;; provide us an initial ram to result in the same loop.... +;; it is possible, because oracle can detect if the initial ram config is ... +;; +;; + +(defun mark-1-aux (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) ram + (if (zp ptr) ram + (if (not (assoc-equal typ map)) ;; not bound + ram + (let* ((addr (g ptr ram)) + (new-ram (single-update1 typ ptr 0 n ram map))) + (mark-1-aux desc + (seq-int addr size) + (- n 1) + new-ram map 'LIST))))))) + ((equal mode 'LIST) + (if (endp typs) + ram + (if (not (assoc-equal (car typs) map)) + (mark-1-aux (cdr typs) (cdr ptrs) n ram map 'LIST) + (let ((new-ram (mark-1-aux (car typs) + (car ptrs) + n + ram map 'ATOM))) + (mark-1-aux (cdr typs) + (cdr ptrs) + n + new-ram map 'LIST))))) + (t ram)))) + + +;--- mark-1 +(defun mark-1 (typ addr n ram map) + (mark-1-aux typ addr n ram map 'ATOM)) + +(defun mark-1-list (typs addrs n ram map) + (mark-1-aux typs addrs n ram map 'LIST)) + +;------------- + +(defun all-mark-1 (typs addrs ns ram map) + (if (endp typs) + ram + (all-mark-1 (cdr typs) (cdr addrs) (cdr ns) + (mark-1 (car typs) (car addrs) (car ns) ram map) + map))) + +;------------- + +(defun mark (rc) + (all-mark-1 (typ-list (ptrs rc)) + (addr-list (ptrs rc)) + (n-list (ptrs rc)) + (ram rc) + (getmap rc))) + +;------------ +;; +;; update is of this format (type ptr i n), +;; new-value depends on these +;; + +;; relevence analysis problem. + +(defun m-collect-updates (typ map i ram) + (declare (ignore ram)) + (nfix (- (len (cdr (assoc-equal typ map))) + (nfix i)))) + + +(defun make-update (typ ptr i n) + (list typ ptr i n)) + +(defun gtyp (update) (car update)) +(defun gptr (update) (cadr update)) +(defun gi (update) (caddr update)) +(defun gn (update) (caddr (cdr update))) + +(defthm make-update-accessor + (and (equal (gtyp (make-update typ ptr i n)) typ) + (equal (gptr (make-update typ ptr i n)) ptr) + (equal (gi (make-update typ ptr i n)) i) + (equal (gn (make-update typ ptr i n)) n))) + +(in-theory (disable make-update gtyp gptr gi gn)) + + +(defun collect-updates-from-single-update1 (typ ptr i n ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (collect-updates-from-single-update1 typ ptr (+ i 1) n ram map) + ;; else not a struct type, update the value + (let ((new-ram (s (+ addr i) (new-field-value typ ptr i n ram map) ram))) + ;; let the new value depends on the changes to the previous slos + (cons (make-update typ ptr i n) + (collect-updates-from-single-update1 typ ptr (+ i 1) n + new-ram map)))) + nil)))) + + +(defun collect-updates-zdynamic-1-aux (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) nil + (if (zp ptr) nil + (if (not (assoc-equal typ map)) ;; not bound + nil + (let* ((addr (g ptr ram)) + (new-ram (single-update1 typ ptr 0 n ram map))) + (append (collect-updates-from-single-update1 + typ ptr 0 n ram map) + (collect-updates-zdynamic-1-aux + desc + (seq-int addr size) + (- n 1) + new-ram map 'LIST)))))))) + ((equal mode 'LIST) + (if (endp typs) + nil + (if (not (assoc-equal (car typs) map)) + (collect-updates-zdynamic-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST) + (let ((new-ram (mark-1-aux (car typs) + (car ptrs) + n + ram map 'ATOM))) + (append (collect-updates-zdynamic-1-aux + (car typs) (car ptrs) n ram map 'ATOM) + (collect-updates-zdynamic-1-aux (cdr typs) + (cdr ptrs) + n + new-ram map 'LIST)))))) + (t nil)))) + + +;---------- prove apply-dynamic update equal to mark on the fly +; +; update is a (typ ptr i n) +; +; + +(defun apply-update (update ram map) + (let ((typ (gtyp update)) + (ptr (gptr update)) + (i (gi update)) + (n (gn update))) + (let ((addr (g ptr ram))) + (s (+ addr i) (new-field-value typ ptr i n ram map) ram)))) + + +(defun apply-updates (updates ram map) + (if (endp updates) ram + (apply-updates (cdr updates) (apply-update (car updates) ram map) map))) + + +(defthm apply-updates-collect-updates-from-single-update1-is-single-update1 + (equal (single-update1 typ ptr i n ram map) + (apply-updates (collect-updates-from-single-update1 + typ ptr i n ram map) + ram map))) + + +(defthm apply-updates-append + (equal (apply-updates (append updates1 updates2) ram map) + (apply-updates updates2 + (apply-updates updates1 ram map) map))) + +(in-theory (disable apply-update)) + +(defthm apply-updates-collect-dynamic-is-mark + (equal (mark-1-aux typ-or-typs ptr-or-ptrs n ram map mode) + (apply-updates (collect-updates-zdynamic-1-aux + typ-or-typs ptr-or-ptrs n ram map mode) + ram map)) + :hints (("Goal" :do-not '(generalize)))) + +; +;-------------------- +; + +(defun collect-updates-dynamic-1 (typ ptr n ram map) + (collect-updates-zdynamic-1-aux typ ptr n ram map 'ATOM)) + +(defun collect-updates-dynamic-1-list (typs ptrs n ram map) + (collect-updates-zdynamic-1-aux typs ptrs n ram map 'LIST)) + + +;-------------------- + +(defun all-collect-updates-dynamic-1 (typs ptrs ns ram map) + (if (endp typs) + nil + (append (collect-updates-dynamic-1 (car typs) (car ptrs) (car ns) + ram map) + (all-collect-updates-dynamic-1 + (cdr typs) (cdr ptrs) (cdr ns) + (mark-1 (car typs) (car ptrs) (car ns) ram map) + map)))) + +;-------------- + +(defun collect-updates-dynamic (rc) + (all-collect-updates-dynamic-1 (typ-list (ptrs rc)) + (addr-list (ptrs rc)) + (n-list (ptrs rc)) + (ram rc) + (getmap rc))) + +;-------------- + +(defthm all-mark-1-is-apply-update-1 + (equal (all-mark-1 typs addrs ns ram map) + (apply-updates (all-collect-updates-dynamic-1 typs addrs ns ram map) + ram map))) + + +(defthm apply-equal-mark + (equal (mark rc) + (apply-updates (collect-updates-dynamic rc) + (ram rc) (getmap rc)))) + +;-------------- +;; +;; next is to prove struct-equiv, +;; is if data cell doesn't overlap with link cell, +;; then collect-dyanmic is collect-static +;; + + +(defun overlap (a b) + (if (endp a) nil + (or (member (car a) b) + (overlap (cdr a) b)))) + +(defun update-2-w (update ram) + (let ((ptr (gptr update)) + (i (gi update))) + (+ i (g ptr ram)))) + +(defun updates-2-ws (updates ram map) + (if (endp updates) + nil + (cons (update-2-w (car updates) ram) + (updates-2-ws (cdr updates) (apply-update (car updates) ram map) + map)))) + +(defthm member-append + (implies (member x a) + (member x (append a b)))) + +(defthm inrange-seen + (implies (and (not (zp l)) + (integerp x) + (integerp y) + (integerp l) + (< y (+ x l)) + (<= x y)) + (member y (seq-int x l))) + :hints (("Goal" :do-not '(generalize)))) + +(defthm consp-car-append + (implies (consp l) + (equal (car (append l x)) + (car l)))) + + +(defthm consp-implies-consp + (implies (and (consp (append a b)) + (not (consp b))) + (consp a)) + :rule-classes :forward-chaining) + + +;---------------------------------- +; +; very awkward, because our collect-data-cell doesn't match our collect-updates. +; +; collect-data-cell, record the data cell, in collect-data-cell-1-list +; while collect-updates-dymanic collect data-cell in collect-data-cell-1 +; + +(defthm first-update-must-be-a-data-field + (implies (consp (collect-updates-from-single-update1 TYP PTR I N RAM MAP)) + (not (assoc-equal (nth (gi (car (collect-updates-from-single-update1 TYP PTR i N RAM MAP))) + (cdr (assoc-equal typ map))) + map))) + :hints (("Goal" :do-not '(generalize)))) + +; +; proved that first update must be a data cell, we can't claim more, +; because the second update would be a data cell in a modified ram. +; we can't show that data cell is a data cell in the original ram. +; +; unless we have already shown that there is no overlap between data cell and +; link cell. +; + +;-------------- + +(defun pos (x l) + (if (endp l) 0 + (if (equal (car l) x) 0 + (+ 1 (pos x (cdr l)))))) + + +(defun not-assoc-equal-induct (typx typs ptrs) + (if (endp typs) + (list typx typs) + (if (equal (car typs) typx) + (list typx typs ptrs) + (not-assoc-equal-induct typx (cdr typs) (cdr ptrs))))) + +(defthm not-assoc-equal-must-be-in-collect-data-cell-list + (implies (and (member typx typs) + (not (assoc-equal typx map))) + (member (nth (pos typx typs) ptrs) + (collect-data-cells-1-aux typs + ptrs + n + ram map 'LIST))) + :hints (("Goal" :induct (not-assoc-equal-induct typx typs ptrs)))) + + +;; +;; we need to prove (nth (gi ....)) is such a typx +;; we probably don't have to prove the general case with i in the theorem. +;; + +;--- First: prove member (gi ..) + +(defthm update-typ-i-is-in-range-1 + (implies (consp (collect-updates-from-single-update1 + TYP PTR I N RAM MAP)) + (<= (nfix i) (gi (car (collect-updates-from-single-update1 typ ptr i n ram + map))))) + :hints (("Goal" :do-not '(generalize))) + :rule-classes :linear) + +(defthm update-typ-i-is-in-range-2 + (implies (consp (collect-updates-from-single-update1 + TYP PTR I N RAM MAP)) + (< (gi (car (collect-updates-from-single-update1 typ ptr i n ram + map))) + (len (cdr (assoc-equal typ map))))) + :hints (("Goal" :do-not '(generalize))) + :rule-classes :linear) + + +(defthm nth-member + (implies (and (<= 0 i) + (< i (len l))) + (member (nth i l) l))) + +(defun mycdrn (i l) + (if (zp i) + l + (mycdrn (- i 1) (cdr l)))) + + +(defthm member-nth-cdrn-2 + (implies (and (integerp i) + (integerp j) + (<= 0 i) + (<= i j) + (< j (len l))) + (member (nth j l) + (mycdrn i l)))) + + +(defthm integerp-gi-g-ptr-car-collect-update-from-single-update1 + (implies (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (integerp (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))))) + :rule-classes :forward-chaining) + +(defthm first-update-typ-is-member-of-sig + (implies (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (member (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + (cdr (assoc-equal typ map))) + (mycdrn i (cdr (assoc-equal typ map))))) + :hints (("Goal" :do-not '(generalize))) + :rule-classes :forward-chaining) + + +;------------------ +; +; Because we already have (member (nth (pos typx) ...) in data cells +; +; next we need to prove (nth (pos (nth (gi ...)) is (nth (gi ...)) +; +;------------------ + +(defthm pos-mycdrn + (implies (and (integerp i) + (<= 0 i) + (< i (len l))) + (equal (pos (nth i l) + (mycdrn i l)) 0))) + + +(defthm assoc-equal-not-equal-nth-gi + (implies (and (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (assoc-equal typx map)) + (not (equal (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + (cdr (assoc-equal typ map))) + typx)))) + + +(defthm pos-mycdrn-2 + (implies (and (integerp i) + (<= 0 i) + (< i (len l)) + (not (equal x (nth i l)))) + (equal (+ 1 (pos x (mycdrn i (cdr l)))) + (pos x + (mycdrn i l))))) + + + + +(defthm pos-is-gi + (implies (and (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (integerp i) + (<= 0 i)) + (equal (+ i (pos (nth (gi (car + (collect-updates-from-single-update1 + typ ptr i n ram map))) + (cdr (assoc-equal typ map))) + (mycdrn i (cdr (assoc-equal typ map))))) + (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map)))))) + + +(defthm nth-pos-mycdrn + (implies (and (integerp i) + (integerp j) + (<= 0 i) + (<= 0 j)) + (equal (nth i (mycdrn j l)) + (nth (+ j i) l)))) + + + +(defthm nth-pos-is-nth-gi + (implies (and (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (integerp i) + (<= 0 i)) + (equal (nth (pos (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + (cdr (assoc-equal typ map))) + (mycdrn i (cdr (assoc-equal typ map)))) + (mycdrn i ptrs)) + (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + ptrs)))) + + + + + + +(defthm member-x-collect-data-cells-1-aux + (implies (member x (collect-data-cells-1-aux (mycdrn i typs) + (mycdrn i ptrs) + n + ram map 'LIST)) + (member x (collect-data-cells-1-aux typs ptrs n ram map + 'LIST)))) + + + +(defthm first-update-is-in-data-cells-colllect-lemma + (implies (and (consp (collect-updates-from-single-update1 TYP PTR I N RAM MAP)) + (<= 0 i) + (integerp i)) + (member + (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) ptrs) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + ptrs + (- n 1) + ram map 'LIST))) + :hints (("Goal" :in-theory (disable not-assoc-equal-must-be-in-collect-data-cell-list) + :use ((:instance + not-assoc-equal-must-be-in-collect-data-cell-list + (typx (nth (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + (cdr (assoc-equal typ map)))) + (typs (mycdrn i (cdr (assoc-equal typ map)))) + (ptrs (mycdrn i ptrs)) + (n (- n 1)))) + :do-not-induct t))) + + +(defun nth-i-seq-int-induct (i addr l) + (if (zp i) + (list i addr l) + (if (zp l) + (list i addr l) + (nth-i-seq-int-induct (- i 1) + (+ addr 1) + (- l 1))))) + + +(defthm seq-int-1-equal + (equal (seq-int x 1) + (list (+ 0 x))) + :hints (("Goal" :expand (seq-int x 1)))) + + +(defthm nth-i-seq-int + (implies (and (<= 0 i) + (< i l) + (integerp l) + (integerp i)) + (equal (nth i (seq-int addr l)) + (+ addr i))) + :hints (("Goal" :do-not '(generalize) + :induct (nth-i-seq-int-induct i addr l)))) + +(defthm gptr-is-g-ptr-car-collect-update-from-single-update1 + (implies (consp (collect-updates-from-single-update1 typ ptr i n ram map)) + (equal (gptr (car (collect-updates-from-single-update1 + typ ptr i n ram map))) + ptr))) + + +(defthm first-update-is-in-data-cells-colllect + (implies (and (consp (collect-updates-from-single-update1 TYP PTR I N RAM MAP)) + (integerp i) + (<= 0 i)) + (member + (update-2-w + (car (collect-updates-from-single-update1 typ ptr i n ram map)) ram) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ + map)))) + (- n 1) + ram map 'LIST))) + :hints (("Goal" :in-theory (disable first-update-is-in-data-cells-colllect-lemma) + :use ((:instance + first-update-is-in-data-cells-colllect-lemma + (ptrs (seq-int (g ptr ram) + (len (cdr (assoc-equal typ map)))))) + (:instance nth-i-seq-int + (i (gi (car (collect-updates-from-single-update1 + typ ptr i n ram map)))) + (l (len (cdr (assoc-equal typ map)))))) + :do-not-induct t))) + + + +(in-theory (disable collect-updates-from-single-update1 update-2-w)) + + +(defthm first-update-is-in-data-cells + (implies (consp (collect-updates-zdynamic-1-aux typs ptrs n ram map mode)) + (member + (update-2-w + (car (collect-updates-zdynamic-1-aux typs ptrs n ram map mode)) ram) + (collect-data-cells-1-aux typs ptrs n ram map mode))) + :hints (("Goal" :do-not '(generalize)) + ("Subgoal *1/12.1" :cases + ((consp + (collect-updates-zdynamic-1-aux + (CAR TYPS) PTRS1 N RAM MAP 'ATOM)))) + ("Subgoal *1/10.1" :cases + ((consp + (collect-updates-zdynamic-1-aux + (CAR TYPS) PTRS1 N RAM MAP 'ATOM)))) + ("Subgoal *1/5" + :expand (COLLECT-UPDATES-ZDYNAMIC-1-AUX TYPS PTRS N RAM MAP 'ATOM) + :cases ((consp (COLLECT-UPDATES-FROM-SINGLE-UPDATE1 TYPS PTRS 0 N RAM MAP)))) + ("Subgoal *1/4" + :expand (COLLECT-UPDATES-ZDYNAMIC-1-AUX TYPS PTRS N RAM MAP 'ATOM) + :cases ((consp (COLLECT-UPDATES-FROM-SINGLE-UPDATE1 TYPS PTRS 0 N RAM MAP)))))) + + +(defthm member-implies-not-member + (implies (and (not (overlap a b)) + (member x a)) + (not (member x b)))) + +(defthm not-overlap-data-link-implies-first-step-does-not-update-link-cell + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map mode) + (collect-link-cells-1-aux typs ptrs n ram map mode))) + (consp (collect-updates-zdynamic-1-aux typs ptrs n ram map mode))) + (not (member + (update-2-w (car (collect-updates-zdynamic-1-aux typs ptrs n + ram map mode)) ram) + (collect-link-cells-1-aux typs ptrs n ram map mode))))) + + +;------------ proved that if data, link doesn't overlap, +;------------ apply updates perserve the consistent state. + +(defthm first-update-1-in-collect-data-cell-1 + (implies (consp (collect-updates-dynamic-1 typ ptr n ram map)) + (member (update-2-w + (car (collect-updates-dynamic-1 typ ptr n ram map)) ram) + (collect-data-cells-1 typ ptr n ram map)))) + + +(defthm not-consp-collect-updates-dynamic-1-mark-1-is-no-op + (implies (not (consp (collect-updates-dynamic-1 typ ptr n ram map))) + (equal (mark-1 typ ptr n ram map) + ram))) + +(defthm all-collect-updates-dynamic-1-opener + (implies (consp typs) + (equal (all-collect-updates-dynamic-1 typs ptrs ns ram map) + (append (collect-updates-dynamic-1 + (car typs) (car ptrs) (car ns) ram map) + (all-collect-updates-dynamic-1 (cdr typs) (cdr ptrs) + (cdr ns) + (mark-1 (car typs) + (car ptrs) + (car ns) + ram map) + map)))) + :hints (("Goal" :in-theory (disable collect-updates-dynamic-1 mark-1)))) + +(in-theory (disable all-collect-updates-dynamic-1-opener)) + +(defthm first-update-1-in-all-collect-data-cell-1 + (implies (consp (all-collect-updates-dynamic-1 typs ptrs ns ram map)) + (member (update-2-w + (car (all-collect-updates-dynamic-1 typs ptrs ns ram map)) ram) + (all-collect-data-cells-1 typs ptrs ns ram map))) + :hints (("Goal" :in-theory (cons 'all-collect-updates-dynamic-1-opener + (disable collect-updates-dynamic-1 + update-2-w mark-1 + collect-data-cells-1)) + :do-not '(generalize)) + ("Subgoal *1/3" :cases ((consp (collect-updates-dynamic-1 + (car typs) (car ptrs) (car ns) ram + map)))) + ("Subgoal *1/2" :cases ((consp (collect-updates-dynamic-1 + (car typs) (car ptrs) (car ns) ram + map)))))) + + +(defthm first-update-in-collect-data-cell + (implies (consp (collect-updates-dynamic rc)) + (member (update-2-w + (car (collect-updates-dynamic rc)) (ram rc)) + (collect-data-cells rc)))) + +;---------------- + +(defthm first-update-not-in-collect-link-cell + (implies (and (consp (collect-updates-dynamic rc)) + (not (overlap (collect-data-cells rc) + (collect-link-cells rc)))) + (not (member (update-2-w + (car (collect-updates-dynamic rc)) (ram rc)) + (collect-link-cells rc))))) + + +;------------------ + +(defthm struct-equiv-preserved-if-update-non-link-cell + (implies (not (member addr (collect-link-cells rc))) + (struct-equiv (set-ram (s addr v (ram rc)) rc) + rc))) + +(defthm struct-equiv-preserved-if-apply-update-non-link-cell + (implies (not (member (update-2-w update (ram rc)) + (collect-link-cells rc))) + (struct-equiv (set-ram (apply-update update (ram rc) (getmap rc)) + rc) + rc)) + :hints (("Goal" :in-theory (list* 'apply-update + 'update-2-w + (disable struct-equiv + collect-link-cells))))) + + + +;; +;; this can't be proved, easily. +;; + +; +;(defthm struct-equiv-apply-updates +; (implies (not (overlap (collect-data-cells rc) +; (collect-link-cells rc))) +; (struct-equiv +; (apply-updates (collect-updates-dynamic rc) +; (ram rc) (getmap rc)) +; rc)) +; :hints (("Goal" :in-theory (disable collect-updates-dynamic +; collect-link-cells +; collect-data-cells +; struct-equiv)))) +; + + +;; +;; because, we can't prove a (defcong equal collect-update-dynamic ...) +;; unless we know no-overlap +;; + +;; we set out to prove +; +; (defthm not-overlap-and-collect-dynamic-is-collect-static +; (implies (not (overlap (collect-data-cells rc) +; (collect-link-cells rc))) +; (equal (collect-update-dynamic rc) +; (collect-update-static rc)))) +; + +(defun collect-updates-from-single-update1-static (typ ptr i n ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (collect-updates-from-single-update1-static typ ptr (+ i 1) n ram map) + ;; else not a struct type, update the value + ;; let the new value depends on the changes to the previous slos + (cons (make-update typ ptr i n) + (collect-updates-from-single-update1-static + typ ptr (+ i 1) n ram map))) + nil)))) + +(defun collect-updates-static-1-aux (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) nil + (if (zp ptr) nil + (if (not (assoc-equal typ map)) ;; not bound + nil + (let* ((addr (g ptr ram))) + (append (collect-updates-from-single-update1-static + typ ptr 0 n ram map) + (collect-updates-static-1-aux + desc + (seq-int addr size) + (- n 1) + ram map 'LIST)))))))) + ((equal mode 'LIST) + (if (endp typs) + nil + (if (not (assoc-equal (car typs) map)) + (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST) + (append (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map 'ATOM) + (collect-updates-static-1-aux (cdr typs) + (cdr ptrs) + n + ram map 'LIST))))) + (t nil)))) + + +;-------------------- +(defthm collect-updates-from-single-update1-static-is-independent-of-ram + (equal (collect-updates-from-single-update1-static + typ ptr i n AnyRam map) + (collect-updates-from-single-update1-static + typ ptr i n ram map)) + :hints (("Goal" :do-not '(generalize))) + :rule-classes nil) + + + +(defthm struct-equiv-1-aux-implies-collect-static-updates-1-aux-equal + (implies (struct-equiv-1-aux typ-or-typs ptr-or-ptrs n ram1 ram2 map mode) + (equal (collect-updates-static-1-aux typ-or-typs ptr-or-ptrs n + ram1 map mode) + (collect-updates-static-1-aux typ-or-typs ptr-or-ptrs n + ram2 map mode))) + :hints (("Subgoal *1/6" + :use ((:instance + collect-updates-from-single-update1-static-is-independent-of-ram + (i 0) (typ typ-or-typs) (ptr ptr-or-ptrs) (anyRam ram1) (ram ram2)))))) + +;; i need a strong theorem that establish equal after an update to the non-link +;; cell + + +(defthm not-change-link-collect-updates-from-single-update1-static-not-changed + (equal (collect-updates-from-single-update1-static + typ ptr i n (s addr v ram) map) + (collect-updates-from-single-update1-static + typ ptr i n ram map))) + + +(defthm not-change-link-cell-collect-update-static-1-aux-not-changed + (implies (not (member addr (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + (equal (collect-updates-static-1-aux typ-or-typs ptr-or-ptrs + n (s addr v ram) map mode) + (collect-updates-static-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + :hints (("Goal" :in-theory (disable + collect-updates-from-single-update1-static)))) + +;-------------------- +;; ready to prove the most important theorem +;; collect-dynamic is collect-static +;; when data cell and link cell doesn't overlap + + +(defun not-change-induct (typ ptr i n AnyRam ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr AnyRam))) + (if (zp ptr) (list typ ptr i n anyRam ram map) + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (not-change-induct typ ptr (+ i 1) n AnyRam ram map) + ;; else not a struct type, update the value + (let ((new-ram (s (+ addr i) (new-field-value typ ptr i n AnyRam map) AnyRam))) + ;; let the new value depends on the changes to the previous slos + (not-change-induct typ ptr (+ i 1) n new-ram ram map))) + (list typ ptr i n anyRam ram map))))) + + + +(defthm not-change-link-collect-updates-from-single-update1-is-statick-not-changed + (equal (collect-updates-from-single-update1 + typ ptr i n AnyRam map) + (collect-updates-from-single-update1-static + typ ptr i n ram map)) + :hints (("Goal" :do-not '(generalize) + :induct (not-change-induct typ ptr i n AnyRam ram map)) + ("Subgoal *1/3" :expand (collect-updates-from-single-update1 + typ ptr i n AnyRam map)) + ("Subgoal *1/2" :expand (collect-updates-from-single-update1 + typ ptr i n AnyRam map)) + ("Subgoal *1/1" :expand (collect-updates-from-single-update1 + typ ptr i n AnyRam map)))) + +(in-theory (disable collect-updates-from-single-update1 + collect-updates-from-single-update1-static)) + + +(defthm not-overlap-append + (implies (not (overlap (append a b) + (append c d))) + (not (overlap a c)))) + + +(defthm not-overlap-append-2 + (implies (not (overlap (append a b) + (append c d))) + (not (overlap b d)))) + + +;------------------ + +;; We proved the following +;(thm +; (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map mode) +; (collect-link-cells-1-aux typs ptrs n ram map mode))) +; (consp (collect-updates-zdynamic-1-aux typs ptrs n ram map mode))) +; (not (member +; (update-2-w (car (collect-updates-zdynamic-1-aux typs ptrs n +; ram map mode)) ram) +; (collect-link-cells-1-aux typs ptrs n ram map mode))))) + +;--- prove more general theorem using the above + +;; 1/4.1 + +(defthm overlap-lemma + (implies (overlap a b) + (overlap a (cons x b)))) + +;------------------- + +;; why the following skip-proofs are true. +; +; because we can show +; +; (apply-updates (collect-updates-static-1-aux ...) gives struct-equiv state +; by showing applying first update, give you a struct-equiv state +; and the collect-updates-static-1-aux from that state is not changed. +; thus apply the second update +; +; +; current approach is to prove if no overlap then, collect-updates-static-1-aux +; is a subset of data links. +; + +(defun subset-induct (typ-or-typs ptr-or-ptrs n ram map mode) + (declare (xargs :measure (struct-equiv-1-aux-m typ-or-typs n mode))) + (let ((typ typ-or-typs) + (ptr ptr-or-ptrs) + (typs typ-or-typs) + (ptrs ptr-or-ptrs)) + (cond ((equal mode 'ATOM) + (let* ((desc (cdr (assoc-equal typ map))) + (size (len desc))) + (if (zp n) nil + (if (zp ptr) nil + (if (not (assoc-equal typ map)) ;; not bound + nil + (let* ((addr (g ptr ram))) + (subset-induct + desc (seq-int addr size) + (- n 1) + (apply-updates + (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST))))))) + + ((equal mode 'LIST) + (if (endp typs) + nil + (if (not (assoc-equal (car typs) map)) + (subset-induct (cdr typs) (cdr ptrs) n ram map 'LIST) + (list (subset-induct (car typs) (car ptrs) n ram map 'ATOM) + (subset-induct (cdr typs) (cdr ptrs) + n (apply-updates + (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map 'ATOM) + ram map) + map 'LIST))))) + (t (list typs ptrs n ram map mode))))) + + +(defthm subsetp-cons + (implies (subsetp x l) + (subsetp x (cons y l)))) + + +;-------------------------- + +(defthm struct-equiv-1-aux-preserved-if-apply-update-non-link-cell + (implies (not (member (update-2-w update ram) + (collect-link-cells-1-aux typs ptrs n ram map mode))) + (struct-equiv-1-aux + typs ptrs n (apply-update update ram map) ram map + mode)) + :hints (("Goal" :in-theory (enable apply-update update-2-w)))) + + +(defthm subsetp-update-2-ws + (implies (and (subsetp (updates-2-ws updates ram map) l) + (consp updates)) + (member (update-2-w (car updates) ram) l)) + :rule-classes :forward-chaining) + +(defthm member-overlap-2 + (implies (and (not (overlap a b)) + (member x a)) + (not (member x b))) + :rule-classes :forward-chaining) + + +(defthm subsetp-not-member-link-instance + (implies (and (not (overlap (collect-data-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode) + (collect-link-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (not (member (update-2-w (car updates) ram) + (collect-link-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode)))) + :hints (("Goal" :in-theory (disable collect-data-cells-1-aux + collect-link-cells-1-aux + subsetp overlap)))) + + +(defthm apply-updates-nil-is-not-changed + (implies (not (consp updates)) + (equal (apply-updates updates ram map) ram))) + + +(defthm struct-equiv-1-aux-preserved-if-apply-update-non-link-cell-instance + (implies (and (not (overlap (collect-data-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode) + (collect-link-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (struct-equiv-1-aux + typ-or-typs ptr-or-ptrs n (apply-update (car updates) ram map) ram map + mode)) + :hints (("Goal" :cases ((not (consp updates)))))) + + +(defthm collect-link-cells-1-aux-apply-updates-collect-links-updates-instance + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n + ram map mode) + (collect-link-cells-1-aux typs ptrs n + ram map mode))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + typs ptrs n ram map mode))) + (equal (collect-link-cells-1-aux typs ptrs n + (apply-update (car updates) ram + map) + map + mode) + (collect-link-cells-1-aux typs ptrs n + ram map mode))) + :hints (("Goal" :use ((:instance + struct-equiv-1-aux-implies-collect-link-cells-aux-equal + (ram1 (apply-update (car updates) ram map)) + (ram2 ram) + (typ-or-typs typs) (ptr-or-ptrs ptrs)))))) + + + + + +(defthm collect-link-cells-1-aux-apply-updates-collect-data-updates-instance + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n + ram map mode) + (collect-link-cells-1-aux typs ptrs n + ram map mode))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + typs ptrs n ram map mode))) + (equal (collect-data-cells-1-aux typs ptrs n + (apply-update (car updates) ram + map) + map + mode) + (collect-data-cells-1-aux typs ptrs n + ram map mode))) + :hints (("Goal" :use ((:instance + struct-equiv-1-aux-implies-collect-data-cells-aux-equal + (ram1 (apply-update (car updates) ram map)) + (ram2 ram) + (typ-or-typs typs) (ptr-or-ptrs ptrs)))))) + + + +(defthm apply-updates-struct-equiv-1-aux + (implies (and (not (overlap (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs n ram map mode) + (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs n ram map mode))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + typ-or-typs ptr-or-ptrs n ram map mode))) + (struct-equiv-1-aux + typ-or-typs ptr-or-ptrs n + (apply-updates updates ram map) + ram map + mode)) + :hints (("Goal" :do-not '(generalize)))) + + +; shared + +;------------------------- + +(defthm subsetp-collect-data-cells-1-collect-data-cells-1 + (implies (consp typs) + (subsetp (collect-data-cells-1-aux + (car typs) (car ptrs) n ram map 'ATOM) + (collect-data-cells-1-aux + typs ptrs n ram map 'LIST)))) + + +(defthm apply-updates-struct-equiv-1-aux-instance + (implies (and (not (overlap (collect-data-cells-1-aux + typs ptrs n ram map 'LIST) + (collect-link-cells-1-aux + typs ptrs n ram map 'LIST))) + (consp updates) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + (car typs) (car ptrs) n ram map 'ATOM))) + (struct-equiv-1-aux + typs ptrs n + (apply-updates updates ram map) + ram map + 'LIST))) + +(defthm apply-updates-struct-equiv-1-aux-instance-1-instance + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map 'LIST) + (collect-link-cells-1-aux typs ptrs n ram map + 'LIST))) + (not (endp typs)) + (assoc-equal (car typs) map) + (subsetp (updates-2-ws updates ram map) + (collect-data-cells-1-aux + (car typs) (car ptrs) n ram map 'ATOM))) + (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates updates + ram map) + ram map 'LIST)) + :hints (("Goal" :in-theory (disable apply-updates-struct-equiv-1-aux-instance) + :use apply-updates-struct-equiv-1-aux-instance))) + + + +(defthm struct-equiv-1-aux-implies-collect-data-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-data-cells-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-data-cells-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) + + +(defthm struct-equiv-1-aux-implies-collect-link-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-link-cells-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-link-cells-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) + + +(defthm struct-equiv-1-aux-implies-collect-static-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) + + +;; solved 1-7-2-1 + +(defthm updates-2-ws-append + (equal (updates-2-ws (append updates1 updates2) + ram map) + (append (updates-2-ws updates1 ram map) + (updates-2-ws updates2 + (apply-updates updates1 ram map) map)))) + + +;; solved 1-7-1-1 + + + + +;; because our induction in collect-data-cells and collect-updates doesn't +;; match well. This proof is complicated. + +(defun collect-data-cells-from-single-node (typ ptr i ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (collect-data-cells-from-single-node typ ptr (+ i 1) ram map) + ;; else not a struct type, update the value + (cons (+ i addr) + (collect-data-cells-from-single-node + typ ptr (+ i 1) ram map))) + nil)))) + + + +;; prove a more general one than +;; subsetp-collect-data-cells-from-single-node-collect-data-cells + +(defthm nth-i-equal-car-mycdrn-i + (implies (and (< i (len l)) + (<= 0 i)) + (equal (nth i l) + (car (mycdrn i l))))) + + +(defthm member-collect-data-cells-1-aux + (implies (and (not (assoc-equal (car (mycdrn i typs)) map)) + (< i (len typs)) + (<= 0 i)) + (member (+ i addr) + (collect-data-cells-1-aux + (mycdrn i typs) + (seq-int (+ i addr) + (len (mycdrn i typs))) + n + ram map 'LIST)))) + + +(defthm subsetp-collect-data-1-aux-mycdrn + (implies (and (consp typs) + (integerp i) + (<= 0 i)) + (subsetp (collect-data-cells-1-aux + (cdr typs) + (seq-int (+ 1 addr) + (len (cdr typs))) + n + ram map 'LIST) + (collect-data-cells-1-aux + typs + (seq-int addr + (len typs)) + n + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + + +(defthm mycdrn-i-cdr + (equal (mycdrn i (cddr typs)) + (cdr (mycdrn i (cdr typs))))) + + +(defthm subsetp-collect-data-1-aux-mycdrn-2 + (implies (and (consp typs) + (integerp i) + (<= 0 i) + (assoc-equal (car typs) map)) + (subsetp (collect-data-cells-1-aux + (cdr typs) + (seq-int (+ 1 addr) + (len (cdr typs))) + n + ram map 'LIST) + (collect-data-cells-1-aux + typs + (cons any + (seq-int (+ 1 addr) + (len (cdr typs)))) + n + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + +(defthm subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma + (implies (and (integerp i) + (<= 0 i)) + (subsetp (collect-data-cells-from-single-node + typ ptr i ram map) + (collect-data-cells-1-aux + (mycdrn i (cdr (assoc-equal typ map))) + (seq-int (+ i (g ptr ram)) (len (mycdrn i (cdr (assoc-equal typ map))))) + (- n 1) + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + + +(defthm seq-int-fix + (equal (seq-int (fix addr) len) + (seq-int addr len))) + +(defthm subsetp-collect-data-cells-from-single-node-collect-data-cells + (subsetp (collect-data-cells-from-single-node + typ ptr 0 ram map) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)) + :hints (("Goal" + :in-theory (disable subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma) + :use ((:instance + subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma + (i 0)))))) + +;----------- +(defun induct-collect-updates (typ ptr i n ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (induct-collect-updates typ ptr (+ i 1) n ram map) + ;; else not a struct type, update the value + (let ((new-ram (s (+ addr i) (new-field-value typ ptr i n ram map) ram))) + ;; let the new value depends on the changes to the previous slos + (induct-collect-updates typ ptr (+ i 1) n + new-ram map))) + nil)))) + +#| +;; a general statement. easy to prove but not so good. +(defthm collect-data-cells-from-single-node-not-affected-by-lemma + (implies (equal (g ptr ram2) (g ptr ram1)) + (equal (collect-data-cells-from-single-node + typ ptr i ram2 map) + (collect-data-cells-from-single-node + typ ptr i ram1 map)))) +;; free variables. not good. so write a more specific one. +|# + + +(defthm collect-data-cells-from-single-node-not-affected-by-lemma-2 + (implies (not (equal addr ptr)) + (equal (collect-data-cells-from-single-node + typ ptr i (s addr anyValue ram) map) + (collect-data-cells-from-single-node + typ ptr i ram map)))) + + +(defthm member-not-member-implies-not-equal-f + (implies (and (not (member x l)) + (member y l)) + (not (equal x y))) + :rule-classes :forward-chaining) + + + +;; not a very good one. +(defthm collect-data-cells-from-single-node-not-affected-by + (implies (and (not (member ptr (collect-data-cells-from-single-node + typ ptr i ram map))) + (member addr (collect-data-cells-from-single-node + typ ptr i ram map))) + (equal (collect-data-cells-from-single-node + typ ptr i (s addr anyValue ram) map) + (collect-data-cells-from-single-node + typ ptr i ram map)))) + +(defthm collect-updates-from-single-update1-static-opener + (implies (zp ptr) + (equal (collect-updates-from-single-update1-static + typ ptr i n ram map) nil)) + :hints (("Goal" :expand + (collect-updates-from-single-update1-static + typ ptr i n ram map)))) + +(defthm collect-updates-from-single-update1-static-opener-2 + (implies (and (<= (LEN (CDR (ASSOC-EQUAL TYP MAP))) I) + (integerp i)) + (equal (collect-updates-from-single-update1-static + typ ptr i n ram map) nil)) + :hints (("Goal" :expand + (collect-updates-from-single-update1-static + typ ptr i n ram map)))) +#| +(defthm collect-updates-from-single-update1-static-opener-3 + (implies (zp n) + (equal (collect-updates-from-single-update1-static + typ ptr i n ram map) nil)) + :hints (("Goal" :expand + (collect-updates-from-single-update1-static + typ ptr i n ram map)))) +|# + + +(defthm equal-collect-data-cells-from-single-node-equal-updates-2-ws + (implies (and (not (member ptr (collect-data-cells-from-single-node + typ ptr i ram map))) + (integerp i) + (<= 0 i)) + (equal (updates-2-ws (collect-updates-from-single-update1-static + typ ptr i n ram map) ram map) + (collect-data-cells-from-single-node + typ ptr i ram map))) + :hints (("Goal" :induct (induct-collect-updates typ ptr i n ram map) + :in-theory (enable update-2-w make-update apply-update gptr gi gn gtyp) + :do-not '(generalize fertilize) + :expand (collect-updates-from-single-update1-static + typ ptr i n ram map)))) + + +(defthm not-member-forward-chaining + (implies (and (subsetp a b) + (not (member x b))) + (not (member x a))) + :rule-classes :forward-chaining) + + +(defthm subsetp-collect-updates-from-single-update-1-static + (implies (not (member ptr (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ + map)))) + (- n 1) ram map 'LIST))) + (subsetp (updates-2-ws (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST))) + :hints (("Goal" :in-theory (disable subsetp-collect-data-cells-from-single-node-collect-data-cells) + :use subsetp-collect-data-cells-from-single-node-collect-data-cells))) + + + +(defthm not-overlap-not-member-x + (implies (not (overlap a (cons x b))) + (not (member x a))) + :rule-classes :forward-chaining) + + +(defthm not-overlap-implies-not-member + (implies (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + (not (member ptr (collect-data-cells-1-aux + typ ptr n ram map 'ATOM)))) + :hints (("Goal" :expand (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + :rule-classes :forward-chaining) + + +;; I should modify the definition of collect-updates-from-single-update1-static +;; to return nil when n is zero + +(defthm subsetp-collect-updates-from-single-update-collect-data-1-aux + (implies (and (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map + 'ATOM))) + (not (zp n))) + (subsetp (updates-2-ws (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + (collect-data-cells-1-aux typ ptr n ram map 'ATOM))) + :hints (("Goal" :expand (collect-data-cells-1-aux typ ptr n ram map 'ATOM)))) + + +(defthm apply-updates-struct-equiv-1-aux-instance-2 + (implies (not (overlap (collect-data-cells-1-aux + typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux + typ ptr n ram map 'ATOM))) + (struct-equiv-1-aux + typ ptr n + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram map + 'ATOM)) + :hints (("Goal" :cases ((not (zp n)))) + ("Subgoal 1" :cases ((consp (collect-updates-from-single-update1-static + typ ptr 0 n ram map)))))) + + + +(defthm apply-updates-struct-equiv-1-aux-instance-2-instance + (implies (and (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + (assoc-equal typ map) + (not (zp n)) + (not (zp ptr))) + (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST)) + :hints (("Goal" :in-theory (disable apply-updates-struct-equiv-1-aux-instance-2) + :use apply-updates-struct-equiv-1-aux-instance-2))) + +;----------------------- concrete instantiations + +(defthm struct-equiv-1-aux-implies-collect-data-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + + +(defthm struct-equiv-1-aux-implies-collect-link-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-link-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-link-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + + + +(defthm struct-equiv-1-aux-implies-collect-update-static-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-updates-static-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-updates-static-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + + + + +;------------------------- + +;; because our induction in collect-data-cells and collect-updates doesn't +;; match well. This proof is complicated. + +(defun collect-data-cells-from-single-node (typ ptr i ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (collect-data-cells-from-single-node typ ptr (+ i 1) ram map) + ;; else not a struct type, update the value + (cons (+ i addr) + (collect-data-cells-from-single-node + typ ptr (+ i 1) ram map))) + nil)))) + + + +;; prove a more general one than +;; subsetp-collect-data-cells-from-single-node-collect-data-cells + +(defthm nth-i-equal-car-mycdrn-i + (implies (and (< i (len l)) + (<= 0 i)) + (equal (nth i l) + (car (mycdrn i l))))) + + +(defthm member-collect-data-cells-1-aux + (implies (and (not (assoc-equal (car (mycdrn i typs)) map)) + (< i (len typs)) + (<= 0 i)) + (member (+ i addr) + (collect-data-cells-1-aux + (mycdrn i typs) + (seq-int (+ i addr) + (len (mycdrn i typs))) + n + ram map 'LIST)))) + + +(defthm subsetp-collect-data-1-aux-mycdrn + (implies (and (consp typs) + (integerp i) + (<= 0 i)) + (subsetp (collect-data-cells-1-aux + (cdr typs) + (seq-int (+ 1 addr) + (len (cdr typs))) + n + ram map 'LIST) + (collect-data-cells-1-aux + typs + (seq-int addr + (len typs)) + n + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + + +(defthm mycdrn-i-cdr + (equal (mycdrn i (cddr typs)) + (cdr (mycdrn i (cdr typs))))) + + +(defthm subsetp-collect-data-1-aux-mycdrn-2 + (implies (and (consp typs) + (integerp i) + (<= 0 i) + (assoc-equal (car typs) map)) + (subsetp (collect-data-cells-1-aux + (cdr typs) + (seq-int (+ 1 addr) + (len (cdr typs))) + n + ram map 'LIST) + (collect-data-cells-1-aux + typs + (cons any + (seq-int (+ 1 addr) + (len (cdr typs)))) + n + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + +(defthm subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma + (implies (and (integerp i) + (<= 0 i)) + (subsetp (collect-data-cells-from-single-node + typ ptr i ram map) + (collect-data-cells-1-aux + (mycdrn i (cdr (assoc-equal typ map))) + (seq-int (+ i (g ptr ram)) (len (mycdrn i (cdr (assoc-equal typ map))))) + (- n 1) + ram map 'LIST))) + :hints (("Goal" :do-not '(generalize)))) + + +(defthm seq-int-fix + (equal (seq-int (fix addr) len) + (seq-int addr len))) + +(defthm subsetp-collect-data-cells-from-single-node-collect-data-cells + (subsetp (collect-data-cells-from-single-node + typ ptr 0 ram map) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)) + :hints (("Goal" + :in-theory (disable subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma) + :use ((:instance + subsetp-collect-data-cells-from-single-node-collect-data-cells-lemma + (i 0)))))) + +;----------- +(defun induct-collect-updates (typ ptr i n ram map) + (declare (xargs :measure (m-collect-updates typ map i ram))) + (let* ((descriptor (cdr (assoc-equal typ map))) + (i (nfix i)) + (slot-typ (nth i descriptor)) + (addr (g ptr ram))) + (if (zp ptr) nil + (if (< i (len descriptor)) + (if (assoc-equal slot-typ map) + ;; a struct type, meaning a ptr in the (car addrs) + ;; don't touch link cells + (induct-collect-updates typ ptr (+ i 1) n ram map) + ;; else not a struct type, update the value + (let ((new-ram (s (+ addr i) (new-field-value typ ptr i n ram map) ram))) + ;; let the new value depends on the changes to the previous slos + (induct-collect-updates typ ptr (+ i 1) n + new-ram map))) + nil)))) + +#| +;; a general statement. easy to prove but not so good. +(defthm collect-data-cells-from-single-node-not-affected-by-lemma + (implies (equal (g ptr ram2) (g ptr ram1)) + (equal (collect-data-cells-from-single-node + typ ptr i ram2 map) + (collect-data-cells-from-single-node + typ ptr i ram1 map)))) +;; free variables. not good. so write a more specific one. +|# + + +(defthm collect-data-cells-from-single-node-not-affected-by-lemma-2 + (implies (not (equal addr ptr)) + (equal (collect-data-cells-from-single-node + typ ptr i (s addr anyValue ram) map) + (collect-data-cells-from-single-node + typ ptr i ram map)))) + + +(defthm member-not-member-implies-not-equal-f + (implies (and (not (member x l)) + (member y l)) + (not (equal x y))) + :rule-classes :forward-chaining) + + + +;; not a very good one. +(defthm collect-data-cells-from-single-node-not-affected-by + (implies (and (not (member ptr (collect-data-cells-from-single-node + typ ptr i ram map))) + (member addr (collect-data-cells-from-single-node + typ ptr i ram map))) + (equal (collect-data-cells-from-single-node + typ ptr i (s addr anyValue ram) map) + (collect-data-cells-from-single-node + typ ptr i ram map)))) + +(defthm collect-updates-from-single-update1-static-opener + (implies (zp ptr) + (equal (collect-updates-from-single-update1-static + typ ptr i n ram map) nil)) + :hints (("Goal" :expand + (collect-updates-from-single-update1-static + typ ptr i n ram map)))) + +(defthm collect-updates-from-single-update1-static-opener-2 + (implies (and (<= (LEN (CDR (ASSOC-EQUAL TYP MAP))) I) + (integerp i)) + (equal (collect-updates-from-single-update1-static + typ ptr i n ram map) nil)) + :hints (("Goal" :expand + (collect-updates-from-single-update1-static + typ ptr i n ram map)))) + + + +(defthm equal-collect-data-cells-from-single-node-equal-updates-2-ws + (implies (and (not (member ptr (collect-data-cells-from-single-node + typ ptr i ram map))) + (integerp i) + (<= 0 i)) + (equal (updates-2-ws (collect-updates-from-single-update1-static + typ ptr i n ram map) ram map) + (collect-data-cells-from-single-node + typ ptr i ram map))) + :hints (("Goal" :induct (induct-collect-updates typ ptr i n ram map) + :in-theory (enable update-2-w make-update apply-update gptr gi gn gtyp) + :do-not '(generalize fertilize) + :expand (collect-updates-from-single-update1-static + typ ptr i n ram map)))) + + +(defthm not-member-forward-chaining + (implies (and (subsetp a b) + (not (member x b))) + (not (member x a))) + :rule-classes :forward-chaining) + + +(defthm subsetp-collect-updates-from-single-update-1-static + (implies (not (member ptr (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ + map)))) + (- n 1) ram map 'LIST))) + (subsetp (updates-2-ws (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST))) + :hints (("Goal" :in-theory (disable subsetp-collect-data-cells-from-single-node-collect-data-cells) + :use subsetp-collect-data-cells-from-single-node-collect-data-cells))) + + + +(defthm not-overlap-not-member-x + (implies (not (overlap a (cons x b))) + (not (member x a))) + :rule-classes :forward-chaining) + + + +(defthm subsetp-collect-updates-static-1-aux-data-cells + (implies (not (overlap (collect-data-cells-1-aux typ-or-typs + ptr-or-ptrs n ram map mode) + (collect-link-cells-1-aux typ-or-typs + ptr-or-ptrs n ram map mode))) + (subsetp (updates-2-ws (collect-updates-static-1-aux typ-or-typs + ptr-or-ptrs + n ram map mode) ram map) + (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + :hints (("Goal" :induct (subset-induct + typ-or-typs ptr-or-ptrs n ram map mode) + :do-not '(generalize)))) + +;; this is important result + + + +;--- this above the important result we want to show --- +(defun prefix (a b) + (if (endp a) t + (if (endp b) nil + (and (equal (car a) (car b)) + (prefix (cdr a) (cdr b)))))) + +(defthm prefix-subsetp + (implies (prefix updates2 updates1) + (subsetp (updates-2-ws updates2 ram map) + (updates-2-ws updates1 ram map)))) + +(defthm prefix-append + (prefix a (append a b))) + +(defthm subsetp-collect-updates-static-1-aux + (implies (and (not (endp typs)) + (assoc-equal (car typs) map)) + (subsetp (updates-2-ws (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map 'ATOM) ram map) + (updates-2-ws (collect-updates-static-1-aux + typs ptrs n ram map 'LIST) ram map)))) + + +(defthm apply-updates-struct-equiv-1-aux-instance-1 + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map 'LIST) + (collect-link-cells-1-aux typs ptrs n ram map + 'LIST))) + (not (endp typs)) + (assoc-equal (car typs) map)) + (struct-equiv-1-aux typs ptrs n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST)) + :hints (("Goal" :do-not '(generalize) + :cases ((consp (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map 'ATOM)))) + ("Subgoal 1" :use ((:instance subsetp-transitive + (a (updates-2-ws + (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map)) + (b (updates-2-ws + (collect-updates-static-1-aux + typs ptrs n ram map 'LIST) ram + map)) + (c (collect-data-cells-1-aux + typs ptrs n ram map 'LIST))))))) + + +;----------------- +; +; need to instantiate it again to get the version I wanted. +; +#| +(defthm apply-updates-struct-equiv-1-aux-instance-1-instance + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map 'LIST) + (collect-link-cells-1-aux typs ptrs n ram map + 'LIST))) + (not (endp typs)) + (assoc-equal (car typs) map)) + (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST)) + :hints (("Goal" :in-theory (disable apply-updates-struct-equiv-1-aux-instance-1) + :use apply-updates-struct-equiv-1-aux-instance-1))) + +;; now I have what I want. + +;; instantiate some of struct-equiv-1-aux-implies-collect-XXX-equal + +(defthm struct-equiv-1-aux-implies-collect-data-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-data-cells-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-data-cells-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) + +(defthm struct-equiv-1-aux-implies-collect-link-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-link-cells-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-link-cells-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) +|# + +(defthm struct-equiv-1-aux-implies-collect-update-static-1-aux-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) + + + +(defthm mark-1-aux-equal-is-if-dynamic-equal-static + (implies (equal (collect-updates-zdynamic-1-aux typ ptr n ram map 'ATOM) + (collect-updates-static-1-aux typ ptr n ram map 'ATOM)) + (equal (mark-1-aux typ ptr n ram map 'ATOM) + (apply-updates (collect-updates-static-1-aux + typ ptr n ram map 'ATOM) ram map)))) + +;------------------------------- + + + + +(defthm lemma-1-7-2-1 + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map 'list) + (collect-link-cells-1-aux typs ptrs n ram map 'list))) + (equal (collect-updates-zdynamic-1-aux (car typs) + (car ptrs) n ram map + 'ATOM) + (collect-updates-static-1-aux (car typs) + (car ptrs) n ram map + 'ATOM)) + (not (endp typs)) + (assoc-equal (car typs) map)) + (not (overlap (collect-data-cells-1-aux + (cdr typs) (cdr ptrs) n + (mark-1-aux (car typs) (car ptrs) n ram map 'ATOM) + map 'LIST) + (collect-link-cells-1-aux + (cdr typs) (cdr ptrs) n + (mark-1-aux (car typs) (car ptrs) n ram map 'ATOM) + map 'LIST)))) + :hints (("Goal" :in-theory (disable apply-updates-collect-dynamic-is-mark)))) + + + + +;; (in-theory (disable mark-1-aux-equal-is-if-dynamic-equal-static)) + +#| +(defthm struct-equiv-1-aux-implies-collect-update-static-1-aux-equal-instance + (implies (struct-equiv-1-aux (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) + ram map) + ram map 'LIST) + (equal (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n + (apply-updates (collect-updates-static-1-aux + (car typs) (car ptrs) n ram map + 'ATOM) ram map) map 'LIST) + (collect-updates-static-1-aux + (cdr typs) (cdr ptrs) n ram map 'LIST)))) +|# + +(defthm lemma-1-7-1-1 + (implies (and (not (overlap (collect-data-cells-1-aux typs ptrs n ram map 'list) + (collect-link-cells-1-aux typs ptrs n ram map + 'list))) + (not (endp typs)) + (assoc-equal (car typs) map) + (equal (collect-updates-zdynamic-1-aux (car typs) + (car ptrs) n ram map + 'ATOM) + (collect-updates-static-1-aux (car typs) + (car ptrs) n ram map + 'ATOM)) + (equal (collect-updates-zdynamic-1-aux (cdr typs) + (cdr ptrs) n + (mark-1-aux (car typs) + (car ptrs) + n + ram map + 'ATOM) + map 'LIST) + (collect-updates-static-1-aux (cdr typs) + (cdr ptrs) n + (mark-1-aux (car typs) + (car ptrs) + n + ram map + 'ATOM) + map 'LIST))) + (equal (collect-updates-zdynamic-1-aux (cdr typs) + (cdr ptrs) n + (mark-1-aux (car typs) + (car ptrs) + n + ram map + 'ATOM) + map 'LIST) + (collect-updates-static-1-aux (cdr typs) + (cdr ptrs) n + ram + map 'LIST))) + :hints (("Goal" :in-theory (disable + apply-updates-collect-dynamic-is-mark)))) + + + +;--------------- prove the two lemmas that deal with recursion +;--------------- mode = LIST. + +;--------------- mode = ATOM +#| +(skip-proofs + (defthm subsetp-collect-updates-from-single-update-collect-data-1-aux + (implies (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + (subsetp (updates-2-ws (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + (collect-data-cells-1-aux typ ptr n ram map 'ATOM))))) +|# + + +(defthm subsetp-collect-updates-from-single-update-collect-updates-static-1-aux + (implies (and (assoc-equal typ map) + (not (zp n)) + (not (zp ptr))) + (subsetp (updates-2-ws (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + (updates-2-ws (collect-updates-static-1-aux + typ ptr n ram map 'ATOM) ram map))) + :hints (("Goal" :expand (collect-updates-static-1-aux typ ptr n ram map + 'ATOM)))) + +;--------------- +#| +(defthm apply-updates-struct-equiv-1-aux-instance-2 + (implies (and (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + (assoc-equal typ map) + (not (zp ptr))) + (struct-equiv-1-aux typ ptr n + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) + ram map) + ram map 'ATOM)) + :hints (("Goal" + :cases ((consp (collect-updates-from-single-update1-static + typ ptr 0 n ram map)))) + ("Subgoal 1" + :use ((:instance subsetp-transitive + (a (updates-2-ws + (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map)) + (b (updates-2-ws + (collect-updates-static-1-aux + typ ptr n ram map 'ATOM) ram ram)) + (c (collect-data-cells-1-aux + typ ptr n ram map 'ATOM))))))) + +|# +#| +; instantiate the about again + + +(defthm apply-updates-struct-equiv-1-aux-instance-2-instance + (implies (and (not (overlap (collect-data-cells-1-aux typ ptr n ram map 'ATOM) + (collect-link-cells-1-aux typ ptr n ram map 'ATOM))) + (assoc-equal typ map) + (not (zp n)) + (not (zp ptr))) + (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST)) + :hints (("Goal" :in-theory (disable apply-updates-struct-equiv-1-aux-instance-2) + :use apply-updates-struct-equiv-1-aux-instance-2))) + +;----------------------- concrete instantiations + +(defthm struct-equiv-1-aux-implies-collect-data-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-data-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + + +(defthm struct-equiv-1-aux-implies-collect-link-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-link-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-link-cells-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + + +(defthm struct-equiv-1-aux-implies-collect-update-static-equal-instance-2 + (implies (struct-equiv-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + ram + map 'LIST) + (equal (collect-updates-static-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + (apply-updates (collect-updates-from-single-update1-static + typ ptr 0 n ram map) ram map) + map 'LIST) + (collect-updates-static-1-aux + (cdr (assoc-equal typ map)) + (seq-int (g ptr ram) (len (cdr (assoc-equal typ map)))) + (- n 1) + ram map 'LIST)))) + +|# +;--------------------------------------- + + +(defthm collect-updates-zdynamic-1-aux-is-collect-updates-static-1-aux + (implies (not (overlap (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode) + (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + (equal (collect-updates-zdynamic-1-aux typ-or-typs ptr-or-ptrs + n ram map mode) + (collect-updates-static-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + :hints (("Goal" :induct (collect-updates-zdynamic-1-aux typ-or-typs + ptr-or-ptrs + n ram map mode) + :in-theory (disable + APPLY-UPDATES-COLLECT-DYNAMIC-IS-MARK) + :do-not '(generalize)))) + + + +;------------------ done at last !!! ------- +; +; we now have this result and a theorem that +; (updates-2-ws (collect-updates-static-1-aux ..) is a subset of +; (collect-static-data ..) +; + + +(defthm g-over-apply-update-lemma + (implies (not (equal addr (update-2-w update ram))) + (equal (g addr (apply-update update ram map)) + (g addr ram))) + :hints (("Goal" :in-theory (enable apply-update + update-2-w + gtyp gptr gi gn)))) + +(defthm g-over-apply-updates-lemma + (implies (not (member addr (updates-2-ws updates ram map))) + (equal (g addr (apply-updates updates ram map)) + (g addr ram)))) + + +(defthm g-over-mark-1-aux-lemma + (implies (and (not (overlap (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode) + (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + (not (member addr + (updates-2-ws (collect-updates-static-1-aux + typ-or-typs ptr-or-ptrs + n ram map mode) ram map)))) + (equal (g addr (mark-1-aux typ-or-typs ptr-or-ptrs + n ram map mode)) + (g addr ram)))) + + + +(defthm g-over-mark-1-aux + (implies (and (not (overlap (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode) + (collect-link-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode))) + (not (member addr + (collect-data-cells-1-aux typ-or-typs ptr-or-ptrs + n ram map mode)))) + (equal (g addr (mark-1-aux typ-or-typs ptr-or-ptrs + n ram map mode)) + (g addr ram))) + :hints (("Goal" :in-theory (disable subsetp-collect-updates-static-1-aux-data-cells) + :use subsetp-collect-updates-static-1-aux-data-cells))) + + +;------------ done! ------------- +(defun collect-updates-static-1 (typ ptr n ram map) + (collect-updates-static-1-aux typ ptr n ram map 'ATOM)) + + +(defun collect-updates-static-1-list (typs ptrs n ram map) + (collect-updates-static-1-aux typs ptrs n ram map 'LIST)) + + +(defun all-collect-updates-static-1 (typs ptrs ns ram map) + (if (endp typs) + nil + (append (collect-updates-static-1 (car typs) (car ptrs) (car ns) ram map) + (all-collect-updates-static-1 + (cdr typs) (cdr ptrs) (cdr ns) ram map)))) + + +(defun collect-updates-static (rc) + (all-collect-updates-static-1 (typ-list (ptrs rc)) + (addr-list (ptrs rc)) + (n-list (ptrs rc)) + (ram rc) + (getmap rc))) + + + + +;---------------------------------- + +; (defthm g-over-mark +; (implies (and (not (overlap (collect-data-cells rc) +; (collect-link-cells rc))) +; (not (member addr (updates-2-ws (collect-updates-static rc))))) +; (equal (g addr (mark rc)) +; (g addr (ram rc))))) + + + + + + + + + + + + + + + + + |