]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v
ocaml 3.09 transition
[helm.git] / helm / coq-contribs / LAMBDA-TYPES / cpr0_defs.v
index ce6faccba461419f3e6edf7da5e436204c9cec63..7773a3410ced2759291a097635e787ed113ad5d2 100644 (file)
@@ -1,11 +1,90 @@
-(*#* #stop file *)
-
 Require Export contexts_defs.
+Require Export drop_defs.
 Require Export pr0_defs.
 
+(*#* #caption "current axioms for the relation $\\CprZ{}{}$",
+   "reflexivity", "compatibility" 
+*)
+(*#* #cap #cap c, c1, c2 #alpha u1 in V1, u2 in V2, k in z *)
+
       Inductive cpr0 : C -> C -> Prop :=
          | cpr0_refl : (c:?) (cpr0 c c)
-         | cpr0_cont : (c1,c2:?) (cpr0 c1 c2) -> (u1,u2:?) (pr0 u1 u2) ->
+         | cpr0_comp : (c1,c2:?) (cpr0 c1 c2) -> (u1,u2:?) (pr0 u1 u2) ->
                        (k:?) (cpr0 (CTail c1 k u1) (CTail c2 k u2)).
 
+(*#* #stop file *)
+
       Hint cpr0 : ltlc := Constructors cpr0.
+
+   Section cpr0_drop. (******************************************************)
+
+      Theorem cpr0_drop : (c1,c2:?) (cpr0 c1 c2) -> (h:?; e1:?; u1:?; k:?)
+                          (drop h (0) c1 (CTail e1 k u1)) ->
+                          (EX e2 u2 | (drop h (0) c2 (CTail e2 k u2)) &
+                                      (cpr0 e1 e2) & (pr0 u1 u2)
+                          ).
+      Intros until 1; XElim H.
+(* case 1 : cpr0_refl *)
+      XEAuto.
+(* case 2 : cpr0_comp *)
+      XElim h.
+(* case 2.1 : h = 0 *)
+      Intros; DropGenBase.
+      Inversion H2; Rewrite H6 in H1; Rewrite H4 in H; XEAuto.
+(* case 2.2 : h > 0 *)
+      XElim k; Intros; DropGenBase.
+(* case 2.2.1 : Bind *)
+      LApply (H0 n e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ].
+      XElim H0; XEAuto.
+(* case 2.2.2 : Flat *)
+      LApply (H0 (S n) e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ].
+      XElim H0; XEAuto.
+      Qed.
+
+      Theorem cpr0_drop_back : (c1,c2:?) (cpr0 c2 c1) -> (h:?; e1:?; u1:?; k:?)
+                               (drop h (0) c1 (CTail e1 k u1)) ->
+                               (EX e2 u2 | (drop h (0) c2 (CTail e2 k u2)) &
+                                           (cpr0 e2 e1) & (pr0 u2 u1)
+                               ).
+      Intros until 1; XElim H.
+(* case 1 : cpr0_refl *)
+      XEAuto.
+(* case 2 : cpr0_comp *)
+      XElim h.
+(* case 2.1 : h = 0 *)
+      Intros; DropGenBase.
+      Inversion H2; Rewrite H6 in H1; Rewrite H4 in H; XEAuto.
+(* case 2.2 : h > 0 *)
+      XElim k; Intros; DropGenBase.
+(* case 2.2.1 : Bind *)
+      LApply (H0 n e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ].
+      XElim H0; XEAuto.
+(* case 2.2.2 : Flat *)
+      LApply (H0 (S n) e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ].
+      XElim H0; XEAuto.
+      Qed.
+
+   End cpr0_drop.
+
+      Tactic Definition Cpr0Drop :=
+         Match Context With
+            | [ _: (drop ?1 (0) ?2 (CTail ?3 ?4 ?5));
+                _: (cpr0 ?2 ?6) |- ? ] ->
+               LApply (cpr0_drop ?2 ?6); [ Intros H_x | XAuto ];
+               LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ];
+               XElim H_x; Intros
+            | [ _: (drop ?1 (0) ?2 (CTail ?3 ?4 ?5));
+                _: (cpr0 ?6 ?2) |- ? ] ->
+               LApply (cpr0_drop_back ?2 ?6); [ Intros H_x | XAuto ];
+               LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ];
+               XElim H_x; Intros
+            | [ _: (drop ?1 (0) (CTail ?2 ?7 ?8) (CTail ?3 ?4 ?5));
+                _: (cpr0 ?2 ?6) |- ? ] ->
+               LApply (cpr0_drop (CTail ?2 ?7 ?8) (CTail ?6 ?7 ?8)); [ Intros H_x | XAuto ];
+               LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ];
+               XElim H_x; Intros
+            | [ _: (drop ?1 (0) (CTail ?2 ?7 ?8) (CTail ?3 ?4 ?5));
+                _: (cpr0 ?6 ?2) |- ? ] ->
+               LApply (cpr0_drop_back (CTail ?2 ?7 ?8) (CTail ?6 ?7 ?8)); [ Intros H_x | XAuto ];
+               LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ];
+               XElim H_x; Intros.