X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fturing%2Fmulti_universal%2Ftuples.ma;h=4a7f2b5f2b77ba556cdaddc76fd6b3b91b234769;hb=21de0d35017656c5a55528390b54b0b2ae395b44;hp=428d99ccf0f415ec705d79aeec8de150e3a56ad1;hpb=00101d30f0bf914a26ed2ec61a1aa38598b05209;p=helm.git diff --git a/matita/matita/lib/turing/multi_universal/tuples.ma b/matita/matita/lib/turing/multi_universal/tuples.ma index 428d99ccf..4a7f2b5f2 100644 --- a/matita/matita/lib/turing/multi_universal/tuples.ma +++ b/matita/matita/lib/turing/multi_universal/tuples.ma @@ -62,10 +62,10 @@ definition is_config : nat → list unialpha → Prop ≝ only_bits qin ∧ cin ≠ bar ∧ |qin| = S n ∧ t = bar::qin@[cin]. lemma table_to_list: ∀n,l,h,c. is_config n c → - (∃ll,lr.table_TM n l h = ll@c@lr) → - ∃out,t. tuple_encoding n h t = (c@out) ∧ mem ? t l. + ∀ll,lr.table_TM n l h = ll@c@lr → + ∃out,lr0,t. lr = out@lr0 ∧ tuple_encoding n h t = (c@out) ∧ mem ? t l. #n #l #h #c * #qin * #cin * * * #H1 #H2 #H3 #H4 - * #ll * #lr lapply ll -ll elim l +#ll #lr lapply ll -ll elim l [>H4 #ll cases ll normalize [|#hd #tl ] #Habs destruct |#t1 #othert #Hind #ll >table_TM_cons #Htuple cut (S n < |ll@c@lr|) @@ -85,8 +85,8 @@ lemma table_to_list: ∀n,l,h,c. is_config n c → normalize in ⊢ (???%→?); whd in ⊢ (??%?→?); #Htemp lapply (cons_injective_l ????? Htemp) #Hc1 lapply (cons_injective_r ????? Htemp) -Htemp #Heq2 - %{(q2@[c2;m])} %{t1} % - [>Ht1 >Heq1 >Hc1 @eq_f >associative_append % + %{(q2@[c2;m])} %{(table_TM n othert h)} %{t1} % + [ %[ // |>Ht1 >Heq1 >Hc1 @eq_f >associative_append % ] |%1 % ] |(* ll not nil *) @@ -94,8 +94,9 @@ lemma table_to_list: ∀n,l,h,c. is_config n c → whd in ⊢ (??%?→?); #Heq destruct (Heq) cases (compare_append … e0) #l * [* cases l - [#_ #Htab cases (Hind [ ] (sym_eq … Htab)) #out * #t * #Ht #Hmemt - %{out} %{t} % // %2 // + [#_ #Htab cases (Hind [ ] (sym_eq … Htab)) + #out * #lr0 * #t * * #Hlr #Ht #Hmemt + %{out} %{lr0} %{t} % [% //| %2 //] |(* this case is absurd *) #al #tll #Heq1 >H4 #Heq2 @False_ind lapply (cons_injective_l ? bar … Heq2) #Hbar append_cons in Heq; >Hcut (append_cons ? (low_char a1)) associative_append #Heq @sym_eq @(append_l2_injective ?????? Heq) + >Hc whd in ⊢ (??%%); @eq_f >length_append >length_append + @eq_f2 // >length_map >Hlen whd in ⊢ (??%?); @eq_f // + ] +qed. +*) + +lemma tuple_to_config: ∀n,h,t,out,m,c. is_config n c → + tuple_encoding n h t = c@out@[m] → is_config n (bar::out). +#n #h * * #q0 #a0 * * #q1 #a1 #m #out #lowm #c * #q * #a * * * #Hq #Ha #Hlen #Hc +whd in ⊢ (??%?→?); #Heq %{(bits_of_state n h q1)} %{(low_char a1)} % + [% [ %[ // | cases a1 [|#b] normalize % #H destruct (H)] + |whd in ⊢ (??%?); @eq_f //] + |@eq_f cut (∀A.∀a:A.∀l1,l2. a::l1@l2 = (a::l1)@l2) [//] #Hcut + >append_cons in Heq; >Hcut (append_cons ? (low_char a1)) associative_append #Heq @sym_eq @(append_l2_injective ?????? Heq) + >Hc whd in ⊢ (??%%); @eq_f >length_append >length_append + @eq_f2 // >length_map >Hlen whd in ⊢ (??%?); @eq_f // + ] +qed. + +(* da spostare *) +lemma injective_nat_of: ∀n. injective … (nat_of n). +#n * #a0 #Ha0 * #b0 #Hb0 normalize #Heq +generalize in match Ha0; generalize in match Hb0; >Heq // +qed. + +lemma not_of_lt: ∀n,m. nat_of n m < n. +#n * #a #lta // +qed. + +(* da spostare *) +lemma injective_map: ∀A,B,f. injective A B f → injective … (map … f). +#A #B #f #injf #l1 elim l1 + [* // #a2 #l2 normalize #H destruct + |#a1 -l1 #l1 #Hind * + [normalize #H destruct + |#a2 #l2 normalize #Hmap + >(injf … (cons_injective_l ????? Hmap)) + >(Hind … (cons_injective_r ????? Hmap)) % + ] + ] +qed. + +lemma deterministic: ∀M:normalTM.∀l,t1,t2,c,out1,out2. + l = graph_enum ?? (ntrans M) → + mem ? t1 l → mem ? t2 l → + is_config (no_states M) c → + tuple_encoding ? (nhalt M) t1 = (c@out1) → + tuple_encoding ? (nhalt M) t2 = (c@out2) → + out1 = out2. +#M #l * * #q1 #a1 * * #q11 #a11 #m1 +* * #q2 #a2 * * #q21 #a21 #m2 #c #out1 #out2 #Hl #memt1 #memt2 * +#state * #char * * * #_ #_ #Hlen #Heqc #tuplet1 #tuplet2 +lapply (mem_to_memb … memt1) >Hl #membt1 +lapply (graph_enum_correct ?? (ntrans M) ?? membt1) #Ht1 +lapply (mem_to_memb … memt2) >Hl #membt2 +lapply (graph_enum_correct ?? (ntrans M) ?? membt2) #Ht2 +cut (bar::bits_of_state (no_states M) (nhalt M) q1@[low_char a1]=c) + [whd in tuplet1:(??%?); >(append_cons ? (low_char a1)) in tuplet1; #tuplet1 + @(append_l1_injective ? (bar::bits_of_state ?? q1@[low_char a1]) ???? tuplet1) + >Heqc whd in ⊢ (??%%); @eq_f >length_append >length_append + @eq_f2 // >length_map whd in ⊢ (??%?); >Hlen @eq_f + >bitlist_length %] #Hcfg1 +cut (bar::bits_of_state (no_states M) (nhalt M) q2@[low_char a2]=c) + [whd in tuplet2:(??%?); >(append_cons ? (low_char a2)) in tuplet2; #tuplet2 + @(append_l1_injective ? (bar::bits_of_state ?? q2@[low_char a2]) ???? tuplet2) + >Heqc whd in ⊢ (??%%); @eq_f >length_append >length_append + @eq_f2 // >length_map whd in ⊢ (??%?); >Hlen @eq_f + >bitlist_length %] #Hcfg2 +cut (a1 = a2) + [@injective_low_char + tuplet1 +@append_l2_injective % +qed.