]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/lib/turing/multi_universal/copy.ma
wsem_match finished
[helm.git] / matita / matita / lib / turing / multi_universal / copy.ma
index e4931202652279a6abe6745086cf2b99444d1508..284349ec51a6b1b04d1db109f0264f89cbd55605 100644 (file)
@@ -47,8 +47,8 @@ definition trans_copy_step ≝
    | Some a0 ⇒ if is_sep a0 then 〈copy2,null_action ? n〉
                   else 〈copy1,change_vec ? (S n)
                           (change_vec ?(S n)
-                           (null_action ? n) (Some ? 〈a0,R〉) src)
-                          (Some ? 〈a0,R〉) dst〉 ]
+                           (null_action ? n) (〈Some ? a0,R〉) src)
+                          (〈Some ? a0,R〉) dst〉 ]
  | S q ⇒ match q with 
    [ O ⇒ (* 1 *) 〈copy1,null_action ? n〉
    | S _ ⇒ (* 2 *) 〈copy2,null_action ? n〉 ] ].
@@ -65,8 +65,8 @@ definition R_copy_step_true ≝
    is_sep x1 = false ∧
    outt = change_vec ?? 
             (change_vec ?? int
-              (tape_move ? (nth src ? int (niltape ?)) (Some ? 〈x1,R〉)) src)
-            (tape_move ? (nth dst ? int (niltape ?)) (Some ? 〈x1,R〉)) dst.
+              (tape_move_mono ? (nth src ? int (niltape ?)) (〈Some ? x1,R〉)) src)
+            (tape_move_mono ? (nth dst ? int (niltape ?)) (〈Some ? x1,R〉)) dst.
 
 definition R_copy_step_false ≝ 
   λsrc,dst:nat.λsig,n,is_sep.λint,outt: Vector (tape sig) (S n).
@@ -102,29 +102,12 @@ whd in ⊢ (??%?); >(eq_pair_fst_snd … (trans ????)) whd in ⊢ (??%?); @eq_f2
 [ >current_chars_change_vec // whd in match (trans ????);
   >nth_change_vec // >Hcurrent whd in ⊢ (??(???%)?); >Hsep %
 | >current_chars_change_vec // whd in match (trans ????);
-  >nth_change_vec // >Hcurrent whd in ⊢ (??(???????(???%))?);
+  >nth_change_vec // >Hcurrent whd in ⊢ (??(????(???%))?);
   >Hsep @tape_move_null_action
 ]
 qed.
 
-lemma change_vec_commute : ∀A,n,v,a,b,i,j. i ≠ j → 
-  change_vec A n (change_vec A n v a i) b j
-  = change_vec A n (change_vec A n v b j) a i.
-#A #n #v #a #b #i #j #Hij @(eq_vec … a)
-#k #Hk cases (decidable_eq_nat k i) #Hki
-[ >Hki >nth_change_vec // >(nth_change_vec_neq ??????? (sym_not_eq … Hij))
-  >nth_change_vec //
-| cases (decidable_eq_nat k j) #Hkj
-  [ >Hkj >nth_change_vec // >(nth_change_vec_neq ??????? Hij) >nth_change_vec //
-  | >(nth_change_vec_neq ??????? (sym_not_eq … Hki))
-    >(nth_change_vec_neq ??????? (sym_not_eq … Hkj))
-    >(nth_change_vec_neq ??????? (sym_not_eq … Hki))
-    >(nth_change_vec_neq ??????? (sym_not_eq … Hkj)) //
-  ]
-]
-qed.
-
-lemma copy_q0_q1 :
+axiom copy_q0_q1 :
   ∀src,dst,sig,n,is_sep,v,t.src ≠ dst → src < S n → dst < S n → 
   ∀s.current ? t = Some ? s → is_sep s = false → 
   step sig n (copy_step src dst sig n is_sep)
@@ -132,20 +115,21 @@ lemma copy_q0_q1 :
     mk_mconfig ??? copy1 
      (change_vec ? (S n) 
        (change_vec ?? v
-         (tape_move ? t (Some ? 〈s,R〉)) src)
-       (tape_move ? (nth dst ? v (niltape ?)) (Some ? 〈s,R〉)) dst).
+         (tape_move_mono ? t (〈Some ? s,R〉)) src)
+       (tape_move_mono ? (nth dst ? v (niltape ?)) (〈Some ? s,R〉)) dst).
+(*       
 #src #dst #sig #n #is_sep #v #t #Hneq #Hsrc #Hdst #s #Hcurrent #Hsep
 whd in ⊢ (??%?); >(eq_pair_fst_snd … (trans ????)) whd in ⊢ (??%?); @eq_f2
 [ >current_chars_change_vec // whd in match (trans ????);
   >nth_change_vec // >Hcurrent whd in ⊢ (??(???%)?); >Hsep %
 | >current_chars_change_vec // whd in match (trans ????);
-  >nth_change_vec // >Hcurrent whd in ⊢ (??(???????(???%))?);
-  >Hsep whd in ⊢ (??(???????(???%))?); >change_vec_commute // >pmap_change
+  >nth_change_vec // >Hcurrent whd in ⊢ (??(????(???%))?);
+  >Hsep whd in ⊢ (??(????(???%))?); >change_vec_commute // >pmap_change
   >change_vec_commute // @eq_f3 //
   <(change_vec_same ?? v dst (niltape ?)) in ⊢(??%?);
   >pmap_change @eq_f3 //
 ]
-qed.
+qed.*)
 
 lemma sem_copy_step :
   ∀src,dst,sig,n,is_sep.src ≠ dst → src < S n → dst < S n → 
