Included Books
other
(in-package "ACL2")
include-book
(include-book "extra-operations")
qs-subsetfunction
(defund qs-subset (x y) (declare (xargs :guard t :verify-guards nil)) (mbe :logic (equal t (q-implies x y)) :exec (cond ((atom x) (if x (and (atom y) (if y t nil)) t)) ((atom y) (if y t nil)) ((hons-equal x y) t) (t (and (qs-subset (car x) (car y)) (qs-subset (cdr x) (cdr y)))))))
other
(verify-guards qs-subset :hints (("Goal" :in-theory (e/d (qs-subset q-implies q-not) (canonicalize-q-implies canonicalize-q-not)))))
|(qs-subset nil x)|theorem
(defthm |(qs-subset nil x)| (qs-subset nil x) :hints (("Goal" :in-theory (e/d (qs-subset q-implies) (canonicalize-q-implies)))))
|(qs-subset x t)|theorem
(defthm |(qs-subset x t)| (qs-subset x t) :hints (("Goal" :in-theory (e/d (qs-subset q-implies) (canonicalize-q-implies)))))
eval-bdd-when-qs-subsettheorem
(defthm eval-bdd-when-qs-subset (implies (and (qs-subset x y) (eval-bdd x values)) (eval-bdd y values)) :rule-classes ((:rewrite) (:rewrite :corollary (implies (and (eval-bdd x values) (qs-subset x y)) (eval-bdd y values))) (:rewrite :corollary (implies (and (qs-subset x y) (not (eval-bdd y values))) (equal (eval-bdd x values) nil))) (:rewrite :corollary (implies (and (not (eval-bdd y values)) (qs-subset x y)) (equal (eval-bdd x values) nil)))) :hints (("Goal" :in-theory (e/d (qs-subset) (eval-bdd-of-q-implies)) :use ((:instance eval-bdd-of-q-implies (x x) (y y))))))
reflexivity-of-qs-subsettheorem
(defthm reflexivity-of-qs-subset (qs-subset x x) :hints (("Goal" :in-theory (e/d (qs-subset q-implies) (canonicalize-q-implies)))))
transitivity-of-qs-subsetencapsulate
(encapsulate nil (local (defthm lemma (implies (and (equal t (q-implies x y)) (equal t (q-implies y z))) (equal (equal t (q-implies x z)) t)) :hints (("Goal" :in-theory (e/d (q-implies q-not) (canonicalize-q-implies canonicalize-q-not equal-by-eval-bdds)))))) (defthm transitivity-of-qs-subset (implies (and (qs-subset x y) (qs-subset y z)) (equal (qs-subset x z) t)) :rule-classes ((:rewrite) (:rewrite :corollary (implies (and (qs-subset y z) (qs-subset x y)) (equal (qs-subset x z) t)))) :hints (("Goal" :in-theory (e/d (qs-subset) (ubddp-of-q-implies canonicalize-q-implies))))))
other
(defsection qs-subset-by-eval-bdds (local (in-theory (disable canonicalize-q-implies ubddp-of-q-implies))) (local (in-theory (enable qs-subset))) (encapsulate (((qs-subset-hyps) => *) ((qs-subset-lhs) => *) ((qs-subset-rhs) => *)) (local (defun qs-subset-hyps nil nil)) (local (defun qs-subset-lhs nil nil)) (local (defun qs-subset-rhs nil nil)) (defthmd qs-subset-by-eval-bdds-constraint (implies (qs-subset-hyps) (implies (eval-bdd (qs-subset-lhs) arbitrary-values) (eval-bdd (qs-subset-rhs) arbitrary-values))))) (local (defund qs-subset-badguy (x y) (declare (xargs :measure (+ (acl2-count x) (acl2-count y)))) (if (or (consp x) (consp y)) (mv-let (car-successp car-path) (qs-subset-badguy (qcar x) (qcar y)) (if car-successp (mv t (cons t car-path)) (mv-let (cdr-successp cdr-path) (qs-subset-badguy (qcdr x) (qcdr y)) (if cdr-successp (mv t (cons nil cdr-path)) (mv nil nil))))) (mv (not (implies x y)) nil)))) (local (defthm mv-nth-1 (equal (mv-nth 1 x) (cadr x)) :hints (("Goal" :in-theory (enable mv-nth))))) (local (defthm lemma1 (implies (car (qs-subset-badguy x y)) (and (eval-bdd x (cadr (qs-subset-badguy x y))) (not (eval-bdd y (cadr (qs-subset-badguy x y)))))) :hints (("Goal" :in-theory (enable qs-subset-badguy eval-bdd) :induct (qs-subset-badguy x y))))) (local (defthm q-implies-of-t-when-atom-left (implies (not (consp x)) (equal (equal t (q-implies x y)) (if x (if (atom y) (if y t nil) nil) t))) :hints (("Goal" :in-theory (enable q-implies))))) (local (defthm q-implies-of-t-when-atom-right (implies (not (consp y)) (equal (equal t (q-implies x y)) (if (atom x) (if x (if (atom y) (if y t nil) nil) t) (if y t (equal t (q-not x)))))) :hints (("Goal" :in-theory (e/d* (q-implies) (canonicalize-to-q-ite)))))) (local (defthm equal-t-of-q-implies-of-cons (equal (equal t (q-implies (cons a x) (cons b y))) (and (equal t (q-implies a b)) (equal t (q-implies x y)))) :hints (("Goal" :in-theory (enable q-implies))))) (local (defthm lemma2 (implies (and (ubddp x) (ubddp y)) (equal (car (qs-subset-badguy x y)) (not (equal t (qs-subset x y))))) :hints (("Goal" :induct (qs-subset-badguy x y) :in-theory (e/d (qs-subset-badguy ubddp q-not) (q-implies-of-nil equal-by-eval-bdds canonicalize-q-not)))))) (defthm qs-subset-by-eval-bdds (implies (and (qs-subset-hyps) (ubddp (qs-subset-lhs)) (ubddp (qs-subset-rhs))) (equal (qs-subset (qs-subset-lhs) (qs-subset-rhs)) t)) :hints (("Goal" :use ((:instance qs-subset-by-eval-bdds-constraint (arbitrary-values (cadr (qs-subset-badguy (qs-subset-lhs) (qs-subset-rhs))))))))) (defun qs-subset-by-eval-bdds-hint (clause pspv stable world) (declare (xargs :mode :program)) (and stable (let* ((rcnst (access prove-spec-var pspv :rewrite-constant)) (ens (access rewrite-constant rcnst :current-enabled-structure))) (and (enabled-numep (fnume '(:rewrite qs-subset-by-eval-bdds) world) ens) (let ((conclusion (car (last clause)))) (and (consp conclusion) (eq (car conclusion) 'qs-subset) (let* ((lhs (second conclusion)) (rhs (third conclusion)) (hyps (dumb-negate-lit-lst (butlast clause 1))) (hint `(:use (:functional-instance qs-subset-by-eval-bdds (qs-subset-hyps (lambda nil (and ,@HYPS))) (qs-subset-lhs (lambda nil ,LHS)) (qs-subset-rhs (lambda nil ,RHS)))))) (prog2$ (cw "~|~%We now appeal to ~s0 in an attempt to show that ~x1 is a ~ qs-subset of ~x2. (You can disable ~s0 to avoid this.) ~ The hint we give is: ~x3~|~%" 'qs-subset-by-eval-bdds (untranslate lhs nil world) (untranslate rhs nil world) hint) hint)))))))) (add-default-hints! '((qs-subset-by-eval-bdds-hint clause pspv stable-under-simplificationp world))))
other
(defsection double-containment (local (defthm lemma (implies (and (ubddp x) (ubddp y) (qs-subset x y) (qs-subset y x)) (equal (equal x y) t)))) (defthm bdd-equality-is-double-containment (implies (and (ubddp x) (ubddp y)) (equal (equal x y) (and (qs-subset x y) (qs-subset y x))))) (in-theory (disable equal-by-eval-bdds)) (defthm qs-subset-when-booleans (implies (and (booleanp x) (booleanp y)) (equal (qs-subset x y) (implies (double-rewrite x) (double-rewrite y)))) :hints (("Goal" :in-theory (enable qs-subset q-implies)))))
other
(def-ruleset qs-subset-mode-rules '(bdd-equality-is-double-containment))
|(qs-subset x nil)|theorem
(defthmd |(qs-subset x nil)| (implies (ubddp x) (equal (qs-subset x nil) (not (double-rewrite x)))) :hints (("Goal" :in-theory (enable equal-by-eval-bdds))))
|(qs-subset t x)|theorem
(defthmd |(qs-subset t x)| (implies (force (ubddp x)) (equal (qs-subset t x) (equal x t))))
other
(defsection qs-subset-mode-iff-rules (defthm qs-subset-canonicalization-of-iff (implies (ubddp x) (iff x (not (qs-subset x nil)))) :rule-classes nil :hints (("Goal" :in-theory (disable bdd-equality-is-double-containment) :use ((:instance bdd-equality-is-double-containment (x x) (y nil)))))) (defthm q-ite-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y)) (force (ubddp z))) (iff (q-ite x y z) (not (qs-subset (q-ite x y z) nil)))) :hints (("Goal" :use ((:instance qs-subset-canonicalization-of-iff (x (q-ite x y z))))))) (defthm q-not-iff-for-qs-subset-mode (implies (ubddp x) (iff (q-not x) (not (qs-subset (q-not x) nil))))) (defthm q-and-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-and x y) (not (qs-subset (q-and x y) nil))))) (defthm q-or-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-or x y) (not (qs-subset (q-or x y) nil))))) (defthm q-implies-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-implies x y) (not (qs-subset (q-implies x y) nil))))) (defthm q-or-c2-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-or-c2 x y) (not (qs-subset (q-or-c2 x y) nil))))) (defthm q-and-c1-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-and-c1 x y) (not (qs-subset (q-and-c1 x y) nil))))) (defthm q-and-c2-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-and-c2 x y) (not (qs-subset (q-and-c2 x y) nil))))) (defthm q-iff-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-iff x y) (not (qs-subset (q-iff x y) nil))))) (defthm q-xor-iff-for-qs-subset-mode (implies (and (force (ubddp x)) (force (ubddp y))) (iff (q-xor x y) (not (qs-subset (q-xor x y) nil))))) (add-to-ruleset qs-subset-mode-rules '(q-ite-iff-for-qs-subset-mode q-not-iff-for-qs-subset-mode q-and-iff-for-qs-subset-mode q-or-iff-for-qs-subset-mode q-implies-iff-for-qs-subset-mode q-or-c2-iff-for-qs-subset-mode q-and-c1-iff-for-qs-subset-mode q-and-c2-iff-for-qs-subset-mode q-iff-iff-for-qs-subset-mode q-xor-iff-for-qs-subset-mode)))
other
(defsection qs-subset-of-q-ite-left (local (defthmd lemma (implies (and (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w)) (qs-subset (q-ite x y nil) w) (qs-subset (q-ite x nil z) w)) (qs-subset (q-ite x y z) w)))) (local (defthmd lemma2 (implies (and (qs-subset (q-ite x y z) w) (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (qs-subset (q-ite x y nil) w)))) (local (defthmd lemma3 (implies (and (qs-subset (q-ite x y z) w) (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (qs-subset (q-ite x nil z) w)))) (defthm qs-subset-of-q-ite-left (implies (and (syntaxp (not (equal y ''nil))) (syntaxp (not (equal z ''nil))) (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (equal (qs-subset (q-ite x y z) w) (and (qs-subset (q-ite x y nil) w) (qs-subset (q-ite x nil z) w)))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2) (:instance lemma3))))))
other
(defsection qs-subset-of-q-ite-right (local (defthmd lemma (implies (and (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w)) (qs-subset (q-ite w x nil) y) (qs-subset (q-ite x nil w) z)) (qs-subset w (q-ite x y z))))) (local (defthmd lemma2 (implies (and (qs-subset w (q-ite x y z)) (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (qs-subset (q-ite w x nil) y)))) (local (defthmd lemma3 (implies (and (qs-subset w (q-ite x y z)) (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (qs-subset (q-ite x nil w) z)))) (defthm qs-subset-of-q-ite-right (implies (and (force (ubddp x)) (force (ubddp y)) (force (ubddp z)) (force (ubddp w))) (equal (qs-subset w (q-ite x y z)) (and (qs-subset (q-ite w x nil) y) (qs-subset (q-ite x nil w) z)))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2) (:instance lemma3))))))
other
(defsection |(qs-subset (q-ite x nil y) x)| (local (defthmd gross (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset (q-ite x nil y) x) (eval-bdd y values)) (eval-bdd x values)) :hints (("Goal" :use ((:instance eval-bdd-of-q-ite (y nil) (z y))))))) (local (defthmd lemma (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset (q-ite x nil y) x)) (qs-subset y x)) :hints (("Goal" :in-theory (enable gross))))) (local (defthmd lemma2 (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset y x)) (qs-subset (q-ite x nil y) x)))) (defthm |(qs-subset (q-ite x nil y) x)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-ite x nil y) x) (qs-subset y x))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2))))))
other
(defsection |(qs-subset (q-ite x nil y) nil)| (local (defthmd gross (implies (and (ubddp x) (ubddp y) (qs-subset (q-ite x nil y) nil) (eval-bdd y values)) (eval-bdd x values)) :hints (("goal" :use ((:instance eval-bdd-of-q-ite (y nil) (z y))))))) (local (defthmd lemma (implies (and (ubddp x) (ubddp y) (qs-subset (q-ite x nil y) nil)) (qs-subset y x)) :hints (("Goal" :in-theory (enable gross))))) (local (defthmd lemma2 (implies (and (ubddp x) (ubddp y) (qs-subset y x)) (qs-subset (q-ite x nil y) nil)))) (defthm |(qs-subset (q-ite x nil y) nil)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-ite x nil y) nil) (qs-subset y x))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2))))))
|(qs-subset (q-ite x y nil) x)|theorem
(defthm |(qs-subset (q-ite x y nil) x)| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset (q-ite x y nil) x)))
|(qs-subset (q-ite x y nil) y)|theorem
(defthm |(qs-subset (q-ite x y nil) y)| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset (q-ite x y nil) y)))
|(qs-subset (q-and x y) x)|theorem
(defthm |(qs-subset (q-and x y) x)| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset (q-and x y) x)))
|(qs-subset (q-and x y) y)|theorem
(defthm |(qs-subset (q-and x y) y)| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset (q-and x y) y)))
|(qs-subset x (q-and x y))|encapsulate
(encapsulate nil (local (defthmd lemma (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset x y)) (equal (qs-subset x (q-and x y)) t)))) (local (defthmd lemma2 (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset x (q-and x y))) (equal (qs-subset x y) t)))) (defthm |(qs-subset x (q-and x y))| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset x (q-and x y)) (qs-subset x y))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2))))))
|(qs-subset x (q-ite x y nil))|theorem
(defthm |(qs-subset x (q-ite x y nil))| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset x (q-ite x y nil)) (qs-subset x y))) :hints (("Goal" :use ((:instance |(qs-subset x (q-and x y))|)))))
|(qs-subset y (q-and x y))|theorem
(defthm |(qs-subset y (q-and x y))| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset y (q-and x y)) (qs-subset y x))) :hints (("Goal" :in-theory (disable canonicalize-q-and qs-subset-of-q-ite-right |(qs-subset x (q-ite x y nil))|) :use ((:instance |(qs-subset x (q-ite x y nil))| (x y) (y x))))))
|(qs-subset y (q-ite x y nil))|theorem
(defthm |(qs-subset y (q-ite x y nil))| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset y (q-ite x y nil)) (qs-subset y x))) :hints (("Goal" :use ((:instance |(qs-subset y (q-and x y))|)))))
|(qs-subset x (q-ite x t y))|theorem
(defthm |(qs-subset x (q-ite x t y))| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset x (q-ite x t y))))
|(qs-subset y (q-ite x t y))|theorem
(defthm |(qs-subset y (q-ite x t y))| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset y (q-ite x t y))))
|(qs-subset x (q-or x y))|theorem
(defthm |(qs-subset x (q-or x y))| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset x (q-or x y))))
|(qs-subset y (q-or x y))|theorem
(defthm |(qs-subset y (q-or x y))| (implies (and (force (ubddp x)) (force (ubddp y))) (qs-subset y (q-or x y))))
|(qs-subset (q-or x y) x)|encapsulate
(encapsulate nil (local (defthmd lemma (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset (q-or x y) x)) (qs-subset y x)))) (local (defthmd lemma2 (implies (and (force (ubddp x)) (force (ubddp y)) (qs-subset y x)) (qs-subset (q-or x y) x)))) (defthm |(qs-subset (q-or x y) x)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-or x y) x) (qs-subset y x))) :hints (("Goal" :use ((:instance lemma) (:instance lemma2))))))
|(qs-subset (q-ite x t y) x)|theorem
(defthm |(qs-subset (q-ite x t y) x)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-ite x t y) x) (qs-subset y x))) :hints (("Goal" :use ((:instance |(qs-subset (q-or x y) x)|)))))
|(qs-subset (q-or x y) y)|theorem
(defthm |(qs-subset (q-or x y) y)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-or x y) y) (qs-subset x y))) :hints (("Goal" :in-theory (disable canonicalize-q-or |(qs-subset (q-or x y) x)|) :use ((:instance |(qs-subset (q-or x y) x)| (x y) (y x))))))
|(qs-subset (q-ite x t y) y)|theorem
(defthm |(qs-subset (q-ite x t y) y)| (implies (and (force (ubddp x)) (force (ubddp y))) (equal (qs-subset (q-ite x t y) y) (qs-subset x y))) :hints (("Goal" :use ((:instance |(qs-subset (q-or x y) y)|)))))