(in-package "ACL2")
(include-book "misc/records" :dir :system)
(local
(defun map-id (id op st-id ld-id)
(declare (ignore op))
(cond (id '(t)) ((and st-id ld-id) '(t nil)) (st-id '(t nil)) (ld-id '(nil)) (t '(nil)))))
(local
(defun map-op-io (id op st-id ld-id)
(declare (ignore op))
(cond (id '(nil))
((and st-id ld-id) '(t t))
(st-id '(t nil))
(ld-id '(t))
(t '(nil)))))
(local
(defun map-op (id op st-id ld-id)
(cond (id (list op))
((and st-id ld-id) (list op op))
(st-id (list op op))
(ld-id (list op))
(t (list op)))))
(defun cop-listp (cop-list)
(let* ((cop-item (first cop-list))
(id (first cop-item))
(st-id (third cop-item)))
(cond ((endp cop-list) t)
((and (booleanp id) (booleanp st-id)) (cop-listp (rest cop-list)))
(t nil))))
(encapsulate
(((abs->conc *) => *)
((conc->abs * *) => *)
((cop * * * * *) => *)
((aop * * *) => *)
((valid-abs? *) => *)
((valid-conc? *) => *))
(local
(defun abs->conc (abs)
(declare (ignore abs))
nil))
(local
(defun conc->abs (conc id)
(declare (ignore conc id))
nil))
(local
(defun cop (conc id op st-id ld-id)
(declare (ignore conc id op st-id ld-id))
nil))
(local
(defun aop (abs op io)
(declare (ignore abs op io))
nil))
(local
(defun valid-abs? (abs)
(declare (ignore abs))
nil))
(local
(defun valid-conc? (conc)
(declare (ignore conc))
nil))
(defthm aop-makes-sense-1
(let* ((abs-ids (map-id id op st-id ld-id))
(abs-ops (map-op id op st-id ld-id))
(abs-ios (map-op-io id op st-id ld-id))
(abs-op (first abs-ops))
(abs-io (first abs-ios)))
(implies (and (valid-conc? conc)
(equal (length abs-ids) 1))
(equal (conc->abs abs-id (cop conc id op st-id ld-id))
(if (equal abs-id id)
(aop (conc->abs abs-id conc) abs-op abs-io)
(conc->abs abs-id conc))))))
(defthm aop-makes-sense-2
(let* ((abs-ids (map-id id op st-id ld-id))
(abs-ops (map-op id op st-id ld-id))
(abs-ios (map-op-io id op st-id ld-id))
(cop-result (cop conc id op st-id ld-id))
(abs-id-1 (first abs-ids))
(abs-op-1 (first abs-ops))
(abs-io-1 (first abs-ios))
(abs-id-2 (second abs-ids))
(abs-op-2 (second abs-ops))
(abs-io-2 (second abs-ios)))
(implies (and (valid-conc? conc)
(equal (length abs-ids) 2))
(and (equal (conc->abs abs-id-1 cop-result)
(aop (conc->abs abs-id-1 conc) abs-op-1 abs-io-1))
(equal (conc->abs abs-id-2 cop-result)
(aop (conc->abs abs-id-2 conc) abs-op-2 abs-io-2))))))
(defthm abs->conc-is-inverse-of-conc->abs
(implies (valid-abs? abs)
(equal (conc->abs id (abs->conc abs))
(g id abs))))
(defthm cop-is-valid
(implies (valid-conc? conc)
(valid-conc? (cop conc id op st-id ld-id))))
(defthm abs->conc-is-valid
(implies (valid-abs? abs)
(valid-conc? (abs->conc abs))))
)
(defun crun (conc cop-list)
(let ((cop-item (first cop-list)))
(if (endp cop-list)
conc
(crun (cop conc (first cop-item) (second cop-item) (third cop-item)
(fourth cop-item))
(rest cop-list)))))
(defthm crun-is-valid
(implies (valid-conc? conc)
(valid-conc? (crun conc cop-list))))
(defun arun (abs aop-list)
(let ((aop-item (first aop-list)))
(if (endp aop-list)
abs
(arun (aop abs (first aop-item) (second aop-item))
(rest aop-list)))))
(defun relevant-abs-sequence (id cop-list)
(let* ((cop-item (first cop-list))
(abs-ids (map-id (first cop-item) (second cop-item) (third cop-item)
(fourth cop-item)))
(abs-ops (map-op (first cop-item) (second cop-item) (third cop-item)
(fourth cop-item)))
(abs-ios (map-op-io (first cop-item) (second cop-item) (third cop-item)
(fourth cop-item)))
(abs-id-1 (first abs-ids))
(abs-id-2 (second abs-ids))
(aop-item-1 (list (first abs-ops) (first abs-ios)))
(aop-item-2 (list (second abs-ops) (second abs-ios))))
(cond ((endp cop-list) nil)
((and (equal (length abs-ids) 2) (equal abs-id-2 id))
(cons aop-item-2 (relevant-abs-sequence id (rest cop-list))))
((equal abs-id-1 id)
(cons aop-item-1 (relevant-abs-sequence id (rest cop-list))))
(t (relevant-abs-sequence id (rest cop-list))))))
(defthmd crock
(let* ((abs-item (relevant-abs-sequence
abs-id
(list (list id op st-id ld-id)))))
(implies (atom op)
(por (equal (length abs-item) 1)
(equal (length abs-item) 0)))))
(defthmd crock-ocl-check
(equal (length (map-id t op st-id ld-id)) 1))
(defthmd crock-op-corr-1
(IMPLIES (AND (VALID-CONC? CONC)
(BOOLEANP ID)
ID)
(EQUAL (CONC->ABS NIL (COP CONC T OP ST-ID LD-ID))
(CONC->ABS NIL CONC))))
(defthm op-corr-lemma-1
(IMPLIES (AND ST-ID (VALID-CONC? CONC))
(EQUAL (CONC->ABS NIL (COP CONC NIL OP T NIL))
(AOP (CONC->ABS NIL CONC) OP NIL)))
:hints (("Goal"
:in-theory (disable aop-makes-sense-2)
:use ((:instance aop-makes-sense-2
(st-id t)
(id nil)
(ld-id nil))))))
(defthm op-corr-lemma-2
(IMPLIES (AND ST-ID
(VALID-CONC? CONC))
(EQUAL (CONC->ABS T (COP CONC NIL OP ST-ID LD-ID))
(AOP (CONC->ABS T CONC) OP T)))
:hints (("Goal"
:in-theory (disable aop-makes-sense-2)
:use ((:instance aop-makes-sense-2
(st-id st-id)
(id nil))))))
(defthm op-corr-lemma-3
(IMPLIES (AND ST-ID LD-ID (VALID-CONC? CONC))
(EQUAL (CONC->ABS NIL (COP CONC NIL OP T LD-ID))
(AOP (CONC->ABS NIL CONC) OP T)))
:hints (("Goal"
:in-theory (disable aop-makes-sense-2)
:use ((:instance aop-makes-sense-2
(st-id t)
(id nil))))))
(defthmd op-correspondence
(let* ((ras (relevant-abs-sequence
abs-id
(list (list id op st-id ld-id))))
(abs-item (first ras))
(abs-op (first abs-item))
(abs-io (second abs-item)))
(implies (and (valid-conc? conc)
(booleanp id)
(booleanp st-id)
(booleanp abs-id))
(equal (conc->abs abs-id (cop conc id op st-id ld-id))
(if (not (equal (length ras) 0))
(aop (conc->abs abs-id conc) abs-op abs-io)
(conc->abs abs-id conc))))))
(defthm run-correspondence
(implies (and (valid-conc? conc)
(booleanp abs-id)
(cop-listp cop-list))
(equal (conc->abs abs-id (crun conc cop-list))
(arun
(conc->abs abs-id conc)
(relevant-abs-sequence abs-id cop-list)))))
(defthm seperation-is-sound
(let ((conc (abs->conc abs)))
(implies (and (valid-abs? abs)
(booleanp abs-id)
(cop-listp cop-list))
(equal (conc->abs abs-id (crun conc cop-list))
(arun
(conc->abs abs-id conc)
(relevant-abs-sequence abs-id cop-list)))))
:hints (("Goal"
:in-theory (disable run-correspondence)
:use ((:instance run-correspondence
(conc (abs->conc abs)))))))