@@ -191,21 +175,12 @@ definition R_copy ≝
    outt = int) ∧
   (current ? (nth src ? int (niltape ?)) = None ? → outt = int).
   
-lemma change_vec_change_vec : ∀A,n,v,a,b,i. 
-  change_vec A n (change_vec A n v a i) b i = change_vec A n v b i.
-#A #n #v #a #b #i @(eq_vec … a) #i0 #Hi0
-cases (decidable_eq_nat i i0) #Hii0
-[ >Hii0 >nth_change_vec // >nth_change_vec //
-| >nth_change_vec_neq // >nth_change_vec_neq //
-  >nth_change_vec_neq // ]
-qed.
-
 lemma wsem_copy : ∀src,dst,sig,n,is_sep.src ≠ dst → src < S n → dst < S n → 
   copy src dst sig n is_sep ⊫ R_copy src dst sig n is_sep.
 #src #dst #sig #n #is_sep #Hneq #Hsrc #Hdst #ta #k #outc #Hloop
 lapply (sem_while … (sem_copy_step src dst sig n is_sep Hneq Hsrc Hdst) … Hloop) //
--Hloop * #tb * #Hstar @(star_ind_l ??????? Hstar) -Hstar
-[ #tc whd in ⊢ (%→?); *
+-Hloop * #tb * #Hstar @(star_ind_l ??????? Hstar) -Hstar -ta
+[ whd in ⊢ (%→?); *
   [ * #x * * #Hx #Hsep #Houtc % [ %
     [ #ls #x0 #xs #rs #sep #Hsrctc #Hnosep >Hsrctc in Hx; normalize in ⊢ (%→?);
       #Hx0 destruct (Hx0) lapply (Hnosep ? (memb_hd …)) >Hsep
@@ -218,15 +193,15 @@ lapply (sem_while … (sem_copy_step src dst sig n is_sep Hneq Hsrc Hdst) … Hl
     | #c #Hc #Hsepc @Houtc ]
     | #_ @Houtc ]
   ]
-| #tc #td #te * #c0 * * #Hc0 #Hc0nosep #Hd #Hstar #IH #He 
+| #td #te * #c0 * * #Hc0 #Hc0nosep #Hd #Hstar #IH #He 
   lapply (IH He) -IH * * #IH1 #IH2 #IH3 % [ %
   [ #ls #x #xs #rs #sep #Hsrc_tc #Hnosep #Hsep #ls0 #x0 #target
     #c #rs0 #Hlen #Hdst_tc
     >Hsrc_tc in Hc0; normalize in ⊢ (%→?); #Hc0 destruct (Hc0)
-    <(change_vec_same … tc src (niltape ?)) in Hd:(???(???(???%??)??));
-    <(change_vec_same … tc dst (niltape ?)) in ⊢(???(???(???%??)??)→?);
-    >Hdst_tc >Hsrc_tc >change_vec_change_vec >change_vec_change_vec
-    >(change_vec_commute ?? tc ?? dst src) [|@(sym_not_eq … Hneq)]
+    <(change_vec_same … td src (niltape ?)) in Hd:(???(???(???%??)??));
+    <(change_vec_same … td dst (niltape ?)) in ⊢(???(???(???%??)??)→?);
+    >Hdst_tc >Hsrc_tc >(change_vec_change_vec ?) >change_vec_change_vec
+    >(change_vec_commute ?? td ?? dst src) [|@(sym_not_eq … Hneq)]
     >change_vec_change_vec @(list_cases2 … Hlen)
     [ #Hxsnil #Htargetnil #Hd>(IH2 … Hsep)
       [ >Hd -Hd >Hxsnil >Htargetnil @(eq_vec … (niltape ?))
@@ -247,9 +222,9 @@ lapply (sem_while … (sem_copy_step src dst sig n is_sep Hneq Hsrc Hdst) … Hl
         >nth_change_vec // >nth_change_vec // >Hxsnil % ]
     |#hd1 #hd2 #tl1 #tl2 #Hxs #Htarget >Hxs >Htarget #Hd
      >(IH1 (c0::ls) hd1 tl1 rs sep ?? Hsep (c0::ls0) hd2 tl2 c rs0)
-     [ >Hd >(change_vec_commute … ?? tc ?? src dst) //
+     [ >Hd >(change_vec_commute … ?? td ?? src dst) //
        >change_vec_change_vec
-       >(change_vec_commute … ?? tc ?? dst src) [|@sym_not_eq //]
+       >(change_vec_commute … ?? td ?? dst src) [|@sym_not_eq //]
        >change_vec_change_vec
        >reverse_cons >associative_append >associative_append % 
      | >Hd >nth_change_vec // >nth_change_vec_neq // >Hdst_tc >Htarget //
@@ -283,4 +258,10 @@ cases (nth src (tape sig) t (niltape ?))
    >change_vec_change_vec >change_vec_commute // #Ht1 >Ht1 @IH
   ]
 ]
+qed.
+
+lemma sem_copy : ∀src,dst,sig,n,is_sep.
+  src ≠ dst → src < S n → dst < S n → 
+  copy src dst sig n is_sep ⊨ R_copy src dst sig n is_sep.
+#src #dst #sig #n #is_sep #Hneq #Hsrc #Hdst @WRealize_to_Realize /2/
 qed.
\ No newline at end of file