X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fcoq-contribs%2FLAMBDA-TYPES%2Fcpr0_defs.v;h=7773a3410ced2759291a097635e787ed113ad5d2;hb=97c2d258a5c524eb5c4b85208899d80751a2c82f;hp=ce6faccba461419f3e6edf7da5e436204c9cec63;hpb=1b21075e987872a2e3103203b4e67c939e4a9f6a;p=helm.git diff --git a/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v index ce6faccba..7773a3410 100644 --- a/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v +++ b/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v @@ -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.