X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fturing%2Fmono.ma;h=a192f608ec46475fbbe7c48090f6c04a07bbc8aa;hb=5b28867e30a9cada823ad86ae91d39b94648940a;hp=3b97bf49560f689ee55c2c43a41d731ec81f763d;hpb=f6e6486af6eaf33087e3c7180dd115e40d9b191c;p=helm.git diff --git a/matita/matita/lib/turing/mono.ma b/matita/matita/lib/turing/mono.ma index 3b97bf495..a192f608e 100644 --- a/matita/matita/lib/turing/mono.ma +++ b/matita/matita/lib/turing/mono.ma @@ -12,17 +12,45 @@ include "basics/vectors.ma". (* include "basics/relations.ma". *) -record tape (sig:FinSet): Type[0] ≝ -{ left : list sig; - right: list sig -}. +(******************************** tape ****************************************) + +(* A tape is essentially a triple 〈left,current,right〉 where however the current +symbol could be missing. This may happen for three different reasons: both tapes +are empty; we are on the left extremity of a non-empty tape (left overflow), or +we are on the right extremity of a non-empty tape (right overflow). *) + +inductive tape (sig:FinSet) : Type[0] ≝ +| niltape : tape sig +| leftof : sig → list sig → tape sig +| rightof : sig → list sig → tape sig +| midtape : list sig → sig → list sig → tape sig. + +definition left ≝ + λsig.λt:tape sig.match t with + [ niltape ⇒ [] | leftof _ _ ⇒ [] | rightof s l ⇒ s::l | midtape l _ _ ⇒ l ]. + +definition right ≝ + λsig.λt:tape sig.match t with + [ niltape ⇒ [] | leftof s r ⇒ s::r | rightof _ _ ⇒ []| midtape _ _ r ⇒ r ]. + +definition current ≝ + λsig.λt:tape sig.match t with + [ midtape _ c _ ⇒ Some ? c | _ ⇒ None ? ]. + +definition mk_tape : + ∀sig:FinSet.list sig → option sig → list sig → tape sig ≝ + λsig,lt,c,rt.match c with + [ Some c' ⇒ midtape sig lt c' rt + | None ⇒ match lt with + [ nil ⇒ match rt with + [ nil ⇒ niltape ? + | cons r0 rs0 ⇒ leftof ? r0 rs0 ] + | cons l0 ls0 ⇒ rightof ? l0 ls0 ] ]. inductive move : Type[0] ≝ -| L : move -| R : move -. + | L : move | R : move | N : move. -(* We do not distinuish an input tape *) +(********************************** machine ***********************************) record TM (sig:FinSet): Type[1] ≝ { states : FinSet; @@ -31,38 +59,67 @@ record TM (sig:FinSet): Type[1] ≝ halt : states → bool }. -record config (sig:FinSet) (M:TM sig): Type[0] ≝ -{ cstate : states sig M; - ctape: tape sig -}. - -definition option_hd ≝ λA.λl:list A. - match l with - [nil ⇒ None ? - |cons a _ ⇒ Some ? a - ]. +definition tape_move_left ≝ λsig:FinSet.λlt:list sig.λc:sig.λrt:list sig. + match lt with + [ nil ⇒ leftof sig c rt + | cons c0 lt0 ⇒ midtape sig lt0 c0 (c::rt) ]. + +definition tape_move_right ≝ λsig:FinSet.λlt:list sig.λc:sig.λrt:list sig. + match rt with + [ nil ⇒ rightof sig c lt + | cons c0 rt0 ⇒ midtape sig (c::lt) c0 rt0 ]. definition tape_move ≝ λsig.λt: tape sig.λm:option (sig × move). - match m with + match m with [ None ⇒ t - | Some m1 ⇒ - match \snd m1 with - [ R ⇒ mk_tape sig ((\fst m1)::(left ? t)) (tail ? (right ? t)) - | L ⇒ mk_tape sig (tail ? (left ? t)) ((\fst m1)::(right ? t)) - ] - ]. + | Some m' ⇒ + let 〈s,m1〉 ≝ m' in + match m1 with + [ R ⇒ tape_move_right ? (left ? t) s (right ? t) + | L ⇒ tape_move_left ? (left ? t) s (right ? t) + | N ⇒ midtape ? (left ? t) s (right ? t) + ] ]. + +record config (sig,states:FinSet): Type[0] ≝ +{ cstate : states; + ctape: tape sig +}. -definition step ≝ λsig.λM:TM sig.λc:config sig M. - let current_char ≝ option_hd ? (right ? (ctape ?? c)) in +lemma config_expand: ∀sig,Q,c. + c = mk_config sig Q (cstate ?? c) (ctape ?? c). +#sig #Q * // +qed. + +lemma config_eq : ∀sig,M,c1,c2. + cstate sig M c1 = cstate sig M c2 → + ctape sig M c1 = ctape sig M c2 → c1 = c2. +#sig #M1 * #s1 #t1 * #s2 #t2 // +qed. + +definition step ≝ λsig.λM:TM sig.λc:config sig (states sig M). + let current_char ≝ current ? (ctape ?? c) in let 〈news,mv〉 ≝ trans sig M 〈cstate ?? c,current_char〉 in mk_config ?? news (tape_move sig (ctape ?? c) mv). - + +(******************************** loop ****************************************) let rec loop (A:Type[0]) n (f:A→A) p a on n ≝ match n with [ O ⇒ None ? | S m ⇒ if p a then (Some ? a) else loop A m f p (f a) ]. +lemma loop_S_true : + ∀A,n,f,p,a. p a = true → + loop A (S n) f p a = Some ? a. +#A #n #f #p #a #pa normalize >pa // +qed. + +lemma loop_S_false : + ∀A,n,f,p,a. p a = false → + loop A (S n) f p a = loop A n f p (f a). +normalize #A #n #f #p #a #Hpa >Hpa % +qed. + lemma loop_incr : ∀A,f,p,k1,k2,a1,a2. loop A k1 f p a1 = Some ? a2 → loop A (k2+k1) f p a1 = Some ? a2. @@ -73,7 +130,7 @@ lemma loop_incr : ∀A,f,p,k1,k2,a1,a2. ] qed. -lemma loop_split : ∀A,f,p,q.(∀b. p b = false → q b = false) → +lemma loop_merge : ∀A,f,p,q.(∀b. p b = false → q b = false) → ∀k1,k2,a1,a2,a3,a4. loop A k1 f p a1 = Some ? a2 → f a2 = a3 → q a2 = false → @@ -86,51 +143,142 @@ lemma loop_split : ∀A,f,p,q.(∀b. p b = false → q b = false) → [#eqa1a2 destruct #eqa2a3 #Hqa2 #H whd in ⊢ (??(??%???)?); >plus_n_Sm @loop_incr whd in ⊢ (??%?); >Hqa2 >eqa2a3 @H - |normalize >(Hpq … pa1) normalize - #H1 #H2 #H3 @(Hind … H2) // + |normalize >(Hpq … pa1) normalize #H1 #H2 #H3 @(Hind … H2) // ] ] qed. -(* -lemma loop_split : ∀A,f,p,q.(∀b. p b = false → q b = false) → - ∀k1,k2,a1,a2,a3. - loop A k1 f p a1 = Some ? a2 → - loop A k2 f q a2 = Some ? a3 → - loop A (k1+k2) f q a1 = Some ? a3. -#Sig #f #p #q #Hpq #k1 elim k1 - [normalize #k2 #a1 #a2 #a3 #H destruct - |#k1' #Hind #k2 #a1 #a2 #a3 normalize in ⊢ (%→?→?); - cases (true_or_false (p a1)) #pa1 >pa1 normalize in ⊢ (%→?); - [#eqa1a2 destruct #H @loop_incr // - |normalize >(Hpq … pa1) normalize - #H1 #H2 @(Hind … H2) // - ] - ] +lemma loop_split : ∀A,f,p,q.(∀b. q b = true → p b = true) → + ∀k,a1,a2. + loop A k f q a1 = Some ? a2 → + ∃k1,a3. + loop A k1 f p a1 = Some ? a3 ∧ + loop A (S(k-k1)) f q a3 = Some ? a2. +#A #f #p #q #Hpq #k elim k + [#a1 #a2 normalize #Heq destruct + |#i #Hind #a1 #a2 normalize + cases (true_or_false (q a1)) #Hqa1 >Hqa1 normalize + [ #Ha1a2 destruct + @(ex_intro … 1) @(ex_intro … a2) % + [normalize >(Hpq …Hqa1) // |>Hqa1 //] + |#Hloop cases (true_or_false (p a1)) #Hpa1 + [@(ex_intro … 1) @(ex_intro … a1) % + [normalize >Hpa1 // |>Hqa1 Hpa1 normalize // | @Hloop2 ] + ] + ] + ] +qed. + +lemma loop_eq : ∀sig,f,q,i,j,a,x,y. + loop sig i f q a = Some ? x → loop sig j f q a = Some ? y → x = y. +#sig #f #q #i #j @(nat_elim2 … i j) +[ #n #a #x #y normalize #Hfalse destruct (Hfalse) +| #n #a #x #y #H1 normalize #Hfalse destruct (Hfalse) +| #n1 #n2 #IH #a #x #y normalize cases (q a) normalize + [ #H1 #H2 destruct % + | /2/ ] +] +qed. + +lemma loop_Some : + ∀A,k,f,p,a,b.loop A k f p a = Some ? b → p b = true. +#A #k #f #p elim k + [#a #b normalize #Hfalse destruct + |#k0 #IH #a #b whd in ⊢ (??%? → ?); cases (true_or_false (p a)) #Hpa + [ >Hpa normalize #H1 destruct // | >Hpa normalize @IH ] + ] +qed. + +lemma loop_lift : ∀A,B,k,lift,f,g,h,hlift,c1,c2. + (∀x.hlift (lift x) = h x) → + (∀x.h x = false → lift (f x) = g (lift x)) → + loop A k f h c1 = Some ? c2 → + loop B k g hlift (lift c1) = Some ? (lift … c2). +#A #B #k #lift #f #g #h #hlift #c1 #c2 #Hfg #Hhlift +generalize in match c1; elim k +[#c0 normalize in ⊢ (??%? → ?); #Hfalse destruct (Hfalse) +|#k0 #IH #c0 whd in ⊢ (??%? → ??%?); + cases (true_or_false (h c0)) #Hc0 >Hfg >Hc0 normalize + [ #Heq destruct (Heq) % | (loop_eq … Hloop Hloop1) // +qed. + +definition accRealize ≝ λsig.λM:TM sig.λacc:states sig M.λRtrue,Rfalse. +∀t.∃i.∃outc. + loopM sig M i (initc sig M t) = Some ? outc ∧ + (cstate ?? outc = acc → Rtrue t (ctape ?? outc)) ∧ + (cstate ?? outc ≠ acc → Rfalse t (ctape ?? outc)). -(* Compositions *) +(******************************** NOP Machine *********************************) + +(* NO OPERATION + t1 = t2 *) + +definition nop_states ≝ initN 1. +definition start_nop : initN 1 ≝ mk_Sig ?? 0 (le_n … 1). + +definition nop ≝ + λalpha:FinSet.mk_TM alpha nop_states + (λp.let 〈q,a〉 ≝ p in 〈q,None ?〉) + start_nop (λ_.true). + +definition R_nop ≝ λalpha.λt1,t2:tape alpha.t2 = t1. + +lemma sem_nop : + ∀alpha.nop alpha ⊨ R_nop alpha. +#alpha #intape @(ex_intro ?? 1) +@(ex_intro … (mk_config ?? start_nop intape)) % % +qed. + +(************************** Sequential Composition ****************************) definition seq_trans ≝ λsig. λM1,M2 : TM sig. λp. let 〈s,a〉 ≝ p in match s with [ inl s1 ⇒ if halt sig M1 s1 then 〈inr … (start sig M2), None ?〉 - else - let 〈news1,m〉 ≝ trans sig M1 〈s1,a〉 in - 〈inl … news1,m〉 - | inr s2 ⇒ - let 〈news2,m〉 ≝ trans sig M2 〈s2,a〉 in - 〈inr … news2,m〉 + else let 〈news1,m〉 ≝ trans sig M1 〈s1,a〉 in 〈inl … news1,m〉 + | inr s2 ⇒ let 〈news2,m〉 ≝ trans sig M2 〈s2,a〉 in 〈inr … news2,m〉 ]. definition seq ≝ λsig. λM1,M2 : TM sig. @@ -138,62 +286,44 @@ definition seq ≝ λsig. λM1,M2 : TM sig. (FinSum (states sig M1) (states sig M2)) (seq_trans sig M1 M2) (inl … (start sig M1)) - (λs.match s with + (λs.match s with [ inl _ ⇒ false | inr s2 ⇒ halt sig M2 s2]). +notation "a · b" non associative with precedence 65 for @{ 'middot $a $b}. +interpretation "sequential composition" 'middot a b = (seq ? a b). + definition Rcomp ≝ λA.λR1,R2:relation A.λa1,a2. ∃am.R1 a1 am ∧ R2 am a2. - -(* -definition injectRl ≝ λsig.λM1.λM2.λR. - λc1,c2. ∃c11,c12. - inl … (cstate sig M1 c11) = cstate sig (seq sig M1 M2) c1 ∧ - inl … (cstate sig M1 c12) = cstate sig (seq sig M1 M2) c2 ∧ - ctape sig M1 c11 = ctape sig (seq sig M1 M2) c1 ∧ - ctape sig M1 c12 = ctape sig (seq sig M1 M2) c2 ∧ - R c11 c12. - -definition injectRr ≝ λsig.λM1.λM2.λR. - λc1,c2. ∃c21,c22. - inr … (cstate sig M2 c21) = cstate sig (seq sig M1 M2) c1 ∧ - inr … (cstate sig M2 c22) = cstate sig (seq sig M1 M2) c2 ∧ - ctape sig M2 c21 = ctape sig (seq sig M1 M2) c1 ∧ - ctape sig M2 c22 = ctape sig (seq sig M1 M2) c2 ∧ - R c21 c22. - -definition Rlink ≝ λsig.λM1,M2.λc1,c2. - ctape sig (seq sig M1 M2) c1 = ctape sig (seq sig M1 M2) c2 ∧ - cstate sig (seq sig M1 M2) c1 = inl … (halt sig M1) ∧ - cstate sig (seq sig M1 M2) c2 = inr … (start sig M2). *) interpretation "relation composition" 'compose R1 R2 = (Rcomp ? R1 R2). definition lift_confL ≝ - λsig,M1,M2,c.match c with - [ mk_config s t ⇒ mk_config ? (seq sig M1 M2) (inl … s) t ]. + λsig,S1,S2,c.match c with + [ mk_config s t ⇒ mk_config sig (FinSum S1 S2) (inl … s) t ]. + definition lift_confR ≝ - λsig,M1,M2,c.match c with - [ mk_config s t ⇒ mk_config ? (seq sig M1 M2) (inr … s) t ]. + λsig,S1,S2,c.match c with + [ mk_config s t ⇒ mk_config sig (FinSum S1 S2) (inr … s) t ]. definition halt_liftL ≝ - λsig.λM1,M2:TM sig.λs:FinSum (states ? M1) (states ? M2). + λS1,S2,halt.λs:FinSum S1 S2. match s with - [ inl s1 ⇒ halt sig M1 s1 + [ inl s1 ⇒ halt s1 | inr _ ⇒ true ]. (* should be vacuous in all cases we use halt_liftL *) definition halt_liftR ≝ - λsig.λM1,M2:TM sig.λs:FinSum (states ? M1) (states ? M2). + λS1,S2,halt.λs:FinSum S1 S2. match s with [ inl _ ⇒ false - | inr s2 ⇒ halt sig M2 s2 ]. + | inr s2 ⇒ halt s2 ]. -lemma p_halt_liftL : ∀sig,M1,M2,c. - halt sig M1 (cstate … c) = - halt_liftL sig M1 M2 (cstate … (lift_confL … c)). -#sig #M1 #M2 #c cases c #s #t % +lemma p_halt_liftL : ∀sig,S1,S2,halt,c. + halt (cstate sig S1 c) = + halt_liftL S1 S2 halt (cstate … (lift_confL … c)). +#sig #S1 #S2 #halt #c cases c #s #t % qed. -lemma trans_liftL : ∀sig,M1,M2,s,a,news,move. +lemma trans_seq_liftL : ∀sig,M1,M2,s,a,news,move. halt ? M1 s = false → trans sig M1 〈s,a〉 = 〈news,move〉 → trans sig (seq sig M1 M2) 〈inl … s,a〉 = 〈inl … news,move〉. @@ -201,175 +331,97 @@ lemma trans_liftL : ∀sig,M1,M2,s,a,news,move. #Hhalt #Htrans whd in ⊢ (??%?); >Hhalt >Htrans % qed. -lemma config_eq : - ∀sig,M,c1,c2. - cstate sig M c1 = cstate sig M c2 → - ctape sig M c1 = ctape sig M c2 → c1 = c2. -#sig #M1 * #s1 #t1 * #s2 #t2 // +lemma trans_seq_liftR : ∀sig,M1,M2,s,a,news,move. + halt ? M2 s = false → + trans sig M2 〈s,a〉 = 〈news,move〉 → + trans sig (seq sig M1 M2) 〈inr … s,a〉 = 〈inr … news,move〉. +#sig #M1 * #Q2 #T2 #init2 #halt2 #s #a #news #move +#Hhalt #Htrans whd in ⊢ (??%?); >Hhalt >Htrans % qed. -lemma step_lift_confL : ∀sig,M1,M2,c0. - halt ? M1 (cstate ?? c0) = false → - step sig (seq sig M1 M2) (lift_confL sig M1 M2 c0) = - lift_confL sig M1 M2 (step sig M1 c0). -#sig #M1 (* * #Q1 #T1 #init1 #halt1 *) #M2 * #s * #lt -#rs #Hhalt -whd in ⊢ (???(????%));whd in ⊢ (???%); -lapply (refl ? (trans ?? 〈s,option_hd sig rs〉)) -cases (trans ?? 〈s,option_hd sig rs〉) in ⊢ (???% → %); -#s0 #m0 #Heq whd in ⊢ (???%); -whd in ⊢ (??(???%)?); whd in ⊢ (??%?); ->(trans_liftL … Heq) -[% | //] +lemma step_seq_liftR : ∀sig,M1,M2,c0. + halt ? M2 (cstate ?? c0) = false → + step sig (seq sig M1 M2) (lift_confR sig (states ? M1) (states ? M2) c0) = + lift_confR sig (states ? M1) (states ? M2) (step sig M2 c0). +#sig #M1 (* * #Q1 #T1 #init1 #halt1 *) #M2 * #s #t + lapply (refl ? (trans ?? 〈s,current sig t〉)) + cases (trans ?? 〈s,current sig t〉) in ⊢ (???% → %); + #s0 #m0 cases t + [ #Heq #Hhalt + | 2,3: #s1 #l1 #Heq #Hhalt + |#ls #s1 #rs #Heq #Hhalt ] + whd in ⊢ (???(????%)); >Heq whd in ⊢ (???%); + whd in ⊢ (??(???%)?); whd in ⊢ (??%?); >(trans_seq_liftR … Heq) // qed. -lemma loop_liftL : ∀sig,k,M1,M2,c1,c2. - loop ? k (step sig M1) (λc.halt sig M1 (cstate ?? c)) c1 = Some ? c2 → - loop ? k (step sig (seq sig M1 M2)) - (λc.halt_liftL sig M1 M2 (cstate ?? c)) (lift_confL … c1) = - Some ? (lift_confL … c2). -#sig #k #M1 #M2 #c1 #c2 generalize in match c1; -elim k -[#c0 normalize in ⊢ (??%? → ?); #Hfalse destruct (Hfalse) -|#k0 #IH #c0 whd in ⊢ (??%? → ??%?); - lapply (refl ? (halt ?? (cstate sig M1 c0))) - cases (halt ?? (cstate sig M1 c0)) in ⊢ (???% → ?); #Hc0 >Hc0 - [ >(?: halt_liftL ??? (cstate sig (seq ? M1 M2) (lift_confL … c0)) = true) - [ whd in ⊢ (??%? → ??%?); #Hc2 destruct (Hc2) % - | // ] - | >(?: halt_liftL ??? (cstate sig (seq ? M1 M2) (lift_confL … c0)) = false) - [whd in ⊢ (??%? → ??%?); #Hc2 <(IH ? Hc2) @eq_f - @step_lift_confL // - | // ] +lemma step_seq_liftL : ∀sig,M1,M2,c0. + halt ? M1 (cstate ?? c0) = false → + step sig (seq sig M1 M2) (lift_confL sig (states ? M1) (states ? M2) c0) = + lift_confL sig ?? (step sig M1 c0). +#sig #M1 (* * #Q1 #T1 #init1 #halt1 *) #M2 * #s #t + lapply (refl ? (trans ?? 〈s,current sig t〉)) + cases (trans ?? 〈s,current sig t〉) in ⊢ (???% → %); + #s0 #m0 cases t + [ #Heq #Hhalt + | 2,3: #s1 #l1 #Heq #Hhalt + |#ls #s1 #rs #Heq #Hhalt ] + whd in ⊢ (???(????%)); >Heq whd in ⊢ (???%); + whd in ⊢ (??(???%)?); whd in ⊢ (??%?); >(trans_seq_liftL … Heq) // qed. -STOP! - -lemma loop_liftR : ∀sig,k,M1,M2,c1,c2. - loop ? k (step sig M2) (λc.halt sig M2 (cstate ?? c)) c1 = Some ? c2 → - loop ? k (step sig (seq sig M1 M2)) - (λc.halt sig (seq sig M1 M2) (cstate ?? c)) (lift_confR … c1) = - Some ? (lift_confR … c2). -#sig #k #M1 #M2 #c1 #c2 -elim k -[normalize in ⊢ (??%? → ?); #Hfalse destruct (Hfalse) -|#k0 #IH whd in ⊢ (??%? → ??%?); - lapply (refl ? (halt ?? (cstate sig M2 c1))) - cases (halt ?? (cstate sig M2 c1)) in ⊢ (???% → ?); #Hc0 >Hc0 - [ >(?: halt ?? (cstate sig (seq ? M1 M2) (lift_confR … c1)) = true) - [ whd in ⊢ (??%? → ??%?); #Hc2 destruct (Hc2) - | (* ... *) ] - | >(?: halt ?? (cstate sig (seq ? M1 M2) (lift_confR … c1)) = false) - [whd in ⊢ (??%? → ??%?); #Hc2 Hhalt % +#sig #M1 #M2 #s #a #Hhalt whd in ⊢ (??%?); >Hhalt % qed. -lemma eq_ctape_lift_conf_L : ∀sig,M1,M2,outc. - ctape sig (seq sig M1 M2) (lift_confL … outc) = ctape … outc. -#sig #M1 #M2 #outc cases outc #s #t % +lemma eq_ctape_lift_conf_L : ∀sig,S1,S2,outc. + ctape sig (FinSum S1 S2) (lift_confL … outc) = ctape … outc. +#sig #S1 #S2 #outc cases outc #s #t % qed. -lemma eq_ctape_lift_conf_R : ∀sig,M1,M2,outc. - ctape sig (seq sig M1 M2) (lift_confR … outc) = ctape … outc. -#sig #M1 #M2 #outc cases outc #s #t % +lemma eq_ctape_lift_conf_R : ∀sig,S1,S2,outc. + ctape sig (FinSum S1 S2) (lift_confR … outc) = ctape … outc. +#sig #S1 #S2 #outc cases outc #s #t % qed. -theorem sem_seq: ∀sig,M1,M2,R1,R2. - Realize sig M1 R1 → Realize sig M2 R2 → - Realize sig (seq sig M1 M2) (R1 ∘ R2). +theorem sem_seq: ∀sig.∀M1,M2:TM sig.∀R1,R2. + M1 ⊨ R1 → M2 ⊨ R2 → M1 · M2 ⊨ R1 ∘ R2. #sig #M1 #M2 #R1 #R2 #HR1 #HR2 #t cases (HR1 t) #k1 * #outc1 * #Hloop1 #HM1 -cases (HR2 (ctape sig M1 outc1)) #k2 * #outc2 * #Hloop2 #HM2 +cases (HR2 (ctape sig (states ? M1) outc1)) #k2 * #outc2 * #Hloop2 #HM2 @(ex_intro … (k1+k2)) @(ex_intro … (lift_confR … outc2)) % -[@(loop_split ??????????? (loop_liftL … Hloop1)) - [* * +[@(loop_merge ??????????? + (loop_lift ??? (lift_confL sig (states sig M1) (states sig M2)) + (step sig M1) (step sig (seq sig M1 M2)) + (λc.halt sig M1 (cstate … c)) + (λc.halt_liftL ?? (halt sig M1) (cstate … c)) … Hloop1)) + [ * * [ #sl #tl whd in ⊢ (??%? → ?); #Hl % | #sr #tr whd in ⊢ (??%? → ?); #Hr destruct (Hr) ] - ||4:cases outc1 #s1 #t1 % - |5:@(loop_liftR … Hloop2) - |whd in ⊢ (??(???%)?);whd in ⊢ (??%?); - generalize in match Hloop1; cases outc1 #sc1 #tc1 #Hloop10 - >(trans_liftL_true sig M1 M2 ??) - [ whd in ⊢ (??%?); whd in ⊢ (???%); - @config_eq // - | @(loop_Some ?????? Hloop10) ] + || #c0 #Hhalt (trans_liftL_true sig M1 M2 ??) + [ whd in ⊢ (??%?); whd in ⊢ (???%); + @config_eq whd in ⊢ (???%); // + | @(loop_Some ?????? Hloop10) ] ] -| @(ex_intro … (ctape ? (seq sig M1 M2) (lift_confL … outc1))) - % // +| @(ex_intro … (ctape ? (FinSum (states ? M1) (states ? M2)) (lift_confL … outc1))) + % // >eq_ctape_lift_conf_L >eq_ctape_lift_conf_R // ] qed. -definition empty_tapes ≝ λsig.λn. -mk_Vector ? n (make_list (tape sig) (mk_tape sig [] []) n) ?. -elim n // normalize // +theorem sem_seq_app: ∀sig.∀M1,M2:TM sig.∀R1,R2,R3. + M1 ⊨ R1 → M2 ⊨ R2 → R1 ∘ R2 ⊆ R3 → M1 · M2 ⊨ R3. +#sig #M1 #M2 #R1 #R2 #R3 #HR1 #HR2 #Hsub +#t cases (sem_seq … HR1 HR2 t) +#k * #outc * #Hloop #Houtc @(ex_intro … k) @(ex_intro … outc) +% [@Hloop |@Hsub @Houtc] qed. - -definition init ≝ λsig.λM:TM sig.λi:(list sig). - mk_config ?? - (start sig M) - (vec_cons ? (mk_tape sig [] i) ? (empty_tapes sig (tapes_no sig M))) - [ ]. - -definition stop ≝ λsig.λM:TM sig.λc:config sig M. - halt sig M (state sig M c). - -let rec loop (A:Type[0]) n (f:A→A) p a on n ≝ - match n with - [ O ⇒ None ? - | S m ⇒ if p a then (Some ? a) else loop A m f p (f a) - ]. - -(* Compute ? M f states that f is computed by M *) -definition Compute ≝ λsig.λM:TM sig.λf:(list sig) → (list sig). -∀l.∃i.∃c. - loop ? i (step sig M) (stop sig M) (init sig M l) = Some ? c ∧ - out ?? c = f l. - -(* for decision problems, we accept a string if on termination -output is not empty *) - -definition ComputeB ≝ λsig.λM:TM sig.λf:(list sig) → bool. -∀l.∃i.∃c. - loop ? i (step sig M) (stop sig M) (init sig M l) = Some ? c ∧ - (isnilb ? (out ?? c) = false). - -(* alternative approach. -We define the notion of computation. The notion must be constructive, -since we want to define functions over it, like lenght and size - -Perche' serve Type[2] se sposto a e b a destra? *) - -inductive cmove (A:Type[0]) (f:A→A) (p:A →bool) (a,b:A): Type[0] ≝ - mk_move: p a = false → b = f a → cmove A f p a b. - -inductive cstar (A:Type[0]) (M:A→A→Type[0]) : A →A → Type[0] ≝ -| empty : ∀a. cstar A M a a -| more : ∀a,b,c. M a b → cstar A M b c → cstar A M a c. - -definition computation ≝ λsig.λM:TM sig. - cstar ? (cmove ? (step sig M) (stop sig M)). - -definition Compute_expl ≝ λsig.λM:TM sig.λf:(list sig) → (list sig). - ∀l.∃c.computation sig M (init sig M l) c → - (stop sig M c = true) ∧ out ?? c = f l. - -definition ComputeB_expl ≝ λsig.λM:TM sig.λf:(list sig) → bool. - ∀l.∃c.computation sig M (init sig M l) c → - (stop sig M c = true) ∧ (isnilb ? (out ?? c) = false).