]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v
contribution about \lambda-\delta
[helm.git] / helm / coq-contribs / LAMBDA-TYPES / ty0_defs.v
diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v
new file mode 100644 (file)
index 0000000..d9b302a
--- /dev/null
@@ -0,0 +1,302 @@
+Require Export pc3_defs.
+
+(*#* #stop record *)
+
+      Record G : Set := {
+         f     : nat -> nat;
+         f_inc : (n:?) (lt n (f n))
+      }.
+
+(*#* #start record *)
+
+(*#* #caption "typing",
+   "well formed context sort", "well formed context binder", 
+   "conversion rule", "typed sort", "typed reference to abbreviation",
+   "typed reference to abstraction", "typed binder", "typed application", 
+   "typed cast" 
+*)
+      Inductive wf0 [g:G] : C -> Prop :=
+         | wf0_sort : (m:?) (wf0 g (CSort m))
+         | wf0_bind : (c:?; u,t:?) (ty0 g c u t) ->
+                      (b:?) (wf0 g (CTail c (Bind b) u))
+      with ty0 [g:G] : C -> T -> T -> Prop :=
+(* structural rules *)
+         | ty0_conv : (c:?; t2,t:?) (ty0 g c t2 t) ->
+                      (u,t1:?) (ty0 g c u t1) -> (pc3 c t1 t2) ->
+                      (ty0 g c u t2)
+(* axiom rules *)
+         | ty0_sort : (c:?) (wf0 g c) ->
+                      (m:?) (ty0 g c (TSort m) (TSort (f g m)))
+         | ty0_abbr : (c:?) (wf0 g c) ->
+                      (n:?; d:?; u:?) (drop n (0) c (CTail d (Bind Abbr) u)) ->
+                      (t:?) (ty0 g d u t) ->
+                      (ty0 g c (TBRef n) (lift (S n) (0) t))
+         | ty0_abst : (c:?) (wf0 g c) ->
+                      (n:?; d:?; u:?) (drop n (0) c (CTail d (Bind Abst) u)) ->
+                      (t:?) (ty0 g d u t) ->
+                      (ty0 g c (TBRef n) (lift (S n) (0) u))
+         | ty0_bind : (c:?; u,t:?) (ty0 g c u t) ->
+                      (b:?; t1,t2:?) (ty0 g (CTail c (Bind b) u) t1 t2) ->
+                      (t0:?) (ty0 g (CTail c (Bind b) u) t2 t0) ->
+                      (ty0 g c (TTail (Bind b) u t1) (TTail (Bind b) u t2))
+         | ty0_appl : (c:?; w,u:?) (ty0 g c w u) ->
+                      (v,t:?) (ty0 g c v (TTail (Bind Abst) u t)) ->
+                      (ty0 g c (TTail (Flat Appl) w v)
+                               (TTail (Flat Appl) w (TTail (Bind Abst) u t))
+                      )
+         | ty0_cast : (c:?; t1,t2:?) (ty0 g c t1 t2) ->
+                      (t0:?) (ty0 g c t2 t0) ->
+                      (ty0 g c (TTail (Flat Cast) t2 t1) t2).
+
+      Hint wf0 : ltlc := Constructors wf0.
+
+      Hint ty0 : ltlc := Constructors ty0.
+
+(*#* #caption "generation lemma of typing" #clauses ty0_gen_base *)
+
+   Section ty0_gen_base. (***************************************************)
+
+(*#* #caption "generation lemma for sort" *)
+(*#* #cap #cap c #alpha x in T, n in h *)
+
+      Theorem ty0_gen_sort: (g:?; c:?; x:?; n:?)
+                            (ty0 g c (TSort n) x) ->
+                            (pc3 c (TSort (f g n)) x).
+                            
+(*#* #stop proof *) 
+
+      Intros until 1; InsertEq H '(TSort n); XElim H; Intros.
+(* case 1 : ty0_conv *)
+      XEAuto.
+(* case 2 : ty0_sort *)
+      Inversion H0; XAuto.
+(* case 3 : ty0_abbr *)
+      Inversion H3.
+(* case 4 : ty0_abst *)
+      Inversion H3.
+(* case 5 : ty0_bind *)
+      Inversion H5.
+(* case 6 : ty0_appl *)
+      Inversion H3.
+(* case 7 : ty0_cast *)
+      Inversion H3.
+      Qed.
+
+(*#* #start proof *) 
+
+(*#* #caption "generation lemma for bound reference" *)
+(*#* #cap #cap c, e #alpha x in T, t in U, u in V, n in i *)
+
+      Theorem ty0_gen_bref: (g:?; c:?; x:?; n:?) (ty0 g c (TBRef n) x) ->
+                            (EX e u t | (pc3 c (lift (S n) (0) t) x) &
+                                        (drop n (0) c (CTail e (Bind Abbr) u)) &
+                                        (ty0 g e u t)
+                            ) \/
+                            (EX e u t | (pc3 c (lift (S n) (0) u) x) &
+                                        (drop n (0) c (CTail e (Bind Abst) u)) &
+                                        (ty0 g e u t)
+                            ).
+
+(*#* #stop proof *) 
+                            
+      Intros until 1; InsertEq H '(TBRef n); XElim H; Intros.
+(* case 1 : ty0_conv *)
+      LApply H2; [ Clear H2; Intros H2 | XAuto ].
+      XElim H2; Intros; XElim H2; XEAuto.
+(* case 2 : ty0_sort *)
+      Inversion H0.
+(* case 3 : ty0_abbr *)
+      Inversion H3 ; Rewrite H5 in H0; XEAuto.
+(* case 4 : ty0_abst *)
+      Inversion H3; Rewrite H5 in H0; XEAuto.
+(* case 5 : ty0_bind *)
+      Inversion H5.
+(* case 6 : ty0_appl *)
+      Inversion H3.
+(* case 7 : ty0_cast *)
+      Inversion H3.
+      Qed.
+
+(*#* #start proof *) 
+
+(*#* #caption "generation lemma for binder" *)
+(*#* #cap #cap c #alpha x in T, t1 in U1, t2 in U2, u in V, t in U, t0 in U3 *)
+
+      Theorem ty0_gen_bind: (g:?; b:?; c:?; u,t1,x:?) (ty0 g c (TTail (Bind b) u t1) x) ->
+                            (EX t2 t t0 | (pc3 c (TTail (Bind b) u t2) x) &
+                                          (ty0 g c u t) &
+                                          (ty0 g (CTail c (Bind b) u) t1 t2) &
+                                          (ty0 g (CTail c (Bind b) u) t2 t0)
+                            ).
+      
+(*#* #stop proof *) 
+      
+      Intros until 1; InsertEq H '(TTail (Bind b) u t1); XElim H; Intros.
+(* case 1 : ty0_conv *)
+      LApply H2; [ Clear H2; Intros H2 | XAuto ].
+      XElim H2; XEAuto.
+(* case 2 : ty0_sort *)
+      Inversion H0.
+(* case 3 : ty0_abbr *)
+      Inversion H3.
+(* case 4 : ty0_abst *)
+      Inversion H3.
+(* case 5 : ty0_bind *)
+      Inversion H5.
+      Rewrite H7 in H1; Rewrite H7 in H3.
+      Rewrite H8 in H; Rewrite H8 in H1; Rewrite H8 in H3.
+      Rewrite H9 in H1; XEAuto.
+(* case 6 : ty0_appl *)
+      Inversion H3.
+(* case 7 : ty0_cast *)
+      Inversion H3.
+      Qed.
+
+(*#* #start proof *) 
+
+(*#* #caption "generation lemma for application" *)
+(*#* #cap #cap c #alpha x in T, v in U1, w in V1, u in V2, t in U2 *)
+
+      Theorem ty0_gen_appl: (g:?; c:?; w,v,x:?) (ty0 g c (TTail (Flat Appl) w v) x) ->
+                            (EX u t | (pc3 c (TTail (Flat Appl) w (TTail (Bind Abst) u t)) x) &
+                                      (ty0 g c v (TTail (Bind Abst) u t)) &
+                                      (ty0 g c w u)
+                            ).
+                            
+(*#* #stop proof *) 
+                            
+      Intros until 1; InsertEq H '(TTail (Flat Appl) w v); XElim H; Intros.
+(* case 1 : ty0_conv *)
+      LApply H2; [ Clear H2; Intros H2 | XAuto ].
+      XElim H2; XEAuto.
+(* case 2 : ty0_sort *)
+      Inversion H0.
+(* case 3 : ty0_abbr *)
+      Inversion H3.
+(* case 4 : ty0_abst *)
+      Inversion H3.
+(* case 5 : ty0_bind *)
+      Inversion H5.
+(* case 6 : ty0_appl *)
+      Inversion H3; Rewrite H5 in H; Rewrite H6 in H1; XEAuto.
+(* case 7 : ty0_cast *)
+      Inversion H3.
+      Qed.
+
+(*#* #start proof *) 
+
+(*#* #caption "generation lemma for cast" *)
+(*#* #cap #cap c #alpha x in T, t2 in V, t1 in U *)
+
+      Theorem ty0_gen_cast: (g:?; c:?; t1,t2,x:?)
+                            (ty0 g c (TTail (Flat Cast) t2 t1) x) ->
+                            (pc3 c t2 x) /\ (ty0 g c t1 t2).
+      
+(*#* #stop proof *) 
+
+      Intros until 1; InsertEq H '(TTail (Flat Cast) t2 t1); XElim H; Intros.
+(* case 1 : ty0_conv *)
+      LApply H2; [ Clear H2; Intros H2 | XAuto ].
+      XElim H2; XEAuto.
+(* case 2 : ty0_sort *)
+      Inversion H0.
+(* case 3 : ty0_abbr *)
+      Inversion H3.
+(* case 4 : ty0_abst *)
+      Inversion H3.
+(* case 5 : ty0_bind *)
+      Inversion H5.
+(* case 6 : ty0_appl *)
+      Inversion H3.
+(* case 7 : ty0_cast *)
+      Inversion H3; Rewrite H5 in H; Rewrite H5 in H1; Rewrite H6 in H; XAuto.
+      Qed.
+
+   End ty0_gen_base.
+
+      Tactic Definition Ty0GenBase :=
+         Match Context With
+            | [ H: (ty0 ?1 ?2 (TSort ?3) ?4) |- ? ] ->
+               LApply (ty0_gen_sort ?1 ?2 ?4 ?3); [ Clear H; Intros | XAuto ]
+            | [ H: (ty0 ?1 ?2 (TBRef ?3) ?4) |- ? ] ->
+               LApply (ty0_gen_bref ?1 ?2 ?4 ?3); [ Clear H; Intros H | XAuto ];
+               XElim H; Intros H; XElim H; Intros
+            | [ H: (ty0 ?1 ?2 (TTail (Bind ?3) ?4 ?5) ?6) |- ? ] ->
+               LApply (ty0_gen_bind ?1 ?3 ?2 ?4 ?5 ?6); [ Clear H; Intros H | XAuto ];
+               XElim H; Intros
+            | [ H: (ty0 ?1 ?2 (TTail (Flat Appl) ?3 ?4) ?5) |- ? ] ->
+               LApply (ty0_gen_appl ?1 ?2 ?3 ?4 ?5); [ Clear H; Intros H | XAuto ];
+               XElim H; Intros
+            | [ H: (ty0 ?1 ?2 (TTail (Flat Cast) ?3 ?4) ?5) |- ? ] ->
+               LApply (ty0_gen_cast ?1 ?2 ?4 ?3 ?5); [ Clear H; Intros H | XAuto ];
+               XElim H; Intros.
+
+   Section wf0_props. (******************************************************)
+
+      Theorem wf0_ty0 : (g:?; c:?; u,t:?) (ty0 g c u t) -> (wf0 g c).
+      Intros; XElim H; XAuto.
+      Qed.
+
+      Hints Resolve wf0_ty0 : ltlc.
+
+      Theorem wf0_drop_O : (c,e:?; h:?) (drop h (0) c e) ->
+                           (g:?) (wf0 g c) -> (wf0 g e).
+      XElim c.
+(* case 1 : CSort *)
+      Intros; DropGenBase; Rewrite H; XAuto.
+(* case 2 : CTail k *)
+      Intros c IHc; XElim k; (
+      XElim h; Intros; DropGenBase;
+      [ Rewrite H in H0; XAuto | Inversion H1; XEAuto ] ).
+      Qed.
+
+   End wf0_props.
+
+      Hints Resolve wf0_ty0 wf0_drop_O : ltlc.
+
+      Tactic Definition Wf0Ty0 :=
+         Match Context With
+            [ _: (ty0 ?1 ?2 ?3 ?4) |- ? ] ->
+               LApply (wf0_ty0 ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ];
+               Inversion_clear H_x.
+
+      Tactic Definition Wf0DropO :=
+         Match Context With
+            | [ _: (drop ?1 (0) ?2 ?3); _: (wf0 ?4 ?2) |- ? ] ->
+               LApply (wf0_drop_O ?2 ?3 ?1); [ Intros H_x | XAuto ];
+               LApply (H_x ?4); [ Clear H_x; Intros | XAuto ].
+
+   Section wf0_facilities. (*************************************************)
+
+      Theorem wf0_drop_wf0 : (g:?; c:?) (wf0 g c) ->
+                             (b:?; e:?; u:?; h:?)
+                             (drop h (0) c (CTail e (Bind b) u)) -> (wf0 g e).
+      Intros.
+      Wf0DropO; Inversion H1; XEAuto.
+      Qed.
+
+      Theorem ty0_drop_wf0 : (g:?; c:?; t1,t2:?) (ty0 g c t1 t2) ->
+                             (b:?; e:?; u:?; h:?)
+                             (drop h (0) c (CTail e (Bind b) u)) -> (wf0 g e).
+      Intros.
+      EApply wf0_drop_wf0; [ Idtac | EApply H0 ]; XEAuto.
+      Qed.
+
+   End wf0_facilities.
+
+      Hints Resolve wf0_drop_wf0 ty0_drop_wf0 : ltlc.
+
+      Tactic Definition DropWf0 :=
+         Match Context With
+            | [ _: (ty0 ?1 ?2 ?3 ?4);
+                _: (drop ?5 (0) ?2 (CTail ?6 (Bind ?7) ?8)) |- ? ] ->
+               LApply (ty0_drop_wf0 ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ];
+               LApply (H_x ?7 ?6 ?8 ?5); [ Clear H_x; Intros | XAuto ]
+            | [ _: (wf0 ?1 ?2);
+                _: (drop ?5 (0) ?2 (CTail ?6 (Bind ?7) ?8)) |- ? ] ->
+               LApply (wf0_drop_wf0 ?1 ?2); [ Intros H_x | XAuto ];
+               LApply (H_x ?7 ?6 ?8 ?5); [ Clear H_x; Intros | XAuto ].
+
+(*#* #start file *)
+
+(*#* #single *)