562 "(INT x. A x Un B) = ((INT x.A x) Un B)", |
562 "(INT x. A x Un B) = ((INT x.A x) Un B)", |
563 "(INT x. A Un B x) = (A Un (INT x.B x))", |
563 "(INT x. A Un B x) = (A Un (INT x.B x))", |
564 "(INT x. A x - B) = ((INT x.A x) - B)", |
564 "(INT x. A x - B) = ((INT x.A x) - B)", |
565 "(INT x. A - B x) = (A - (UN x.B x))"]; |
565 "(INT x. A - B x) = (A - (UN x.B x))"]; |
566 |
566 |
567 (*Analogous laws for bounded Unions and Intersections are conditional |
567 val UN_simps = map prover |
|
568 ["(UN x:C. A x Int B) = ((UN x:C.A x) Int B)", |
|
569 "(UN x:C. A Int B x) = (A Int (UN x:C.B x))", |
|
570 "(UN x:C. A x - B) = ((UN x:C.A x) - B)", |
|
571 "(UN x:C. A - B x) = (A - (INT x:C.B x))"]; |
|
572 |
|
573 val INT_simps = map prover |
|
574 ["(INT x:C. insert a (B x)) = insert a (INT x:C. B x)", |
|
575 "(INT x:C. A x Un B) = ((INT x:C.A x) Un B)", |
|
576 "(INT x:C. A Un B x) = (A Un (INT x:C.B x))"]; |
|
577 |
|
578 (*The missing laws for bounded Unions and Intersections are conditional |
568 on the index set's being non-empty. Thus they are probably NOT worth |
579 on the index set's being non-empty. Thus they are probably NOT worth |
569 adding as default rewrites.*) |
580 adding as default rewrites.*) |
|
581 |
|
582 val ball_simps = map prover |
|
583 ["(ALL x:A. P x | Q) = ((ALL x:A. P x) | Q)", |
|
584 "(ALL x:A. P | Q x) = (P | (ALL x:A. Q x))", |
|
585 "(ALL x:{}. P x) = True", |
|
586 "(ALL x:insert a B. P x) = (P(a) & (ALL x:B. P x))", |
|
587 "(ALL x:Union(A). P x) = (ALL y:A. ALL x:y. P x)", |
|
588 "(ALL x:Collect Q. P x) = (ALL x. Q x --> P x)"]; |
|
589 |
|
590 val ball_conj_distrib = |
|
591 prover "(ALL x:A. P x & Q x) = ((ALL x:A. P x) & (ALL x:A. Q x))"; |
|
592 |
|
593 val bex_simps = map prover |
|
594 ["(EX x:A. P x & Q) = ((EX x:A. P x) & Q)", |
|
595 "(EX x:A. P & Q x) = (P & (EX x:A. Q x))", |
|
596 "(EX x:{}. P x) = False", |
|
597 "(EX x:insert a B. P x) = (P(a) | (EX x:B. P x))", |
|
598 "(EX x:Union(A). P x) = (EX y:A. EX x:y. P x)", |
|
599 "(EX x:Collect Q. P x) = (EX x. Q x & P x)"]; |
|
600 |
|
601 val bex_conj_distrib = |
|
602 prover "(EX x:A. P x | Q x) = ((EX x:A. P x) | (EX x:A. Q x))"; |
|
603 |
570 end; |
604 end; |
571 |
605 |
572 Addsimps (UN1_simps @ INT1_simps); |
606 Addsimps (UN1_simps @ INT1_simps @ UN_simps @ INT_simps @ |
|
607 ball_simps @ bex_simps); |