(*#* #stop file *) Require Export drop_defs. Require Export pr0_defs. Inductive pr2 [c:C; t1,t2:T] : Prop := (* structural rules *) | pr2_pr0 : (pr0 t1 t2) -> (pr2 c t1 t2) (* axiom rules *) | pr2_delta : (d:?; u:?; i:?) (drop i (0) c (CTail d (Bind Abbr) u)) -> (subst0 i u t1 t2) -> (pr2 c t1 t2). Hint pr2 : ltlc := Constructors pr2. Section pr2_gen_base. (***************************************************) Theorem pr2_gen_sort : (c:?; x:?; n:?) (pr2 c (TSort n) x) -> x = (TSort n). Intros; Inversion H; Try Subst0GenBase; XEAuto. Qed. Theorem pr2_gen_bref : (c:?; x:?; n:?) (pr2 c (TBRef n) x) -> x = (TBRef n) \/ (EX d u | (drop n (0) c (CTail d (Bind Abbr) u)) & x = (lift (S n) (0) u) ). Intros; Inversion H; Try Subst0GenBase; Try Rewrite <- H1 in H0; XEAuto. Qed. Theorem pr2_gen_abst : (c:?; u1,t1,x:?) (pr2 c (TTail (Bind Abst) u1 t1) x) -> (EX u2 t2 | x = (TTail (Bind Abst) u2 t2) & (pr2 c u1 u2) & (b:?; u:?) (pr2 (CTail c (Bind b) u) t1 t2) ). Intros; Inversion H; Try Pr0GenBase; Try Subst0GenBase; XDEAuto 6. Qed. Theorem pr2_gen_appl : (c:?; u1,t1,x:?) (pr2 c (TTail (Flat Appl) u1 t1) x) -> (OR (EX u2 t2 | x = (TTail (Flat Appl) u2 t2) & (pr2 c u1 u2) & (pr2 c t1 t2) ) | (EX y1 z1 u2 t2 | t1 = (TTail (Bind Abst) y1 z1) & x = (TTail (Bind Abbr) u2 t2) & (pr0 u1 u2) & (pr0 z1 t2) ) | (EX b y1 z1 u2 v2 t2 | ~b=Abst & t1 = (TTail (Bind b) y1 z1) & x = (TTail (Bind b) v2 (TTail (Flat Appl) (lift (1) (0) u2) t2)) & (pr0 u1 u2) & (pr0 y1 v2) & (pr0 z1 t2)) ). Intros; Inversion H; Try Pr0GenBase; Try Subst0GenBase; XEAuto. Qed. Theorem pr2_gen_cast : (c:?; u1,t1,x:?) (pr2 c (TTail (Flat Cast) u1 t1) x) -> (EX u2 t2 | x = (TTail (Flat Cast) u2 t2) & (pr2 c u1 u2) & (pr2 c t1 t2) ) \/ (pr0 t1 x). Intros; Inversion H; Try Pr0GenBase; Try Subst0GenBase; XEAuto. Qed. End pr2_gen_base. Tactic Definition Pr2GenBase := Match Context With | [ H: (pr2 ?1 (TTail (Bind Abst) ?2 ?3) ?4) |- ? ] -> LApply (pr2_gen_abst ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; XElim H; Intros. Section pr2_props. (******************************************************) Theorem pr2_thin_dx : (c:?; t1,t2:?) (pr2 c t1 t2) -> (u:?; f:?) (pr2 c (TTail (Flat f) u t1) (TTail (Flat f) u t2)). Intros; Inversion H; XEAuto. Qed. Theorem pr2_tail_1 : (c:?; u1,u2:?) (pr2 c u1 u2) -> (k:?; t:?) (pr2 c (TTail k u1 t) (TTail k u2 t)). Intros; Inversion H; XEAuto. Qed. Theorem pr2_tail_2 : (c:?; u,t1,t2:?; k:?) (pr2 (CTail c k u) t1 t2) -> (pr2 c (TTail k u t1) (TTail k u t2)). XElim k; Intros; (Inversion H; [ XAuto | Clear H ]; (NewInduction i; DropGenBase; [ Inversion H; XEAuto | XEAuto ])). Qed. Hints Resolve pr2_tail_2 : ltlc. Theorem pr2_shift : (i:?; c,e:?) (drop i (0) c e) -> (t1,t2:?) (pr2 c t1 t2) -> (pr2 e (app c i t1) (app c i t2)). XElim i. (* case 1 : i = 0 *) Intros. DropGenBase; Rewrite H in H0. Repeat Rewrite app_O; XAuto. (* case 2 : i > 0 *) XElim c. (* case 2.1 : CSort *) Intros; DropGenBase; Rewrite H0; XAuto. (* case 2.2 : CTail *) XElim k; Intros; Simpl; DropGenBase; XAuto. Qed. End pr2_props. Hints Resolve pr2_thin_dx pr2_tail_1 pr2_tail_2 pr2_shift : ltlc.