X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fdama%2Fdama%2Fmodels%2Fq_function.ma;h=32122371004982cad24e4deccf33ec5f71dad0e1;hb=6b61a9e6698a7c1936adf217b599e34e65a5e4c9;hp=21e51808a10189754f4e0e7e80736a562c9168df;hpb=b82d421fb24bd0eb8848dc7b978ce1165fb526ab;p=helm.git diff --git a/helm/software/matita/contribs/dama/dama/models/q_function.ma b/helm/software/matita/contribs/dama/dama/models/q_function.ma index 21e51808a..321223710 100644 --- a/helm/software/matita/contribs/dama/dama/models/q_function.ma +++ b/helm/software/matita/contribs/dama/dama/models/q_function.ma @@ -12,220 +12,7 @@ (* *) (**************************************************************************) -include "Q/q/q.ma". -include "list/list.ma". -include "cprop_connectives.ma". - - -notation "\rationals" non associative with precedence 99 for @{'q}. -interpretation "Q" 'q = Q. - -definition bar ≝ ratio × ℚ. (* base (Qpos) , height *) -record q_f : Type ≝ { start : ℚ; bars: list bar }. - -axiom qp : ℚ → ℚ → ℚ. -axiom qm : ℚ → ℚ → ℚ. -axiom qlt : ℚ → ℚ → CProp. - -interpretation "Q plus" 'plus x y = (qp x y). -interpretation "Q minus" 'minus x y = (qm x y). -interpretation "Q less than" 'lt x y = (qlt x y). - -inductive q_comparison (a,b:ℚ) : CProp ≝ - | q_eq : a = b → q_comparison a b - | q_lt : a < b → q_comparison a b - | q_gt : b < a → q_comparison a b. - -axiom q_cmp:∀a,b:ℚ.q_comparison a b. - -definition qle ≝ λa,b:ℚ.a = b ∨ a < b. - -interpretation "Q less or equal than" 'leq x y = (qle x y). - -axiom q_le_minus: ∀a,b,c:ℚ. a ≤ c - b → a + b ≤ c. -axiom q_lt_plus: ∀a,b,c:ℚ. a - b < c → a < c + b. -axiom q_lt_minus: ∀a,b,c:ℚ. a + b < c → a < c - b. - -axiom q_dist : ℚ → ℚ → ℚ. - -notation "hbox(\dd [term 19 x, break term 19 y])" with precedence 90 -for @{'distance $x $y}. -interpretation "ℚ distance" 'distance x y = (q_dist x y). - -axiom q_dist_ge_OQ : ∀x,y:ℚ. OQ ≤ ⅆ[x,y]. - -axiom q_lt_to_le: ∀a,b:ℚ.a < b → a ≤ b. -axiom q_le_to_diff_ge_OQ : ∀a,b.a ≤ b → OQ ≤ b-a. -axiom q_plus_OQ: ∀x:ℚ.x + OQ = x. -axiom q_plus_sym: ∀x,y:ℚ.x + y = y + x. -axiom nat_of_q: ℚ → nat. - -interpretation "list nth" 'nth = (nth _). -interpretation "list nth" 'nth_appl l d i = (nth _ l d i). -notation "'nth'" with precedence 90 for @{'nth}. -notation < "'nth' \nbsp term 90 l \nbsp term 90 d \nbsp term 90 i" -with precedence 69 for @{'nth_appl $l $d $i}. - -notation < "\rationals \sup 2" non associative with precedence 90 for @{'q2}. -interpretation "Q x Q" 'q2 = (Prod Q Q). - -definition make_list ≝ - λA:Type.λdef:nat→A. - let rec make_list (n:nat) on n ≝ - match n with [ O ⇒ nil ? | S m ⇒ def m :: make_list m] - in make_list. - -interpretation "'mk_list' appl" 'mk_list_appl f n = (make_list _ f n). -interpretation "'mk_list'" 'mk_list = (make_list _). -notation "'mk_list'" with precedence 90 for @{'mk_list}. -notation < "'mk_list' \nbsp term 90 f \nbsp term 90 n" -with precedence 69 for @{'mk_list_appl $f $n}. - - -definition empty_bar : bar ≝ 〈one,OQ〉. -notation "\rect" with precedence 90 for @{'empty_bar}. -interpretation "q0" 'empty_bar = empty_bar. - -notation < "\ldots\rect\square\EmptySmallSquare\ldots" with precedence 90 for @{'lq2}. -interpretation "lq2" 'lq2 = (list bar). - -notation "'len'" with precedence 90 for @{'len}. -interpretation "len" 'len = (length _). -notation < "'len' \nbsp term 90 l" with precedence 69 for @{'len_appl $l}. -interpretation "len appl" 'len_appl l = (length _ l). - -lemma len_mk_list : ∀T:Type.∀f:nat→T.∀n.len (mk_list f n) = n. -intros; elim n; [reflexivity] simplify; rewrite > H; reflexivity; -qed. - -let rec sum_bases (l:list bar) (i:nat)on i ≝ - match i with - [ O ⇒ OQ - | S m ⇒ - match l with - [ nil ⇒ sum_bases l m + Qpos one - | cons x tl ⇒ sum_bases tl m + Qpos (\fst x)]]. - -axiom sum_bases_empty_nat_of_q_ge_OQ: - ∀q:ℚ.OQ ≤ sum_bases [] (nat_of_q q). -axiom sum_bases_empty_nat_of_q_le_q: - ∀q:ℚ.sum_bases [] (nat_of_q q) ≤ q. -axiom sum_bases_empty_nat_of_q_le_q_one: - ∀q:ℚ.q < sum_bases [] (nat_of_q q) + Qpos one. - -definition eject1 ≝ - λP.λp:∃x:nat × ℚ.P x.match p with [ex_introT p _ ⇒ p]. -coercion eject1. -definition inject1 ≝ λP.λp:nat × ℚ.λh:P p. ex_introT ? P p h. -coercion inject1 with 0 1 nocomposites. - -definition value : - ∀f:q_f.∀i:ℚ.∃p:nat × ℚ. - match q_cmp i (start f) with - [ q_lt _ ⇒ \snd p = OQ - | _ ⇒ - And3 - (sum_bases (bars f) (\fst p) ≤ ⅆ[i,start f]) - (ⅆ[i, start f] < sum_bases (bars f) (S (\fst p))) - (\snd p = \snd (nth (bars f) ▭ (\fst p)))]. -intros; -alias symbol "pi2" = "pair pi2". -alias symbol "pi1" = "pair pi1". -letin value ≝ ( - let rec value (p: ℚ) (l : list bar) on l ≝ - match l with - [ nil ⇒ 〈nat_of_q p,OQ〉 - | cons x tl ⇒ - match q_cmp p (Qpos (\fst x)) with - [ q_lt _ ⇒ 〈O, \snd x〉 - | _ ⇒ - let rc ≝ value (p - Qpos (\fst x)) tl in - 〈S (\fst rc),\snd rc〉]] - in value : - ∀acc,l.∃p:nat × ℚ. OQ ≤ acc → - And3 - (sum_bases l (\fst p) ≤ acc) - (acc < sum_bases l (S (\fst p))) - (\snd p = \snd (nth l ▭ (\fst p)))); -[5: clearbody value; - cases (q_cmp i (start f)); - [2: exists [apply 〈O,OQ〉] simplify; reflexivity; - |*: cases (value ⅆ[i,start f] (bars f)) (p Hp); - cases (Hp (q_dist_ge_OQ ? ?)); clear Hp value; - exists[1,3:apply p]; simplify; split; 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))); - [1,3: intros; [right|left;symmetry] assumption] - simplify; apply q_le_minus; assumption; - |2,5: cases (value (q-Qpos (\fst b)) l1); - cases (H4 (q_le_to_diff_ge_OQ ?? (? H1))); - [1,3: intros; [right|left;symmetry] assumption] - clear H3 H2 value; - change with (q < sum_bases l1 (S (\fst w)) + Qpos (\fst b)); - apply q_lt_plus; assumption; - |*: cases (value (q-Qpos (\fst b)) l1); simplify; - cases (H4 (q_le_to_diff_ge_OQ ?? (? H1))); - [1,3: intros; [right|left;symmetry] assumption] - assumption;] -|2: clear value H2; simplify; intros; split; [assumption|3:reflexivity] - rewrite > q_plus_sym; rewrite > q_plus_OQ; assumption; -|4: simplify; intros; split; - [1: apply sum_bases_empty_nat_of_q_le_q; - |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)). - -definition same_bases ≝ - λl1,l2:q_f. - (∀i.\fst (nth (bars l1) ▭ i) = \fst (nth (bars l2) ▭ i)). - -axiom q_lt_corefl: ∀x:Q.x < x → False. -axiom q_lt_antisym: ∀x,y:Q.x < y → y < x → False. -axiom q_neg_gt: ∀r:ratio.OQ < Qneg r → False. -axiom q_d_x_x: ∀x:Q.ⅆ[x,x] = OQ. -axiom q_pos_OQ: ∀x.Qpos x ≤ OQ → False. -axiom q_lt_plus_trans: - ∀x,y:Q.OQ ≤ x → OQ < y → OQ < x + y. -axiom q_pos_lt_OQ: ∀x.OQ < Qpos x. -axiom q_le_plus_trans: - ∀x,y:Q. OQ ≤ x → OQ ≤ y → OQ ≤ x + y. - -lemma unpos: ∀x:ℚ.OQ < x → ∃r:ratio.Qpos r = x. -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 (bars l) n. -intro; elim (bars l); simplify; intros; -[1: elim n; [left;reflexivity] simplify; - apply q_le_plus_trans; try assumption; apply q_lt_to_le; apply q_pos_lt_OQ; -|2: cases n; [left;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 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 (mk_q_f OQ [])); -apply (sum_bases_ge_OQ (mk_q_f OQ l1)); -qed. +include "models/q_bars.ma". lemma initial_shift_same_values: ∀l1:q_f.∀init.init < start l1 → @@ -247,11 +34,60 @@ whd in ⊢ (% → ?); simplify in H3; rewrite > H7; clear H7; rewrite > (?:\fst w1 = O); [reflexivity] symmetry; apply le_n_O_to_eq; rewrite > (sum_bases_O (mk_q_f init (〈w,OQ〉::bars l1)) (\fst w1)); [apply le_n] - clear H6 w2; - simplify in H5:(? ? (? ? %)); + clear H6 w2; simplify in H5:(? ? (? ? %)); destruct H3; rewrite > q_d_x_x in H5; assumption;] -|2: intros; - +|2: intros; cases (value l1 input); simplify in ⊢ (? ? (? ? ? %) ?); + cases (q_cmp input (start l1)) in H5; whd in ⊢ (% → ?); + [1: cases (?:False); clear w2 H4 w1 H2 w H1; + apply (q_lt_antisym init (start l1)); [assumption] rewrite < H5; assumption + |2: intros; rewrite > H6; clear H6; rewrite > H4; reflexivity; + |3: cases (?:False); apply (q_lt_antisym input (start l1)); [2: assumption] + apply (q_lt_trans ??? H3 H);] +|3: intro; cases H4; clear H4; + cases (value l1 input); simplify; cases (q_cmp input (start l1)) in H4; whd in ⊢ (% → ?); + [1: intro; cases H8; clear H8; rewrite > H11; rewrite > H7; clear H11 H7; + simplify in ⊢ (? ? ? (? ? ? (? ? % ? ?))); + cut (\fst w1 = S (\fst w2)) as Key; [rewrite > Key; reflexivity;] + cut (\fst w2 = O); [2: clear H10; + symmetry; apply le_n_O_to_eq; rewrite > (sum_bases_O l1 (\fst w2)); [apply le_n] + apply (q_le_trans ??? H9); rewrite < H4; rewrite > q_d_x_x; + apply q_eq_to_le; reflexivity;] + rewrite > Hcut; clear Hcut H10 H9; simplify in H5 H6; + cut (ⅆ[input,init] = Qpos w) as E; [2: + rewrite > H2; rewrite < H4; rewrite > q_d_sym; + rewrite > q_d_noabs; [reflexivity] apply q_lt_to_le; assumption;] + cases (\fst w1) in H5 H6; intros; + [1: cases (?:False); clear H5; simplify in H6; + apply (q_lt_corefl ⅆ[input,init]); + rewrite > E in ⊢ (??%); rewrite < q_plus_OQ in ⊢ (??%); + rewrite > q_plus_sym; assumption; + |2: cases n in H5 H6; [intros; reflexivity] intros; + cases (?:False); clear H6; cases (bars l1) in H5; simplify; intros; + [apply (q_pos_OQ one);|apply (q_pos_OQ (\fst b));] + apply (q_le_S ??? (sum_bases_ge_OQ ? n1));[apply []|3:apply l] + simplify in ⊢ (? (? (? % ?) ?) ?); rewrite < (q_plus_minus (Qpos w)); + rewrite > q_elim_minus; apply q_le_minus_r; + rewrite > q_elim_opp; rewrite < E in ⊢ (??%); assumption;] + |2: intros; rewrite > H8; rewrite > H7; clear H8 H7; + simplify in H5 H6 ⊢ %; + cases (\fst w1) in H5 H6; [intros; reflexivity] + cases (bars l1); + [1: intros; simplify; elim n [reflexivity] simplify; assumption; + |2: simplify; intros; cases (?:False); clear H6; + apply (q_lt_le_incompat (input - init) (Qpos w) ); + [1: rewrite > H2; do 2 rewrite > q_elim_minus; + 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: rewrite < q_d_noabs; [2: apply q_lt_to_le; assumption] + rewrite > q_d_sym; apply (q_le_S ???? H5); + apply sum_bases_ge_OQ;]] + |3: + + +STOP + alias symbol "pi2" = "pair pi2". alias symbol "pi1" = "pair pi1". definition rebase_spec ≝ @@ -352,4 +188,4 @@ in aux : ∀l1,l2,m.∃z.∀s.spec s l1 l2 m z); unfold spec; |6:(* TODO *) |7:(* TODO *) |8: intros; cases (?:False); apply (not_le_Sn_O ? H1);] -qed. \ No newline at end of file +qed.