]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v
contribution about \lambda-\delta
[helm.git] / helm / coq-contribs / LAMBDA-TYPES / pr2_subst1.v
diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v
new file mode 100644 (file)
index 0000000..988237f
--- /dev/null
@@ -0,0 +1,46 @@
+(*#* #stop file *)
+
+Require subst1_defs.
+Require subst1_confluence.
+Require drop_props.
+Require pr0_subst1.
+Require pr2_defs.
+
+   Section pr2_subst1_props. (***********************************************)
+
+      Theorem pr2_delta1: (c,d:?; u:?; i:?) (drop i (0) c (CTail d (Bind Abbr) u)) ->
+                          (t1,t2:?) (subst1 i u t1 t2) -> (pr2 c t1 t2).
+      Intros; XElim H0; Clear t2; XEAuto.
+      Qed.
+
+      Hints Resolve pr2_delta1 : ltlc.
+
+      Theorem pr2_subst1: (c,e:?; v:?; i:?) (drop i (0) c (CTail e (Bind Abbr) v)) ->
+                          (t1,t2:?) (pr2 c t1 t2) ->
+                          (w1:?) (subst1 i v t1 w1) ->
+                          (EX w2 | (pr2 c w1 w2) & (subst1 i v t2 w2)).
+     Intros until 2; XElim H0; Intros.
+(* case 1: pr2_pr0 *)
+     Pr0Subst1; XEAuto.
+(* case 2: pr2_delta *)
+     Apply (neq_eq_e i i0); Intros.
+(* case 2.1: i <> i0 *)
+     Subst1Confluence; XEAuto.
+(* case 2.2: i = i0 *)
+     Rewrite <- H3 in H0; Rewrite <- H3 in H1; Clear H3 i0.
+     DropDis; Inversion H0; Rewrite H5 in H2; Clear H0 H4 H5 e v.
+     Subst1Confluence; XEAuto.
+     Qed.
+
+   End pr2_subst1_props.
+
+      Hints Resolve pr2_delta1 : ltlc.
+
+      Tactic Definition Pr2Subst1 :=
+         Match Context With
+            | [ H0: (drop ?1 (0) ?2 (CTail ?3 (Bind Abbr) ?4));
+                H1: (pr2 ?2 ?5 ?6); H3: (subst1 ?1 ?4 ?5 ?7) |- ? ] ->
+               LApply (pr2_subst1 ?2 ?3 ?4 ?1); [ Intros H_x | XAuto ];
+               LApply (H_x ?5 ?6); [ Clear H_x H1; Intros H1 | XAuto ];
+               LApply (H1 ?7); [ Clear H1; Intros H1 | XAuto ];
+               XElim H1; Intros.