Peel frames from the computation state.
(peel-frames n compst) → new-compst
We pop
We prove theorems about how this function interacts with creating variables and with writing objects. Some of these theorems generalize similar ones for pop-frame.
Function:
(defun peel-frames (n compst) (declare (xargs :guard (and (natp n) (compustatep compst)))) (cond ((zp n) (compustate-fix compst)) ((= (compustate-frames-number compst) 0) (compustate-fix compst)) (t (peel-frames (1- n) (pop-frame compst)))))
Theorem:
(defthm compustatep-of-peel-frames (b* ((new-compst (peel-frames n compst))) (compustatep new-compst)) :rule-classes :rewrite)
Theorem:
(defthm peel-frames-of-create-var (b* ((compst1 (create-var var val compst))) (implies (and (> (compustate-frames-number compst) 0) (not (errorp compst1)) (not (zp n))) (equal (peel-frames n compst1) (peel-frames n compst)))))
Theorem:
(defthm peel-frames-of-exit-scope (implies (and (not (zp n)) (> (compustate-frames-number compst) 0)) (equal (peel-frames n (exit-scope compst)) (peel-frames n compst))))
Theorem:
(defthm peel-frames-of-pop-frame-fold (implies (> (compustate-frames-number compst) 0) (equal (peel-frames n (pop-frame compst)) (peel-frames (1+ (nfix n)) compst))))
Theorem:
(defthm peel-frames-of-write-object (implies (not (errorp (write-object objdes val compst))) (equal (peel-frames n (write-object objdes val compst)) (if (and (objdesign-case (objdesign-top objdes) :auto) (>= (objdesign-auto->frame (objdesign-top objdes)) (if (< (nfix n) (compustate-frames-number compst)) (- (compustate-frames-number compst) (nfix n)) 0))) (peel-frames n compst) (write-object objdes val (peel-frames n compst))))))
Theorem:
(defthm not-errorp-of-write-object-of-peel-frames (implies (and (or (member-equal (objdesign-kind (objdesign-top objdes)) '(:static :alloc)) (< (objdesign-auto->frame (objdesign-top objdes)) (if (< (nfix n) (compustate-frames-number compst)) (- (compustate-frames-number compst) (nfix n)) 0))) (not (errorp (write-object objdes val compst)))) (not (errorp (write-object objdes val (peel-frames n compst))))))
Theorem:
(defthm peel-frames-of-nfix-n (equal (peel-frames (nfix n) compst) (peel-frames n compst)))
Theorem:
(defthm peel-frames-nat-equiv-congruence-on-n (implies (acl2::nat-equiv n n-equiv) (equal (peel-frames n compst) (peel-frames n-equiv compst))) :rule-classes :congruence)
Theorem:
(defthm peel-frames-of-compustate-fix-compst (equal (peel-frames n (compustate-fix compst)) (peel-frames n compst)))
Theorem:
(defthm peel-frames-compustate-equiv-congruence-on-compst (implies (compustate-equiv compst compst-equiv) (equal (peel-frames n compst) (peel-frames n compst-equiv))) :rule-classes :congruence)