other
(in-package "REWRITE-CODE")
other
(program)
other
(set-state-ok t)
multiplicity-rangepfunction
(defun multiplicity-rangep (x) (or (null x) (and (consp x) (aug-natp (car x)) (aug-natp (cdr x)) (not (aug-nat-< (cdr x) (car x))))))
multiplicity-range-decfunction
(defun multiplicity-range-dec (x) (if (or (endp x) (equal (cdr x) 0)) nil (cons (aug-nat-dec (car x)) (aug-nat-dec (cdr x)))))
rev-prependfunction
(defun rev-prepend (torev onto) (if (endp torev) onto (rev-prepend (cdr torev) (cons (car torev) onto))))
pop-push-nfunction
(defun pop-push-n (n from to) (if (or (zp n) (endp from)) (mv from to) (pop-push-n (1- n) (cdr from) (cons (car from) to))))
update-alistfunction
(defun update-alist (key val lst) (cond ((endp lst) (list (cons key val))) ((and (consp (car lst)) (equal (caar lst) key)) (cons (cons key val) (cdr lst))) (t (cons (car lst) (update-alist key val (cdr lst))))))
replace-assnsfunction
(defun replace-assns (expr assn-alist) (if (consp expr) (cons (replace-assns (car expr) assn-alist) (replace-assns (cdr expr) assn-alist)) (if (symbolp expr) (let ((assn (assoc-eq expr assn-alist))) (if (consp assn) (cdr assn) expr)) expr)))
merge-matchesfunction
(defun merge-matches (a1 a2) (cond ((endp a1) a2) ((endp a2) a1) (t (let* ((sym (caar a1)) (binding2 (assoc-eq sym a2))) (if (consp binding2) (let ((val1 (cdar a1)) (val2 (cdr binding2))) (if (equal val1 val2) (merge-matches (cdr a1) a2) t)) (merge-matches (cdr a1) (cons (car a1) a2)))))))
match-patternfunction
(defun match-pattern (expr pat vars) (cond ((member-eq pat vars) (list (cons pat expr))) ((and (consp pat) (consp expr)) (let ((car-result (match-pattern (car expr) (car pat) vars)) (cdr-result (match-pattern (cdr expr) (cdr pat) vars))) (if (or (equal car-result t) (equal cdr-result t)) t (merge-matches car-result cdr-result)))) ((equal pat expr) nil) (t t)))
other
(mutual-recursion (defun rewrite-defp (v) (declare (xargs :measure (acl2-count v) :hints (("Goal" :in-theory (disable (:definition multiplicity-rangep)))))) (or (null v) (and (consp v) (rewrite-simul-defp (car v)) (rewrite-defp (cdr v))))) (defun rewrite-simul-defp (v) (declare (xargs :measure (acl2-count v))) (or (null v) (and (consp v) (rewrite-entryp (car v)) (rewrite-simul-defp (cdr v))))) (defun rewrite-entryp (v) (declare (xargs :measure (acl2-count v))) (and (consp v) (multiplicity-rangep (car v)) (consp (cdr v)) (rewrite-var-entry-lstp (cadr v)) (consp (cddr v)) (symbol-listp (caddr v)) (consp (cdddr v)))) (defun rewrite-var-entry-lstp (v) (declare (xargs :measure (acl2-count v))) (or (null v) (and (consp v) (rewrite-var-entryp (car v)) (rewrite-var-entry-lstp (cdr v))))) (defun rewrite-var-entryp (v) (declare (xargs :measure (acl2-count v))) (and (consp v) (symbolp (car v)) (rewrite-defp (cdr v)))))
entry-multrngmacro
(defmacro entry-multrng (v) `(car ,REWRITE-CODE::V))
entry-alistmacro
(defmacro entry-alist (v) `(cadr ,REWRITE-CODE::V))
entry-varsmacro
(defmacro entry-vars (v) `(caddr ,REWRITE-CODE::V))
entry-replmacro
(defmacro entry-repl (v) `(cddddr ,REWRITE-CODE::V))
dec-entryfunction
(defun dec-entry (v) (cons (multiplicity-range-dec (car v)) (cdr v)))
update-entry-alistfunction
(defun update-entry-alist (v alist) (cons (car v) (cons alist (cddr v))))
update-entry-alist-entryfunction
(defun update-entry-alist-entry (v var def) (update-entry-alist v (update-alist var def (entry-alist v))))
other
(mutual-recursion (defun rewrite-seq (form seq-from seq-to) (declare (xargs :guard (and (rewrite-defp seq-from) (rewrite-defp seq-to)))) (if (consp seq-from) (mv-let (form updated) (rewrite-simul form (car seq-from) nil) (rewrite-seq form (cdr seq-from) (cons updated seq-to))) (mv form (reverse seq-to)))) (defun rewrite-simul (form simul-from simul-to) (declare (xargs :guard (and (rewrite-simul-defp simul-from) (rewrite-simul-defp simul-to)))) (if (consp simul-from) (let* ((entry (car simul-from)) (assns-opt (match-pattern form (entry-pat entry) (entry-vars entry)))) (if (eq 't assns-opt) (rewrite-simul form (cdr simul-from) (cons entry simul-to)) (let* ((entry (dec-entry entry)) (simul-from (cons entry (cdr simul-from))) (idx (len simul-to))) (rewrite-assns (entry-repl entry) assns-opt idx (rev-prepend simul-to simul-from))))) (let ((simul-all (reverse simul-to))) (if (consp form) (mv-let (car-form simul-all) (rewrite-simul (car form) simul-all nil) (mv-let (cdr-form simul-all) (rewrite-simul (cdr form) simul-all nil) (mv (cons car-form cdr-form) simul-all))) (mv form simul-all))))) (defun rewrite-assns (repl assns entry-idx simul-all) (declare (xargs :guard (and (rewrite-simul-defp simul-all) (natp entry-idx) (< entry-idx (len simul-all)) (symbol-alistp assns)))) (cond ((consp repl) (mv-let (car-form simul-all) (rewrite-assns (car repl) assns entry-idx simul-all) (mv-let (cdr-form simul-all) (rewrite-assns (cdr repl) assns entry-idx simul-all) (mv (cons car-form cdr-form) simul-all)))) ((symbolp repl) (let ((assn-opt (assoc-eq repl assns))) (if (consp assn-opt) (let* ((form (cdr assn-opt)) (entry (nth entry-idx simul-all)) (non-rec-defs (entry-alist entry)) (non-rec-def-opt (assoc-eq repl non-rec-defs))) (if (consp non-rec-def-opt) (mv-let (form updated-def) (rewrite-seq form (cdr non-rec-def-opt) nil) (mv form (update-nth entry-idx (update-entry-alist-entry entry repl updated-def) simul-all))) (if (and (symbolp (entry-pat entry)) (member-eq (entry-pat entry) (entry-vars entry))) (mv form simul-all) (rewrite-simul form simul-all nil)))) (mv repl simul-all)))) (t (mv repl simul-all)))))
other
(mutual-recursion (defun assert-zero-allowed-def (v state) (if (endp v) state (pprogn (assert-zero-allowed-simul-def (car v) state) (assert-zero-allowed-def (cdr v) state)))) (defun assert-zero-allowed-simul-def (v state) (if (endp v) state (pprogn (assert-zero-allowed-entry (car v) state) (assert-zero-allowed-simul-def (cdr v) state)))) (defun assert-zero-allowed-entry (v state) (if (or (endp v) (endp (cdr v))) state (let ((rng (car v)) (var-entries (cadr v))) (pprogn (if (or (endp rng) (not (equal (car rng) 0))) (pprogn (f-put-global 'erp t state) (fms (if (endp rng) "Code rewrite entry used too many times:~% ~xp -> ~xr~%" "Code rewrite entry used too few times (at least ~xn applications remaining):~% ~xp -> ~xr~%") `((#\p . ,(REWRITE-CODE::ENTRY-PAT REWRITE-CODE::V)) (#\r . ,(REWRITE-CODE::ENTRY-REPL REWRITE-CODE::V)) (#\n . ,(AND (CONSP REWRITE-CODE::RNG) (CAR REWRITE-CODE::RNG)))) (standard-co state) state (abbrev-evisc-tuple state))) state) (assert-zero-allowed-entry-lst var-entries state))))) (defun assert-zero-allowed-entry-lst (v state) (if (endp v) state (pprogn (assert-zero-allowed-var-entry (car v) state) (assert-zero-allowed-entry-lst (cdr v) state)))) (defun assert-zero-allowed-var-entry (v state) (if (endp v) state (assert-zero-allowed-def (cdr v) state))))
er-if-zero-not-allowed-deffunction
(defun er-if-zero-not-allowed-def (def state) (state-global-let* ((erp nil)) (pprogn (assert-zero-allowed-def def state) (mv (@ erp) :invisible state))))
rewrite-fnfunction
(defun rewrite-fn (form def state) (if (not (rewrite-defp def)) (er soft 'rewrite "Code rewrite definition illegal:~%~x0" def) (mv-let (result new-def) (rewrite-seq form def nil) (er-progn (er-if-zero-not-allowed-def new-def state) (value result)))))
multiplicity-specpfunction
(defun multiplicity-specp (x) (declare (xargs :guard t)) (or (and (multiplicity-rangep x) (not (equal (car x) 'inf))) (equal x '*) (equal x '+) (natp x)))
multiplicity-spec-to-noninf-rangefunction
(defun multiplicity-spec-to-noninf-range (x) (declare (xargs :guard (multiplicity-specp x))) (cond ((and (multiplicity-rangep x) (not (equal (car x) 'inf))) x) ((equal x '*) '(0 . inf)) ((equal x '+) '(1 . inf)) ((natp x) (cons x x)) (t nil)))
quote-rewrite-defmacro
(defmacro quote-rewrite-def (&rest v) (cond ((endp v) ''nil) ((and (consp (car v)) (null (cdr v))) `(quote-rewrite-def . ,(CAR REWRITE-CODE::V))) ((eq ':seq (car v)) `(quote-rewrite-def-rest . ,(CDR REWRITE-CODE::V))) (t `(list (quote-rewrite-simul-def . ,REWRITE-CODE::V)))))
quote-rewrite-def-restmacro
(defmacro quote-rewrite-def-rest (&rest v) (if (endp v) ''nil `(cons (quote-rewrite-simul-def . ,(CAR REWRITE-CODE::V)) (quote-rewrite-def-rest . ,(CDR REWRITE-CODE::V)))))
quote-rewrite-simul-defmacro
(defmacro quote-rewrite-simul-def (&rest v) (cond ((endp v) ''nil) ((eq ':simul (car v)) `(quote-rewrite-simul-def-rest . ,(CDR REWRITE-CODE::V))) (t `(list (quote-rewrite-entry . ,REWRITE-CODE::V)))))
quote-rewrite-simul-def-restmacro
(defmacro quote-rewrite-simul-def-rest (&rest v) (if (endp v) ''nil `(cons (quote-rewrite-entry . ,(CAR REWRITE-CODE::V)) (quote-rewrite-simul-def-rest . ,(CDR REWRITE-CODE::V)))))
var-specpfunction
(defun var-specp (v) (or (null v) (namep v) (and (consp v) (or (namep (car v)) (and (consp (car v)) (namep (caar v)))) (var-specp (cdr v)))))
recvar-specpfunction
(defun recvar-specp (v) (or (null v) (namep v) (and (consp v) (namep (car v)) (recvar-specp (cdr v)))))
get-var-namesfunction
(defun get-var-names (var-spec) (if (consp var-spec) (cons (if (consp (car var-spec)) (caar var-spec) (car var-spec)) (get-var-names (cdr var-spec))) (if (null var-spec) nil (list var-spec))))
canonicalize-var-bindingsfunction
(defun canonicalize-var-bindings (var-spec) (if (consp var-spec) (cons (if (consp (car var-spec)) (car var-spec) (list (car var-spec))) (canonicalize-var-bindings (cdr var-spec))) (if (null var-spec) nil (list (list var-spec)))))
quote-rewrite-entrymacro
(defmacro quote-rewrite-entry (&key (pat 'nil patp) (carpat 'nil carpatp) (repl 'nil replp) (mult '*) (vars 'nil) (recvars 'nil)) (declare (xargs :guard (and (multiplicity-specp mult) (var-specp vars) (recvar-specp recvars) (not (and patp carpatp)) (or (and patp (not (member pat (get-var-names recvars)))) (and carpatp (not (member carpat (get-var-names recvars))))) (not (intersectp-eq (get-var-names vars) (get-var-names recvars)))))) (let* ((cdrvar '%cdr-reserved%) (nrcvar-names (get-var-names vars)) (recvar-names (append (if carpatp (list cdrvar) 'nil) (get-var-names recvars))) (var-names (append nrcvar-names recvar-names)) (pat (if patp pat (cons carpat cdrvar))) (repl (if replp (if carpatp (cons repl cdrvar) repl) pat))) `(list* ',(REWRITE-CODE::MULTIPLICITY-SPEC-TO-NONINF-RANGE REWRITE-CODE::MULT) (quote-rewrite-var-entry-lst . ,(REWRITE-CODE::CANONICALIZE-VAR-BINDINGS REWRITE-CODE::VARS)) ',REWRITE-CODE::VAR-NAMES ',REWRITE-CODE::PAT ',REWRITE-CODE::REPL)))
quote-rewrite-var-entry-lstmacro
(defmacro quote-rewrite-var-entry-lst (&rest bindings) (if (endp bindings) ''nil `(cons (quote-rewrite-var-entry ,(CAR REWRITE-CODE::BINDINGS)) (quote-rewrite-var-entry-lst . ,(CDR REWRITE-CODE::BINDINGS)))))
quote-rewrite-var-entrymacro
(defmacro quote-rewrite-var-entry (v) (declare (xargs :guard (and (consp v) (namep (car v))))) `(cons ',(CAR REWRITE-CODE::V) (quote-rewrite-def . ,(CDR REWRITE-CODE::V))))
er-rewrite-formmacro
(defmacro er-rewrite-form (form &rest def) `(rewrite-fn ,REWRITE-CODE::FORM (quote-rewrite-def . ,REWRITE-CODE::DEF) state))
get-defunfunction
(defun get-defun (name state) (let* ((ev-wrld (decode-logical-name name (w state))) (cltl-command (and ev-wrld (let ((cltl-cmd (getprop 'cltl-command 'global-value nil 'current-acl2-world ev-wrld))) (and (consp cltl-cmd) (equal (car cltl-cmd) 'defuns) (= (len cltl-cmd) 4) cltl-cmd))))) (and cltl-command (let* ((mode (second cltl-command)) (defuns-body (fourth cltl-command)) (ll (cadr defuns-body)) (tail (cddr defuns-body)) (stobjs (remove nil (getprop name 'stobjs-in nil 'current-acl2-world ev-wrld))) (dec `(declare (xargs :mode ,REWRITE-CODE::MODE :stobjs ,REWRITE-CODE::STOBJS)))) `(defun ,REWRITE-CODE::NAME ,REWRITE-CODE::LL ,REWRITE-CODE::DEC . ,REWRITE-CODE::TAIL)))))
compute-copy-defun+rewritefunction
(defun compute-copy-defun+rewrite (src dst rwdef defun-like state) (if (and (null rwdef) (eq src dst)) (value '(value-triple :nothing-to-do)) (let* ((src-defun (get-defun src state))) (if src-defun (value (let* ((tuple (cddr src-defun)) (bodycons (last tuple)) (tuple-no-body (butlast tuple 1))) (if (null rwdef) (list* defun-like dst tuple) `(make-event (er-let* ((b2 (er-rewrite-form ',REWRITE-CODE::BODYCONS . ,REWRITE-CODE::RWDEF))) (value `(,',REWRITE-CODE::DEFUN-LIKE ,',REWRITE-CODE::DST ,@',REWRITE-CODE::TUPLE-NO-BODY . ,REWRITE-CODE::B2))))))) (er soft 'compute-copy-defun+rewrite "Illegal or missing defun for ~x0." src)))))
assert-include-defun-matches-certify-defunmacro
(defmacro assert-include-defun-matches-certify-defun (name) (declare (xargs :guard (symbolp name))) `(make-event `(assert-event (let ((certify-time-defun ',(REWRITE-CODE::GET-DEFUN ',REWRITE-CODE::NAME REWRITE-CODE::STATE)) (include-time-defun (get-defun ',',REWRITE-CODE::NAME state))) (or (equal certify-time-defun include-time-defun) (cw "Certify time def: ~x0~%Include time def: ~x1~%" certify-time-defun include-time-defun))) :on-skip-proofs t)))
copy-defun+rewritemacro
(defmacro copy-defun+rewrite (src dst &rest rewrite-spec) (declare (xargs :guard (and (symbolp src) (symbolp dst)))) `(progn (assert-include-defun-matches-certify-defun ,REWRITE-CODE::SRC) (make-event (compute-copy-defun+rewrite ',REWRITE-CODE::SRC ',REWRITE-CODE::DST ',REWRITE-CODE::REWRITE-SPEC 'defun state))))
copy-defunmacro
(defmacro copy-defun (src dst) `(copy-defun+rewrite ,REWRITE-CODE::SRC ,REWRITE-CODE::DST))