X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Ftutorial%2Fchapter6.ma;h=38fb54a0c3afa3a96be06c7d31a35285d3a651ff;hb=f3905556122a1990efa647cfc638d38207624a6d;hp=fff418d4d33d100c0056be8909ea3440f11228cf;hpb=b58a13d78f5c7a37000538429aeefcd54662b570;p=helm.git diff --git a/matita/matita/lib/tutorial/chapter6.ma b/matita/matita/lib/tutorial/chapter6.ma index fff418d4d..38fb54a0c 100644 --- a/matita/matita/lib/tutorial/chapter6.ma +++ b/matita/matita/lib/tutorial/chapter6.ma @@ -89,6 +89,41 @@ lemma eqP_union_l: ∀U.∀A,B,C:U →Prop. B ≐ C → A ∪ B ≐ A ∪ C. #U #A #B #C #eqBC #a @iff_or_l @eqBC qed. +lemma eqP_substract_r: ∀U.∀A,B,C:U →Prop. + A ≐ C → A - B ≐ C - B. +#U #A #B #C #eqAB #a @iff_and_r @eqAB qed. + +lemma eqP_substract_l: ∀U.∀A,B,C:U →Prop. + B ≐ C → A - B ≐ A - C. +#U #A #B #C #eqBC #a @iff_and_l /2/ qed. + +(* set equalities *) +lemma union_empty_r: ∀U.∀A:U→Prop. + A ∪ ∅ ≐ A. +#U #A #w % [* // normalize #abs @False_ind /2/ | /2/] +qed. + +lemma union_comm : ∀U.∀A,B:U →Prop. + A ∪ B ≐ B ∪ A. +#U #A #B #a % * /2/ qed. + +lemma union_assoc: ∀U.∀A,B,C:U → Prop. + A ∪ B ∪ C ≐ A ∪ (B ∪ C). +#S #A #B #C #w % [* [* /3/ | /3/] | * [/3/ | * /3/] +qed. + +(*distributivities *) + +lemma distribute_intersect : ∀U.∀A,B,C:U→Prop. + (A ∪ B) ∩ C ≐ (A ∩ C) ∪ (B ∩ C). +#U #A #B #C #w % [* * /3/ | * * /3/] +qed. + +lemma distribute_substract : ∀U.∀A,B,C:U→Prop. + (A ∪ B) - C ≐ (A - C) ∪ (B - C). +#U #A #B #C #w % [* * /3/ | * * /3/] +qed. + (************************ Sets with decidable equality ************************) (* We say that a property P:A → Prop over a datatype A is decidable when we have @@ -169,6 +204,20 @@ notation "\P H" non associative with precedence 90 notation "\b H" non associative with precedence 90 for @{(proj2 … (eqb_true ???) $H)}. +lemma eqb_false: ∀S:DeqSet.∀a,b:S. + (eqb ? a b) = false ↔ a ≠ b. +#S #a #b % #H + [@(not_to_not … not_eq_true_false) #H1 (proj2 … (eqb_true S …) (refl S a)) // +qed. + +lemma memb_cons: ∀S,a,b,l. + memb S a l = true → memb S a (b::l) = true. +#S #a #b #l normalize cases (a==b) normalize // +qed. + +lemma memb_single: ∀S,a,x. memb S a [x] = true → a = x. +#S #a #x normalize cases (true_or_false … (a==x)) #H + [#_ >(\P H) // |>H normalize #abs @False_ind /2/] +qed. + let rec uniqueb (S:DeqSet) l on l : bool ≝ match l with [ nil ⇒ true @@ -356,7 +419,7 @@ lemma memb_map_to_exists: ∀A,B:DeqSet.∀f:A→B.∀l,b. #A #B #f #l elim l [#b normalize #H destruct (H) |#a #tl #Hind #b #H cases (orb_true_l … H) - [#eqb @(ex_intro … a) <(\P eqb) % // normalize >(\b (refl ? a)) // + [#eqb @(ex_intro … a) <(\P eqb) % // |#memb cases (Hind … memb) #a * #mema #eqb @(ex_intro … a) /3/ ]