X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fdama%2Fdama%2Fmodels%2Fq_bars.ma;h=75721e4db8561896691800a256ce599c40d1fa3e;hb=98c84d48f4511cb52c8dc03881e113bd4bd9c6ce;hp=6be729db5492c6e55bbdeedfa97de1f011b21607;hpb=6b61a9e6698a7c1936adf217b599e34e65a5e4c9;p=helm.git diff --git a/helm/software/matita/contribs/dama/dama/models/q_bars.ma b/helm/software/matita/contribs/dama/dama/models/q_bars.ma index 6be729db5..75721e4db 100644 --- a/helm/software/matita/contribs/dama/dama/models/q_bars.ma +++ b/helm/software/matita/contribs/dama/dama/models/q_bars.ma @@ -12,6 +12,7 @@ (* *) (**************************************************************************) +include "nat_ordered_set.ma". include "models/q_support.ma". include "models/list_support.ma". include "cprop_connectives.ma". @@ -29,7 +30,7 @@ interpretation "q0" 'empty_bar = empty_bar. notation < "\ldots\rect\square\EmptySmallSquare\ldots" with precedence 90 for @{'lq2}. interpretation "lq2" 'lq2 = (list bar). -let rec sum_bases (l:list bar) (i:nat)on i ≝ +let rec sum_bases (l:list bar) (i:nat) on i ≝ match i with [ O ⇒ OQ | S m ⇒ @@ -44,6 +45,84 @@ axiom sum_bases_empty_nat_of_q_le_q: axiom sum_bases_empty_nat_of_q_le_q_one: ∀q:ℚ.q < sum_bases [] (nat_of_q q) + Qpos one. +lemma sum_bases_ge_OQ: + ∀l,n. OQ ≤ sum_bases l n. +intro; elim l; simplify; intros; +[1: elim n; [apply q_eq_to_le;reflexivity] simplify; + apply q_le_plus_trans; try assumption; apply q_lt_to_le; apply q_pos_lt_OQ; +|2: cases n; [apply q_eq_to_le;reflexivity] simplify; + apply q_le_plus_trans; [apply H| apply q_lt_to_le; apply q_pos_lt_OQ;]] +qed. + +lemma sum_bases_O: + ∀l.∀x.sum_bases l x ≤ OQ → x = O. +intros; cases x in H; [intros; reflexivity] intro; cases (?:False); +cases (q_le_cases ?? H); +[1: apply (q_lt_corefl OQ); rewrite < H1 in ⊢ (?? %); +|2: apply (q_lt_antisym ??? H1);] clear H H1; cases l; +simplify; apply q_lt_plus_trans; +try apply q_pos_lt_OQ; +try apply (sum_bases_ge_OQ []); +apply (sum_bases_ge_OQ l1); +qed. + +lemma sum_bases_increasing: + ∀l,x.sum_bases l x < sum_bases l (S x). +intro; elim l; +[1: elim x; + [1: simplify; rewrite > q_plus_sym; rewrite > q_plus_OQ; + apply q_pos_lt_OQ; + |2: simplify in H ⊢ %; + apply q_lt_plus; rewrite > q_elim_minus; + rewrite < q_plus_assoc; rewrite < q_elim_minus; + rewrite > q_plus_minus; rewrite > q_plus_OQ; + assumption;] +|2: elim x; + [1: simplify; rewrite > q_plus_sym; rewrite > q_plus_OQ; + apply q_pos_lt_OQ; + |2: simplify; change in ⊢ (? ? (? % ?)) with (sum_bases l1 (S n)) ; + apply q_lt_plus; rewrite > q_elim_minus; + rewrite < q_plus_assoc; rewrite < q_elim_minus; + rewrite > q_plus_minus; rewrite > q_plus_OQ; apply H]] +qed. + +lemma sum_bases_lt_canc: + ∀l,x,y.sum_bases l (S x) < sum_bases l (S y) → sum_bases l x < sum_bases l y. +intro; elim l; [apply (q_lt_canc_plus_r ?? (Qpos one));apply H] +generalize in match H1;apply (nat_elim2 (?:? → ? → CProp) ??? x y); +intros 2; +[3: intros 2; simplify; apply q_lt_inj_plus_r; apply H; + apply (q_lt_canc_plus_r ?? (Qpos (\fst a))); apply H3; +|2: cases (?:False); simplify in H2; + apply (q_lt_le_incompat (sum_bases l1 (S n)) OQ);[2: apply sum_bases_ge_OQ;] + apply (q_lt_canc_plus_r ?? (Qpos (\fst a))); apply H2; +|1: cases n in H2; intro; + [1: cases (?:False); apply (q_lt_corefl ? H2); + |2: simplify; apply q_lt_plus_trans; [apply sum_bases_ge_OQ] + apply q_pos_lt_OQ;]] +qed. + +lemma sum_bars_increasing2: + ∀l.∀n1,n2:nat.n1 H1; apply q_eq_to_le; reflexivity; + |3: exists [apply 〈O,OQ〉] simplify; constructor 2; split; try assumption; + try reflexivity; apply q_lt_to_le; assumption; + |2: generalize in match (refl_eq ? (bars f): bars f = bars f); + generalize in match (bars f) in ⊢ (??? % → %); intro X; cases X; clear X; + intros; + [1: exists [apply 〈O,OQ〉] simplify; constructor 3; split; reflexivity; + |2: cases (value ⅆ[i,start f] (b::l)) (p Hp); + cases (Hp (q_dist_ge_OQ ? ?)); clear Hp value; + exists [apply p]; constructor 4; split; try split; try assumption; + [1: apply q_lt_to_le; assumption; + |2: rewrite < H2; assumption; + |3: cases (cmp_nat (\fst p) (len (bars f))); + [1:apply lt_to_le;rewrite H6;rewrite < H2;apply le_n] + cases (?:False); cases (\fst p) in H3 H4 H6; clear H5; + [1: intros; apply (not_le_Sn_O ? H5); + |2: rewrite > q_d_sym; rewrite > q_d_noabs; [2: apply q_lt_to_le; assumption] + intros; lapply (q_lt_inj_plus_r ?? (Qopp (start f)) H1); clear H1; + generalize in match Hletin; + rewrite > (q_plus_sym (start f)); rewrite < q_plus_assoc; + do 2 rewrite < q_elim_minus; rewrite > q_plus_minus; + rewrite > q_plus_OQ; intro K; apply (q_lt_corefl (i-start f)); + apply (q_lt_le_trans ???? H3); rewrite < H2; + apply (q_lt_trans ??? K); apply sum_bars_increasing2; + assumption;]]]]] |1,3: intros; split; [1,4: clear H2; cases (value (q-Qpos (\fst b)) l1); cases (H2 (q_le_to_diff_ge_OQ ?? (? H1))); @@ -106,8 +215,7 @@ letin value ≝ ( |2: apply sum_bases_empty_nat_of_q_le_q_one; |3: elim (nat_of_q q); [reflexivity] simplify; assumption]] qed. - - + definition same_values ≝ λl1,l2:q_f. ∀input.\snd (\fst (value l1 input)) = \snd (\fst (value l2 input)). @@ -122,29 +230,3 @@ intro; cases x; intros; [2:exists [apply r] reflexivity] cases (?:False); [ apply (q_lt_corefl ? H)|apply (q_neg_gt ? H)] qed. - -notation < "\blacksquare" non associative with precedence 90 for @{'hide}. -definition hide ≝ λT:Type.λx:T.x. -interpretation "hide" 'hide = (hide _ _). - -lemma sum_bases_ge_OQ: - ∀l,n. OQ ≤ sum_bases l n. -intro; elim l; simplify; intros; -[1: elim n; [apply q_eq_to_le;reflexivity] simplify; - apply q_le_plus_trans; try assumption; apply q_lt_to_le; apply q_pos_lt_OQ; -|2: cases n; [apply q_eq_to_le;reflexivity] simplify; - apply q_le_plus_trans; [apply H| apply q_lt_to_le; apply q_pos_lt_OQ;]] -qed. - -lemma sum_bases_O: - ∀l:q_f.∀x.sum_bases (bars l) x ≤ OQ → x = O. -intros; cases x in H; [intros; reflexivity] intro; cases (?:False); -cases (q_le_cases ?? H); -[1: apply (q_lt_corefl OQ); rewrite < H1 in ⊢ (?? %); -|2: apply (q_lt_antisym ??? H1);] clear H H1; cases (bars l); -simplify; apply q_lt_plus_trans; -try apply q_pos_lt_OQ; -try apply (sum_bases_ge_OQ []); -apply (sum_bases_ge_OQ l1); -qed. -