diff options
Diffstat (limited to 'books/workshops/1999/mu-calculus/solutions/sets.lisp')
-rw-r--r-- | books/workshops/1999/mu-calculus/solutions/sets.lisp | 575 |
1 files changed, 575 insertions, 0 deletions
diff --git a/books/workshops/1999/mu-calculus/solutions/sets.lisp b/books/workshops/1999/mu-calculus/solutions/sets.lisp new file mode 100644 index 0000000..14efe0f --- /dev/null +++ b/books/workshops/1999/mu-calculus/solutions/sets.lisp @@ -0,0 +1,575 @@ +(in-package "SETS") +(include-book "defung") +(include-book "meta") +(include-book "perm") + +(defun in (a X) + "Checks for set containment, i.e., is a in X?" + (declare (xargs :guard (true-listp X))) + (cond ((endp X) nil) + ((equal a (car X)) t) + (t (in a (cdr X))))) + +(defun =< (X Y) + "Subset, i.e., X =< Y" + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (cond ((endp X) t) + (t (and (in (car X) Y) + (=< (cdr X) Y))))) + +(defun == (X Y) + "Set equality, i.e., X == Y" + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (and (=< X Y) + (=< Y X))) + +(defung set-union (X Y) +"set union, i.e., X U Y" + (declare (xargs :guard (true-listp X))) + ((implies (true-listp Y) (true-listp (set-union X Y))) + :rule-classes :type-prescription) + (if (endp X) + Y + (cons (car X) (set-union (cdr X) Y)))) + +(defun intersect (X Y) +"Set intersection, i.e., X & Y" + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (cond ((endp X) nil) + ((in (car X) Y) + (cons (car X) (intersect (cdr X) Y))) + (t (intersect (cdr X) Y)))) + +(defun minus (X Y) +"Set minus, i.e., X - Y" + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (cond ((endp X) nil) + ((in (car X) Y) + (minus (cdr X) Y)) + (t (cons (car X) (minus (cdr X) Y))))) + +(defun set-complement (X U) +"complement set X, i.e., U - X" + (declare (xargs :guard (and (true-listp X) (true-listp U)))) + (minus U X)) + +(defun remove-dups (X) +"Remove duplicates in X" + (declare (xargs :guard (true-listp X))) + (cond ((endp X) nil) + ((in (car X) (cdr X)) + (remove-dups (cdr X))) + (t (cons (car X) + (remove-dups (cdr X)))))) + +(defun cardinality (X) +"Cardinality of X, i.e., |X|" + (declare (xargs :guard (true-listp X))) + (len (remove-dups X))) + +(defthm |X =< Y => X =< ({a} U Y)| + (implies (=< X Y) + (=< X (cons a Y)))) + +(defthm |X =< X| + (=< X X)) + +(defthm |X =< Y & Y =< Z => X =< Z| + (implies (and (=< X Y) + (=< Y Z)) + (=< X Z)) + :rule-classes ((:rewrite) + (:forward-chaining :trigger-terms ((=< X Y) (=< Y Z))))) + +; Exercise 1 +(defequiv ==) + +(defthm |X == Y => X =< Y /\ Y =< X| + (implies (== X Y) + (and (=< X Y) + (=< Y X))) + :rule-classes :forward-chaining) + +(defthm |a in X => {a}uX == X| + (implies (in a X) + (== (cons a X) X))) + +(defthm |{a}u({b} u X) == {b}u({a} u X)| + (== (cons a (cons b X)) + (cons b (cons a X)))) + +(defthm atom-== + (implies (and (atom a) + (atom b)) + (== a b)) + :rule-classes ((:forward-chaining :trigger-terms ((atom a) (atom b) (== a b))))) + +(defthm |X == Y /\ ~(Y == Z) => ~(X == Z)| + (implies (and (== X Y) + (not (== Y Z))) + (not (== X Z))) + :rule-classes ((:forward-chaining :trigger-terms ((== X Y) (== Y Z))))) + +(defthm atom-consp-== + (implies (and (atom a) + (consp X)) + (not (== a X))) + :rule-classes ((:forward-chaining :trigger-terms ((atom a) (consp X) (== a X))))) + +(defthm |X =< Y => a in X => a in Y| + (implies (and (in a X) + (not (in a Y))) + (not (=< X Y))) + :rule-classes ((:forward-chaining :trigger-terms ((in a X) (in a Y) (=< X Y))))) + +; Exercise 2, part 1 +(defcong == equal (in a X) 2 + :hints (("Goal" + :use ((:instance |X =< Y => a in X => a in Y| + (X x-equiv) (Y X)) + (:instance |X =< Y => a in X => a in Y| + (y x-equiv))) + :in-theory (disable |X =< Y => a in X => a in Y|)))) + +(defthm |X == X-equiv iff X =< Y /\ X-equiv =< Y| + (implies (== X X-equiv) + (iff (=< X Y) + (=< X-equiv Y))) + :rule-classes nil) + +; Exercise 2, part 2 +(defcong == equal (=< X Y) 1 + :hints (("goal" + :use (:instance |X == X-equiv iff X =< Y /\ X-equiv =< Y|)))) + +; Exercise 2, part 3 +(defcong == equal (=< X Y) 2) + +; Exercise 2, part 4 +(defcong == == (cons a Y) 2) + +; Exercise 3, part 1 +(defthm |a in X u Y = a in X \/ a in Y| + (equal (in a (set-union X Y)) + (or (in a X) + (in a Y)))) + +(defthm |X u {} == X| + (== (set-union X nil) X)) + +(defthm |a in (X u {a} u Y)| + (in a (set-union X (cons a Y)))) + +; Exercise 3, part 2 +(defthm |X =< Y u X| + (=< X (set-union Y X))) + +(defthm |X =< X u Y| + (=< X (set-union X Y))) + +(defthm |X u Y =< X u {a} u Y| + (=< (set-union X Y) + (set-union X (cons a Y)))) + +(defthm |X u atom == X| + (implies (atom a) + (== (set-union X a) X))) + +(defthm |X u ({a} u Y) == {a} u (X u Y)| + (== (set-union X (cons a Y)) + (cons a (set-union X Y)))) + +(in-theory (disable ==)) + +; Exercise 3, part 3 +(defthm |X u Y == Y u X| + (== (set-union X Y) + (set-union Y X))) + +(defthm |X =< Y ==> X u Y == Y| + (implies (=< X Y) + (== (set-union X Y) Y))) + +; Exercise 3, part 4 +(defthm |X u Y == Y = X =< Y| + (equal (== (set-union X Y) Y) + (=< X Y))) + +(defcong == == (set-union X Y) 2) + +; Exercise 3, part 5 +(defcong == == (set-union X Y) 1 + :hints (("goal" + :use ((:instance |X u Y == Y u X|) + (:instance |X u Y == Y u X| (x x-equiv)))))) + +; Exercise 3, part 6 +(defthm |Y u Z =< X = Y =< X /\ Z =< X| + (equal (=< (set-union Y Z) X) + (and (=< Y X) + (=< Z X)))) + +(defthm |X =< Y \/ X =< Z ==> X =< Y u Z| + (implies (or (=< X Y) + (=< X Z)) + (=< X (set-union Y Z)))) + +; Exercise 4, part 1 +(defthm |a in X&Y = a in X /\ a in Y| + (equal (in a (intersect X Y)) + (and (in a X) + (in a Y)))) + +(defthm |X & atom = {}| + (implies (atom a) + (equal (intersect X a) nil))) + +(defthm |X & Y =< X & ({a} u Y)| + (=< (intersect X Y) + (intersect X (cons a Y)))) + +(defthm |X & Y =< Y & X| + (=< (intersect X Y) + (intersect Y X))) + +; Exercise 4, part 2 +(defthm |X & Y == Y & X| + (== (intersect X Y) + (intersect Y X)) + :hints (("goal" :in-theory (enable ==)))) + +; Exercise 4, part 3 +(defthm |X =< Y ==> X & Y == X| + (implies (=< X Y) + (== (intersect X Y) X))) + +; Exercise 4, part 4 +(defthm |Y =< X \/ Z =< X ==> Y&Z =< X| + (implies (or (=< Y X) + (=< Z X)) + (=< (intersect Y Z) X))) + +; Exercise 5, part 1 +(defthm |X =< Y ==> X-Y == {}| + (implies (=< X Y) + (equal (minus X Y) nil))) + +; Exercise 5, part 2 +(defthm |X =< Y ==> X-Z =< Y| + (implies (=< X Y) + (=< (minus X Z) Y))) + +(defun set-remove (a X) +"Removes a from X, i.e., X \ {a}" + (declare (xargs :guard (true-listp X))) + (cond ((endp X) nil) + ((equal a (car X)) (set-remove a (cdr X))) + (t (cons (car X) (set-remove a (cdr X)))))) + +(defthm set-remove-in + (== (cons a (set-remove a X)) + (cons a X)) + :hints (("Goal" :in-theory (enable ==)))) + +(defun rem-dups (X) + (declare (xargs :guard (true-listp X))) + (if (consp X) + (cons (car X) + (rem-dups (set-remove (car X) (cdr X)))) + nil)) + +(defthm rem-dups-same-set + (== (rem-dups X) X)) + +(defun rev (X) + (declare (xargs :guard t)) + (if (consp X) + (append (rev (cdr X)) (list (car X))) + nil)) + +(defthm append-==-set-union + (== (append X Y) + (set-union X Y))) + +(defthm |(rev X) == X| + (== (rev X) X)) + +(defthm set-remove-from-end + (equal (set-remove a (append X (list a))) + (set-remove a X))) + +(defthm set-remove-from-end2 + (implies (not (equal a b)) + (equal (set-remove a (append X (list b))) + (append (set-remove a X) (list b))))) + +(defthm set-remove-car + (implies (and (in a X) + (not (in a (set-remove (car X) (cdr X))))) + (equal (car X) a)) + :rule-classes nil) + +(defthm in-rem-dups + (implies (in a X) + (equal (rem-dups (append X (list a))) + (rem-dups X))) + :hints (("Subgoal *1/2.1" + :expand (rem-dups (cons (car X) + (append (cdr X) (list a))))) + ("Subgoal *1/2.1'" + :cases ((equal a (car X)))) + ("Subgoal *1/1.1" + :expand (REM-DUPS (CONS (CAR X) + (APPEND (CDR X) (LIST a))))) + ("Subgoal *1/1.1'" + :cases ((equal a (car X)))) + ("Subgoal *1/1.1.2'" + :use ((:instance set-remove-car))))) + +(defthm set-remove-in2 + (implies (not (in a X)) + (not (in a (set-remove b X))))) + +(defthm not-in-rem-dups + (implies (not (in a X)) + (equal (rem-dups (append X (list a))) + (append (rem-dups X) (list a))))) + +(defthm rev-app + (equal (rev (append X (list a))) + (cons a (rev X)))) + +(defthm rev-remove-dups + (equal (remove-dups X) + (rev (rem-dups (rev X)))) + :hints (("Subgoal *1/1.2" + :in-theory (disable in-rem-dups) + :use ((:instance in-rem-dups (a (car X)) (X (rev (cdr X)))))) + ("Subgoal *1/1.1" + :in-theory (disable not-in-rem-dups) + :use ((:instance not-in-rem-dups (a (car X)) (X (rev (cdr X)))))))) + +(defthm =<-remove-el + (=< (remove-el a X) X)) + +(encapsulate + () + (local + (defun ind-perm (X Y) + (cond ((atom X) (cons X Y)) + (t (ind-perm (cdr X) (remove-el (car X) Y)))))) + + (defthm perm-=< + (implies (perm X Y) + (=< X Y)) + :hints (("Goal" + :induct (ind-perm x y))) + :rule-classes :forward-chaining)) + +(defthm perm-is-symmetric + (implies (perm X Y) + (perm Y X)) + :rule-classes :forward-chaining) + +; Exercise 6, part 2 +(defrefinement perm == + :hints (("Goal" + :in-theory (enable ==)))) + +(defthm rem-dups-open + (equal (rem-dups (cons a X)) + (cons a (rem-dups (set-remove a X))))) + +(defthm set-remove-swap + (equal (set-remove b (set-remove a X)) + (set-remove a (set-remove b X)))) + +(defthm rem-dups-set-remove-in + (not (in a (rem-dups (set-remove a X))))) + +(defthm rem-dups-remove-el + (equal (rem-dups (set-remove a X)) + (remove-el a (rem-dups X)))) + +(defthm in-set-remove + (implies (and (in a X) + (not (equal a b))) + (in a (set-remove b X)))) + +(defthm set-remove-=<- + (implies (=< X Y) + (=< (set-remove a X) + (set-remove a Y)))) + +(defcong == == (set-remove a X) 2 + :hints (("Goal" :in-theory (enable ==)))) + +; Since this function is used only to prove theorems, there is no +; point in verifying guards. +(defun ind-perm2 (X Y) + (cond ((atom X) (cons X Y)) + (t (ind-perm2 (set-remove (car X) X) (set-remove (car X) Y))))) + +(defcong == perm (rem-dups X) 1 + :hints (("Goal" :induct (ind-perm2 x x-equiv)) + ("Subgoal *1/2''" + :expand ((REM-DUPS X) (rem-dups x-equiv))) + ("Subgoal *1/2.4'" :in-theory (enable ==)) + ("Subgoal *1/1''" :in-theory (enable ==)))) + +(defthm perm-append + (perm (append X nil) X)) + +(defthm perm-rev + (perm (rev X) X)) + +(defthm perm-rem-dups-remove-dups + (perm (remove-dups X) (rem-dups X))) + +(defcong perm equal (len X) 1) + +(defun =<-perm (X Y) + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (cond ((endp X) t) + (t (and (in (car X) Y) + (=<-perm (cdr X) (remove-el (car X) Y)))))) + +(defthm =<-perm-reflexive + (=<-perm X X)) + +(defthm in-not-in-remove-el + (implies (not (in a X)) + (not (in a (remove-el b X))))) + +(defthm =<-perm-remove-el + (implies (=<-perm X (remove-el a Y)) + (=<-perm X Y))) + +(defthm =<-perm-=< + (implies (=<-perm X Y) (=< X Y)) + :rule-classes :forward-chaining) + +(defthm remove-el-not-in + (implies (and (true-listp X) + (not (in a X))) + (equal (remove-el a X) + X))) + +(defthm =<-perm-not-in + (implies (and (in a X) + (not (in a Y))) + (not (=<-perm X Y)))) + +(defthm =<-perm-remove + (implies (=<-perm X Y) + (=<-perm (remove-el a X) + (remove-el a Y))) + :rule-classes ((:forward-chaining + :trigger-terms ((remove-el a X) (remove-el a Y))))) + +(defthm =<-perm-transitive + (implies (and (=<-perm X Y) + (=<-perm Y Z)) + (=<-perm X Z))) + +(defun no-dups (X) + (declare (xargs :guard (true-listp X))) + (cond ((endp X) t) + (t (and (not (in (car X) (cdr X))) + (no-dups (cdr X)))))) + +(defthm no-dups-rem-dups + (no-dups (rem-dups X))) + +(defthm =<-=<-perm-rem-dups + (implies (=< X Y) + (=<-perm (rem-dups X) (rem-dups Y))) + :hints (("Goal" :induct (ind-perm2 x y)))) + +(defthm remove-el-len + (implies (in a X) + (equal (len (remove-el a X)) + (- (len X) 1))) + :rule-classes ((:linear) (:rewrite))) + +(defthm =<-perm-len + (implies (=<-perm X Y) + (<= (len X) (len Y)))) + +(defthm =<-len-rem-dups + (implies (=< X Y) + (<= (len (rem-dups X)) (len (rem-dups Y)))) + :rule-classes ((:forward-chaining) + (:linear))) + +(defthm perm-dups-== + (implies (perm (rem-dups X) (rem-dups Y)) + (== X Y)) + :hints (("Goal" + :use ((:instance rem-dups-same-set) + (:instance rem-dups-same-set (x y))) + :in-theory (disable rem-dups-same-set))) + :rule-classes :forward-chaining) + +(defthm remove-el-set-remove2 + (implies (no-dups X) + (perm (remove-el a X) + (set-remove a X)))) + +(defthm set-remove-thm + (implies (no-dups X) + (== (set-remove (car X) (cdr X)) + (cdr X))) + :hints (("Goal" + :use ((:instance remove-el-set-remove2 (a (car X)))) + :in-theory (disable remove-el-set-remove2)))) + +(defthm remove-el-no-dups + (implies (no-dups X) + (no-dups (remove-el Y X)))) + +(defthm no-dups-perm + (implies (and (no-dups X) + (no-dups Y) + (== X Y)) + (perm X Y)) + :rule-classes nil) + +(defthm =<-perm-len-perm2 + (implies (and (=<-perm X Y) + (equal (len X) + (len Y))) + (perm X Y)) + :rule-classes :forward-chaining) + +(defun s< (X Y) + (declare (xargs :guard (and (true-listp X) (true-listp Y)))) + (and (=< X Y) (not (=< Y X)))) + +(defthm s<-implies-<-len + (implies (s< X Y) + (< (len (rem-dups X)) + (len (rem-dups Y)))) + :hints (("goal'''" + :use ((:instance =<-=<-perm-rem-dups)) + :in-theory (disable =<-=<-perm-rem-dups))) + :rule-classes ((:linear) (:forward-chaining :trigger-terms ((=< X Y) (== X Y))))) + +; Exercise 7 +(defthm s<-implies-<-len2 + (implies (s< X Y) + (< (len (remove-dups X)) + (len (remove-dups Y)))) + :hints (("goal" + :use (:instance s<-implies-<-len))) + :rule-classes nil) + +(defthm subset-lens + (implies (and (=< X Y) + (equal (len (rem-dups X)) + (len (rem-dups Y)))) + (=< Y X)) + :hints (("goal" + :in-theory (disable s<-implies-<-len) + :use ((:instance s<-implies-<-len)))) + :rule-classes :forward-chaining) |