+++ /dev/null
-Require lift_props.
-Require drop_props.
-Require pc3_props.
-Require ty0_defs.
-
-(*#* #caption "main properties of typing" #clauses ty0_props *)
-
- Section ty0_lift. (*******************************************************)
-
-(*#* #caption "lift preserves types" *)
-(*#* #cap #cap t1, t2 #alpha c in C1, e in C2, d in i *)
-
- Theorem ty0_lift : (g:?; e:?; t1,t2:?) (ty0 g e t1 t2) ->
- (c:?) (wf0 g c) -> (d,h:?) (drop h d c e) ->
- (ty0 g c (lift h d t1) (lift h d t2)).
-
-(*#* #stop file *)
-
- Intros until 1; XElim H; Intros.
-(* case 1 : ty0_conv *)
- XEAuto.
-(* case 2 : ty0_sort *)
- Repeat Rewrite lift_sort; XAuto.
-(* case 3 : ty0_abbr *)
- Apply (lt_le_e n d0); Intros; DropDis.
-(* case 3.1 : n < d0 *)
- Rewrite minus_x_Sy in H4; [ Idtac | XAuto ].
- DropGenBase; Rewrite H4 in H0; Clear H4 x.
- Rewrite lift_lref_lt; [ Idtac | XAuto ].
- Arith8 d0 '(S n); Rewrite lift_d; [ Arith8' d0 '(S n) | XAuto ].
- EApply ty0_abbr; XEAuto.
-(* case 3.2 : n >= d0 *)
- Rewrite lift_lref_ge; [ Idtac | XAuto ].
- Arith7' n; Rewrite lift_free; [ Idtac | Simpl; XAuto | XAuto ].
- Rewrite (plus_sym h (S n)); Simpl; XEAuto.
-(* case 4: ty0_abst *)
- Apply (lt_le_e n d0); Intros; DropDis.
-(* case 4.1 : n < d0 *)
- Rewrite minus_x_Sy in H4; [ Idtac | XAuto ].
- DropGenBase; Rewrite H4 in H0; Clear H4 x.
- Rewrite lift_lref_lt; [ Idtac | XAuto ].
- Arith8 d0 '(S n); Rewrite lift_d; [ Arith8' d0 '(S n) | XAuto ].
- EApply ty0_abst; XEAuto.
-(* case 4.2 : n >= d0 *)
- Rewrite lift_lref_ge; [ Idtac | XAuto ].
- Arith7' n; Rewrite lift_free; [ Idtac | Simpl; XAuto | XAuto ].
- Rewrite (plus_sym h (S n)); Simpl; XEAuto.
-(* case 5: ty0_bind *)
- LiftTailRw; Simpl; EApply ty0_bind; XEAuto.
-(* case 6: ty0_appl *)
- LiftTailRw; Simpl; EApply ty0_appl; [ Idtac | Rewrite <- lift_bind ]; XEAuto.
-(* case 7: ty0_cast *)
- LiftTailRw; XEAuto.
- Qed.
-
- End ty0_lift.
-
- Hints Resolve ty0_lift : ltlc.
-
- Tactic Definition Ty0Lift b u :=
- Match Context With
- [ H: (ty0 ?1 ?2 ?3 ?4) |- ? ] ->
- LApply (ty0_lift ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ];
- LApply (H_x (CTail ?2 (Bind b) u)); [ Clear H_x; Intros H_x | XEAuto ];
- LApply (H_x (0) (1)); [ Clear H_x; Intros | XAuto ].