(*#* #stop file *) Require Export ty0_defs. Inductive csub0 [g:G] : C -> C -> Prop := (* structural rules *) | csub0_sort: (n:?) (csub0 g (CSort n) (CSort n)) | csub0_tail: (c1,c2:?) (csub0 g c1 c2) -> (k,u:?) (csub0 g (CTail c1 k u) (CTail c2 k u)) (* axioms *) | csub0_void: (c1,c2:?) (csub0 g c1 c2) -> (b:?) ~b=Void -> (u1,u2:?) (csub0 g (CTail c1 (Bind Void) u1) (CTail c2 (Bind b) u2)) | csub0_abst: (c1,c2:?) (csub0 g c1 c2) -> (u,t:?) (ty0 g c2 u t) -> (csub0 g (CTail c1 (Bind Abst) t) (CTail c2 (Bind Abbr) u)). Hint csub0 : ltlc := Constructors csub0. Section csub0_props. (****************************************************) Theorem csub0_refl: (g:?; c:?) (csub0 g c c). XElim c; XAuto. Qed. End csub0_props. Hints Resolve csub0_refl : ltlc. Section csub0_drop. (*****************************************************) Theorem csub0_drop_abbr: (g:?; n:?; c1,c2:?) (csub0 g c1 c2) -> (d1,u:?) (drop n (0) c1 (CTail d1 (Bind Abbr) u)) -> (EX d2 | (csub0 g d1 d2) & (drop n (0) c2 (CTail d2 (Bind Abbr) u)) ). XElim n. (* case 1 : n = 0 *) Intros; DropGenBase; Rewrite H0 in H; Inversion H; XEAuto. (* case 2 : n > 0 *) Intros until 2; XElim H0. (* case 2.1 : csub0_sort *) Intros; Inversion H0. (* case 2.2 : csub0_tail *) XElim k; Intros; DropGenBase. (* case 2.2.1 : Bind *) LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 u0); [ Clear H; Intros H | XAuto ]. XElim H; XEAuto. (* case 2.2.2 : Flat *) LApply (H1 d1 u0); [ Clear H1; Intros H1 | XAuto ]. XElim H1; XEAuto. (* case 2.3 : csub0_void *) Intros; DropGenBase. LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 u); [ Clear H; Intros H | XAuto ]. XElim H; XEAuto. (* case 2.4 : csub0_abst *) Intros; DropGenBase. LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 u0); [ Clear H; Intros H | XAuto ]. XElim H; XEAuto. Qed. Theorem csub0_drop_abst: (g:?; n:?; c1,c2:?) (csub0 g c1 c2) -> (d1,t:?) (drop n (0) c1 (CTail d1 (Bind Abst) t)) -> (EX d2 | (csub0 g d1 d2) & (drop n (0) c2 (CTail d2 (Bind Abst) t)) ) \/ (EX d2 u | (csub0 g d1 d2) & (drop n (0) c2 (CTail d2 (Bind Abbr) u)) & (ty0 g d2 u t) ). XElim n. (* case 1 : n = 0 *) Intros; DropGenBase; Rewrite H0 in H; Inversion H; XEAuto. (* case 2 : n > 0 *) Intros until 2; XElim H0. (* case 2.1 : csub0_sort *) Intros; Inversion H0. (* case 2.2 : csub0_tail *) XElim k; Intros; DropGenBase. (* case 2.2.1 : Bind *) LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 t); [ Clear H; Intros H | XAuto ]. XElim H; Intros; XElim H; XEAuto. (* case 2.2.2 : Flat *) LApply (H1 d1 t); [ Clear H1; Intros H1 | XAuto ]. XElim H1; Intros; XElim H1; XEAuto. (* case 2.3 : csub0_void *) Intros; DropGenBase. LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 t); [ Clear H; Intros H | XAuto ]. XElim H; Intros; XElim H; XEAuto. (* case 2.4 : csub0_abst *) Intros; DropGenBase. LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. LApply (H d1 t0); [ Clear H; Intros H | XAuto ]. XElim H; Intros; XElim H; XEAuto. Qed. End csub0_drop. Tactic Definition CSub0Drop := Match Context With | [ H1: (csub0 ?1 ?2 ?3); H2: (drop ?4 (0) ?2 (CTail ?5 (Bind Abbr) ?6)) |- ? ] -> LApply (csub0_drop_abbr ?1 ?4 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; LApply (H1 ?5 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; XElim H1; Intros | [ H1: (csub0 ?1 ?2 ?3); H2: (drop ?4 (0) ?2 (CTail ?5 (Bind Abst) ?6)) |- ? ] -> LApply (csub0_drop_abst ?1 ?4 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; LApply (H1 ?5 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; XElim H1; Intros H1; XElim H1; Intros.