other
(in-package "GL")
other
(include-book "gl-util")
other
(include-book "std/util/bstar" :dir :system)
other
(include-book "tools/mv-nth" :dir :system)
other
(include-book "misc/hons-help2" :dir :system)
other
(include-book "clause-processors/join-thms" :dir :system)
other
(include-book "centaur/misc/hons-sets" :dir :system)
other
(defevaluator apply-cond-ev apply-cond-ev-lst ((if a b c) (eq a b) (equal a b)))
other
(def-join-thms apply-cond-ev)
collect-conds-and-defaultfunction
(defun collect-conds-and-default (x) (case-match x (('if test then else) (mv-let (default conds) (collect-conds-and-default else) (mv default (hons-acons test then conds)))) (& (mv x nil))))
eval-condsfunction
(defun eval-conds (conds al) (if (atom conds) (mv nil nil) (if (apply-cond-ev (caar conds) al) (mv t (apply-cond-ev (cdar conds) al)) (eval-conds (cdr conds) al))))
other
(defthm collect-conds-and-default-eval-conds (mv-let (default conds) (collect-conds-and-default x) (mv-let (matched res) (eval-conds conds al) (equal (if matched res (apply-cond-ev default al)) (apply-cond-ev x al)))) :rule-classes nil)
no-conds-with-same-fnfunction
(defun no-conds-with-same-fn (fn conds) (or (atom conds) (let* ((pair (car conds)) (test (car pair))) (case-match test (('if ('eq 'f ('quote fn2)) & ''nil) (and (not (equal fn fn2)) (no-conds-with-same-fn fn (cdr conds)))) (& nil)))))
no-duplicate-condspfunction
(defun no-duplicate-condsp (conds) (or (atom conds) (let* ((pair (car conds)) (test (car pair))) (case-match test (('if ('eq 'f ('quote fn)) & ''nil) (and (no-conds-with-same-fn fn (cdr conds)) (no-duplicate-condsp (cdr conds)))) (& nil)))))
alist-no-cond-fnsfunction
(defun alist-no-cond-fns (al conds) (or (atom conds) (let* ((pair (car conds)) (test (car pair))) (case-match test (('if ('eq 'f ('quote fn)) & ''nil) (and (not (hons-get fn al)) (alist-no-cond-fns al (cdr conds)))) (& nil)))))
exclusive-condspfunction
(defun exclusive-condsp (conds acc) (if (atom conds) (prog2$ (flush-hons-get-hash-table-link acc) t) (let* ((pair (car conds)) (test (car pair))) (case-match test (('if ('eq 'f ('quote fn)) & ''nil) (if (hons-get fn acc) (cw "Exclusive-condsp: repeat function: ~x0~%" fn) (exclusive-condsp (cdr conds) (hons-acons fn t acc)))) (& (cw "Exclusive-condsp: bad test: ~x0~%" test))))))
remove-assocfunction
(defun remove-assoc (x al) (if (atom al) al (if (and (consp (car al)) (equal x (caar al))) (remove-assoc x (cdr al)) (cons (car al) (remove-assoc x (cdr al))))))
other
(defthm hons-assoc-equal-remove-assoc (equal (hons-assoc-equal x (remove-assoc y al)) (and (not (equal x y)) (hons-assoc-equal x al))) :hints (("Goal" :in-theory (enable hons-assoc-equal))))
other
(defthm exclusive-condsp-acons1 (implies (no-conds-with-same-fn k conds) (equal (exclusive-condsp conds (remove-assoc k al)) (exclusive-condsp conds al))))
other
(defthm remove-assoc-when-not-hons-assoc-equal (implies (not (hons-assoc-equal k al)) (equal (remove-assoc k al) al)) :hints (("Goal" :in-theory (enable hons-assoc-equal))))
other
(defthm exclusive-condsp-acons (implies (and (no-conds-with-same-fn k conds) (not (hons-assoc-equal k al))) (equal (exclusive-condsp conds (cons (cons k v) al)) (exclusive-condsp conds al))) :hints (("goal" :use ((:instance exclusive-condsp-acons1 (al (cons (cons k v) al)))) :in-theory (disable exclusive-condsp-acons1))))
other
(defthm exclusive-condsp-is-no-duplicate-condsp1 (equal (exclusive-condsp conds al) (and (alist-no-cond-fns al conds) (no-duplicate-condsp conds))) :hints (("goal" :induct (exclusive-condsp conds al) :in-theory (enable hons-assoc-equal))))
other
(defthm exclusive-condsp-is-no-duplicate-condsp (equal (exclusive-condsp conds nil) (no-duplicate-condsp conds)))
other
(defthm diff-fn-conds-not-both-true (implies (case-match a (('if ('eq 'f ('quote fna)) & ''nil) (case-match b (('if ('eq 'f ('quote fnb)) & ''nil) (not (equal fna fnb)))))) (not (and (apply-cond-ev a al) (apply-cond-ev b al)))) :rule-classes nil)
other
(defthm assoc-no-duplicate-conds-implies-match (implies (and (hons-assoc-equal a conds) (no-duplicate-condsp conds)) (case-match a (('if ('eq 'f ('quote &)) & ''nil) t))) :rule-classes nil)
other
(defthm hons-assoc-equal-true-cond-eval-conds (implies (and (hons-assoc-equal cond lst) (apply-cond-ev cond al)) (mv-nth 0 (eval-conds lst al))))
other
(defthm no-conds-with-same-fn-and-hons-assoc-equal (implies (and (no-conds-with-same-fn fn lst) (hons-assoc-equal cond lst)) (case-match cond (('if ('eq 'f ('quote fn2)) & ''nil) (not (equal fn2 fn))))) :rule-classes nil)
other
(encapsulate nil (local (defthm l0 (implies (and (no-conds-with-same-fn (cdr (assoc-equal 'f al)) (cdr lst)) (hons-assoc-equal cond (cdr lst)) (apply-cond-ev cond al)) (equal (apply-cond-ev (cdar lst) al) (apply-cond-ev (cdr (hons-assoc-equal cond (cdr lst))) al))) :hints (("Goal" :use ((:instance no-conds-with-same-fn-and-hons-assoc-equal (fn (cdr (assoc-eq 'f al))) (lst (cdr lst)))))))) (defthm apply-cond-of-assoc-is-eval-conds (implies (and (no-duplicate-condsp lst) (hons-assoc-equal cond lst) (apply-cond-ev cond al)) (equal (mv-nth 1 (eval-conds lst al)) (apply-cond-ev (cdr (hons-assoc-equal cond lst)) al)))))
hons-alist-keys-subsetfunction
(defun hons-alist-keys-subset (lst1 lst2) (or (atom lst1) (if (consp (car lst1)) (and (hons-get (caar lst1) lst2) (hons-alist-keys-subset (cdr lst1) lst2)) (hons-alist-keys-subset (cdr lst1) lst2))))
other
(defthm hons-alist-keys-subset-impl-eval-conds (implies (and (hons-alist-keys-subset lst1 lst2) (mv-nth 0 (eval-conds lst1 al))) (mv-nth 0 (eval-conds lst2 al))))
conds-matchfunction
(defun conds-match (lst1 lst2) (if (atom lst1) (mv t nil) (if (consp (car lst1)) (let ((lk (hons-get (caar lst1) lst2))) (if lk (mv-let (ok rest) (conds-match (cdr lst1) lst2) (if (equal (cdr lk) (cdar lst1)) (mv ok rest) (mv ok (cons `((equal ,(CDR GL::LK) ,(CDAR GL::LST1))) rest)))) (mv nil nil))) (conds-match (cdr lst1) lst2))))
other
(defthm conds-match-impl-eval-conds (implies (and (mv-nth 0 (conds-match lst1 lst2)) (mv-nth 0 (eval-conds lst1 al))) (mv-nth 0 (eval-conds lst2 al))))
other
(defthm conds-match-and-no-duplicate-conds (implies (and (mv-nth 0 (conds-match lst1 lst2)) (no-duplicate-condsp lst1) (no-duplicate-condsp lst2) (mv-nth 0 (eval-conds lst1 al)) (apply-cond-ev (conjoin-clauses (mv-nth 1 (conds-match lst1 lst2))) al)) (equal (mv-nth 1 (eval-conds lst2 al)) (mv-nth 1 (eval-conds lst1 al)))) :hints (("Goal" :in-theory (enable conjoin-clauses))))
apply-cond-terms-equalfunction
(defun apply-cond-terms-equal (term1 term2) (b* (((mv def1 conds1) (collect-conds-and-default term1)) ((mv def2 conds2) (collect-conds-and-default term2)) ((mv match equivs) (conds-match conds1 conds2)) (okp-list (list match (exclusive-condsp conds1 nil) (exclusive-condsp conds2 nil) (hons-alist-keys-subset conds2 conds1))) (okp (and-list okp-list)) (- (flush-hons-get-hash-table-link conds1)) (- (flush-hons-get-hash-table-link conds2))) (if okp (if (equal def1 def2) equivs (cons `((equal ,GL::DEF1 ,GL::DEF2)) equivs)) (prog2$ (cw "cond cp fail: ~x0~%details: ~x1~%" okp-list (hons-set-diff (strip-cars conds2) (strip-cars conds1))) (list `((equal ,GL::TERM1 ,GL::TERM2)))))))
other
(defthm apply-cond-terms-equal-correct (implies (apply-cond-ev (conjoin-clauses (apply-cond-terms-equal term1 term2)) al) (equal (equal (apply-cond-ev term1 al) (apply-cond-ev term2 al)) t)) :hints (("goal" :use ((:instance collect-conds-and-default-eval-conds (x term1)) (:instance collect-conds-and-default-eval-conds (x term2))) :in-theory (e/d (conjoin-clauses) (no-duplicate-condsp default-car default-cdr eval-conds conds-match)))))
apply-cond-cpfunction
(defun apply-cond-cp (clause) (if (consp clause) (let ((term (car (last clause)))) (case-match term (('equal term1 term2) (apply-cond-terms-equal term1 term2)) (& (list clause)))) (list clause)))
other
(defthm last-impl-disjoin (implies (and (consp clause) (apply-cond-ev (car (last clause)) al)) (apply-cond-ev (disjoin clause) al)) :hints (("Goal" :in-theory (e/d nil (disjoin last)) :induct (len clause) :expand ((disjoin clause) (last clause)))))
other
(defthm apply-cond-cp-correct (implies (and (pseudo-term-listp clause) (alistp al) (apply-cond-ev (conjoin-clauses (apply-cond-cp clause)) al)) (apply-cond-ev (disjoin clause) al)) :hints (("Goal" :in-theory (e/d (conjoin-clauses) (disjoin last last-impl-disjoin apply-cond-terms-equal)) :use ((:instance last-impl-disjoin)) :do-not-induct t)) :rule-classes :clause-processor)