X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fturing%2Fmono.ma;h=f041d8b259f514351f36b11a20acf8a88cd5eaa2;hb=5fc2b08d86038360e588b8fff333a623964efabe;hp=b4599d27f5a620e0b00231d1eac760398d07ebc5;hpb=12360095db4ceb504b68cc2a369cef123ccf40a5;p=helm.git diff --git a/matita/matita/lib/turing/mono.ma b/matita/matita/lib/turing/mono.ma index b4599d27f..f041d8b25 100644 --- a/matita/matita/lib/turing/mono.ma +++ b/matita/matita/lib/turing/mono.ma @@ -12,14 +12,52 @@ include "basics/vectors.ma". (* include "basics/relations.ma". *) +(* record tape (sig:FinSet): Type[0] ≝ -{ left : list sig; - right: list sig +{ left : list (option sig); + right: list (option sig) }. +*) + +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 +| N : move . (* We do not distinuish an input tape *) @@ -36,24 +74,78 @@ record config (sig,states:FinSet): Type[0] ≝ ctape: tape sig }. -definition option_hd ≝ λA.λl:list A. +(* definition option_hd ≝ λA.λl:list (option A). match l with [nil ⇒ None ? - |cons a _ ⇒ Some ? a + |cons a _ ⇒ a ]. + *) -definition tape_move ≝ λsig.λt: tape sig.λm:option (sig × move). - match m with +(*definition tape_write ≝ λsig.λt:tape sig.λs:sig. + 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. @@ -146,7 +250,16 @@ definition WRealize ≝ λsig.λM:TM sig.λR:relation (tape sig). ∀t,i,outc. loop ? i (step sig M) (λc.halt sig M (cstate ?? c)) (initc sig M t) = Some ? outc → R t (ctape ?? outc). - + +definition Terminate ≝ λsig.λM:TM sig.λt. ∃i,outc. + loop ? i (step sig M) (λc.halt sig M (cstate ?? c)) (initc sig M t) = Some ? outc. + +lemma WRealize_to_Realize : ∀sig.∀M: TM sig.∀R. + (∀t.Terminate sig M t) → WRealize sig M R → Realize sig M R. +#sig #M #R #HT #HW #t cases (HT … t) #i * #outc #Hloop +@(ex_intro … i) @(ex_intro … outc) % // @(HW … i) // +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) @@ -170,6 +283,27 @@ definition accRealize ≝ λsig.λM:TM sig.λacc:states sig M.λRtrue,Rfalse:rel (cstate ?? outc = acc → Rtrue t (ctape ?? outc)) ∧ (cstate ?? outc ≠ acc → Rfalse t (ctape ?? outc)). +(* NO OPERATION + + t1 = t2 + *) + +definition nop_states ≝ initN 1. +definition start_nop : initN 1 ≝ mk_Sig ?? 0 (le_n … (S 0)). + +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.Realize alpha (nop alpha) (R_nop alpha). +#alpha #intape @(ex_intro ?? 1) +@(ex_intro … (mk_config ?? start_nop intape)) % % +qed. + (* Compositions *) definition seq_trans ≝ λsig. λM1,M2 : TM sig. @@ -273,30 +407,34 @@ lemma step_lift_confR : ∀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 * #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_liftR … Heq) -[% | //] +#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_liftR … Heq) // qed. lemma step_lift_confL : ∀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 * #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) -[% | //] +#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_liftL … Heq) // qed. lemma loop_lift : ∀A,B,k,lift,f,g,h,hlift,c1,c2.