(*#* #stop file *) Require subst0_subst0. Require pr0_subst0. Require cpr0_defs. Require pr3_defs. Require pr3_props. Require pr3_confluence. Require pc3_defs. Section pc3_confluence. (*************************************************) Theorem pc3_confluence: (c:?; t1,t2:?) (pc3 c t1 t2) -> (EX t0 | (pr3 c t1 t0) & (pr3 c t2 t0)). Intros; XElim H; Intros. (* case 1: pc3_r *) XEAuto. (* case 2: pc3_u *) Clear H0; XElim H1; Intros. Inversion_clear H; [ XEAuto | Pr3Confluence; XEAuto ]. Qed. End pc3_confluence. Tactic Definition Pc3Confluence := Match Context With [ H: (pc3 ?1 ?2 ?3) |- ? ] -> LApply (pc3_confluence ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; XElim H; Intros. Section pc3_context. (****************************************************) Theorem pc3_pr0_pr2_t: (u1,u2:?) (pr0 u2 u1) -> (c:?; t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> (pc3 (CTail c k u1) t1 t2). Intros. Inversion H0; Clear H0; [ XAuto | NewInduction i ]. (* case 1: pr2_delta i = 0 *) DropGenBase; Inversion H0; Clear H0 H4 H5 H6 c k t. Rewrite H7 in H; Clear H7 u2. Pr0Subst0; Apply pc3_pr3_t with t0:=x; XEAuto. (* case 2: pr2_delta i > 0 *) NewInduction k; DropGenBase; XEAuto. Qed. Theorem pc3_pr2_pr2_t: (c:?; u1,u2:?) (pr2 c u2 u1) -> (t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> (pc3 (CTail c k u1) t1 t2). Intros until 1; Inversion H; Clear H; Intros. (* case 1: pr2_free *) EApply pc3_pr0_pr2_t; [ Apply H0 | XAuto ]. (* case 2: pr2_delta *) Inversion H; [ XAuto | NewInduction i0 ]. (* case 2.1: i0 = 0 *) DropGenBase; Inversion H4; Clear H3 H4 H7 t t4. Rewrite <- H9; Rewrite H10 in H; Rewrite <- H11 in H6; Clear H9 H10 H11 d0 k u0. Pr0Subst0; Subst0Subst0; Arith9'In H6 i. EApply pc3_pr3_u. EApply pr2_delta; XEAuto. Apply pc3_pr2_x; EApply pr2_delta; [ Idtac | XEAuto | XEAuto ]; XEAuto. (* case 2.2: i0 > 0 *) Clear IHi0; NewInduction k; DropGenBase; XEAuto. Qed. Theorem pc3_pr2_pr3_t: (c:?; u2,t1,t2:?; k:?) (pr3 (CTail c k u2) t1 t2) -> (u1:?) (pr2 c u2 u1) -> (pc3 (CTail c k u1) t1 t2). Intros until 1; XElim H; Intros. (* case 1: pr3_refl *) XAuto. (* case 2: pr3_sing *) EApply pc3_t. EApply pc3_pr2_pr2_t; [ Apply H2 | Apply H ]. XAuto. Qed. Theorem pc3_pr3_pc3_t: (c:?; u1,u2:?) (pr3 c u2 u1) -> (t1,t2:?; k:?) (pc3 (CTail c k u2) t1 t2) -> (pc3 (CTail c k u1) t1 t2). Intros until 1; XElim H; Intros. (* case 1: pr3_refl *) XAuto. (* case 2: pr3_sing *) Apply H1; Pc3Confluence. EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_pr2_pr3_t; XEAuto. Qed. End pc3_context. Tactic Definition Pc3Context := Match Context With | [ H1: (pr0 ?3 ?2); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> LApply (pc3_pr0_pr2_t ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; LApply (H1 ?1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] | [ H1: (pr0 ?3 ?2); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> LApply (pc3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; LApply (H2 ?2); [ Clear H1 H2; Intros | XAuto ] | [ H1: (pr2 ?1 ?3 ?2); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> LApply (pc3_pr2_pr2_t ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; LApply (H1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] | [ H1: (pr2 ?1 ?3 ?2); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> LApply (pc3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; LApply (H2 ?2); [ Clear H1 H2; Intros | XAuto ] | [ H1: (pr3 ?1 ?3 ?2); H2: (pc3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> LApply (pc3_pr3_pc3_t ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; LApply (H1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] | _ -> Pr3Context. Section pc3_lift. (*******************************************************) Theorem pc3_lift: (c,e:?; h,d:?) (drop h d c e) -> (t1,t2:?) (pc3 e t1 t2) -> (pc3 c (lift h d t1) (lift h d t2)). Intros. Pc3Confluence. EApply pc3_pr3_t; (EApply pr3_lift; [ XEAuto | Apply H0 Orelse Apply H1 ]). Qed. End pc3_lift. Hints Resolve pc3_lift : ltlc. Section pc3_cpr0. (*******************************************************) Remark pc3_cpr0_t_aux: (c1,c2:?) (cpr0 c1 c2) -> (k:?; u,t1,t2:?) (pr3 (CTail c1 k u) t1 t2) -> (pc3 (CTail c2 k u) t1 t2). Intros; XElim H0; Intros. (* case 1.1: pr3_refl *) XAuto. (* case 1.2: pr3_sing *) EApply pc3_t; [ Idtac | XEAuto ]. Clear H2 t1 t2. Inversion_clear H0. (* case 1.2.1: pr2_free *) XAuto. (* case 1.2.2: pr2_delta *) Cpr0Drop; Pr0Subst0. EApply pc3_pr3_u; [ EApply pr2_delta; XEAuto | XAuto ]. Qed. Theorem pc3_cpr0_t: (c1,c2:?) (cpr0 c1 c2) -> (t1,t2:?) (pr3 c1 t1 t2) -> (pc3 c2 t1 t2). Intros until 1; XElim H; Intros. (* case 1: cpr0_refl *) XAuto. (* case 2: cpr0_comp *) Pc3Context; Pc3Confluence. EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_cpr0_t_aux; XEAuto. Qed. Theorem pc3_cpr0: (c1,c2:?) (cpr0 c1 c2) -> (t1,t2:?) (pc3 c1 t1 t2) -> (pc3 c2 t1 t2). Intros; Pc3Confluence. EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_cpr0_t; XEAuto. Qed. End pc3_cpr0. Hints Resolve pc3_cpr0 : ltlc.