1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| A.Asperti, C.Sacerdoti Coen, *)
8 (* ||A|| E.Tassi, S.Zacchiroli *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 include "PTS/subst.ma".
17 (*************************** substl *****************************)
19 nlet rec substl (G:list T) (N:T) : list T ≝
22 | cons A D ⇒ ((subst_aux A (length T D) N)::(substl D N))
25 (****************************************************************)
27 naxiom A: nat → nat → Prop.
28 naxiom R: nat → nat → nat → Prop.
29 naxiom conv: T → T → Prop.
31 nlemma mah: ∀A,i. lift A i = lift_aux A 0 i.
34 ninductive TJ: list T → T → T → Prop ≝
35 | ax : ∀i,j. A i j → TJ (nil T) (Sort i) (Sort j)
36 | start: ∀G.∀A.∀i.TJ G A (Sort i) → TJ (A::G) (Rel 0) (lift A 1)
38 TJ G A B → TJ G C (Sort i) → TJ (C::G) (lift A 1) (lift B 1)
39 | prod: ∀G.∀A,B.∀i,j,k. R i j k →
40 TJ G A (Sort i) → TJ (A::G) B (Sort j) → TJ G (Prod A B) (Sort k)
42 TJ G F (Prod A B) → TJ G a A → TJ G (App F a) (subst B a)
44 TJ (A::G) b B → TJ G (Prod A B) (Sort i) → TJ G (Lambda A b) (Prod A B)
45 | conv: ∀G.∀A,B,C.∀i. conv B C →
46 TJ G A B → TJ G B (Sort i) → TJ G A C.
48 notation "hvbox(G break ⊢ A : B)" non associative with precedence 50 for @{'TJ $G $A $B}.
49 interpretation "type judgement" 'TJ G A B = (TJ G A B).
51 (* ninverter TJ_inv2 for TJ (%?%) : Prop. *)
53 (**** definitions ****)
55 ninductive Glegal (G: list T) : Prop ≝
56 glegalk : ∀A,B. G ⊢ A : B → Glegal G.
58 ninductive Gterm (G: list T) (A:T) : Prop ≝
59 | is_term: ∀B.G ⊢ A:B → Gterm G A
60 | is_type: ∀B.G ⊢ B:A → Gterm G A.
62 ninductive Gtype (G: list T) (A:T) : Prop ≝
63 gtypek: ∀i.G ⊢ A : Sort i → Gtype G A.
65 ninductive Gelement (G:list T) (A:T) : Prop ≝
66 gelementk: ∀B.G ⊢ A:B → Gtype G B → Gelement G A.
68 ninductive Tlegal (A:T) : Prop ≝
69 tlegalk: ∀G. Gterm G A → Tlegal A.
72 ndefinition Glegal ≝ λG: list T.∃A,B:T.TJ G A B .
74 ndefinition Gterm ≝ λG: list T.λA.∃B.TJ G A B ∨ TJ G B A.
76 ndefinition Gtype ≝ λG: list T.λA.∃i.TJ G A (Sort i).
78 ndefinition Gelement ≝ λG: list T.λA.∃B.TJ G A B ∨ Gtype G B.
80 ndefinition Tlegal ≝ λA:T.∃G: list T.Gterm G A.
84 ntheorem free_var1: ∀G.∀A,B,C. TJ G A B →
86 #G; #i; #j; #axij; #Gleg; ncases Gleg;
87 #A; #B; #tjAB; nelim tjAB; /2/; (* bello *) nqed.
90 ntheorem start_lemma1: ∀G.∀i,j.
91 A i j → Glegal G → G ⊢ Sort i: Sort j.
92 #G; #i; #j; #axij; #Gleg; ncases Gleg;
93 #A; #B; #tjAB; nelim tjAB; /2/;
96 ntheorem start_rel: ∀G.∀A.∀C.∀n,i,q.
97 G ⊢ C: Sort q → G ⊢ Rel n: lift A i → (C::G) ⊢ Rel (S n): lift A (S i).
98 #G; #A; #C; #n; #i; #p; #tjC; #tjn;
99 napplyS (weak G (Rel n));//. (* bello *)
101 nrewrite > (plus_n_O i);
102 nrewrite > (plus_n_Sm i O);
103 nrewrite < (lift_lift A 1 i);
104 nrewrite > (plus_n_O n); nrewrite > (plus_n_Sm n O);
105 applyS (weak G (Rel n) (lift A i) C p tjn tjC). *)
108 ntheorem start_lemma2: ∀G.
109 Glegal G → ∀n. n < |G| → G ⊢ Rel n: lift (nth n T G (Rel O)) (S n).
110 #G; #Gleg; ncases Gleg; #A; #B; #tjAB; nelim tjAB; /2/;
111 ##[#i; #j; #axij; #p; nnormalize; #abs; napply False_ind;
112 napply (absurd … abs); //;
113 ##|#G; #A; #i; #tjA; #Hind; #m; ncases m; /2/;
114 #p; #Hle; napply start_rel; //; napply Hind;
115 napply le_S_S_to_le; napply Hle;
116 ##|#G; #A; #B; #C; #i; #tjAB; #tjC; #Hind1; #_; #m; ncases m;
117 /2/; #p; #Hle; napply start_rel; //;
118 napply Hind1; napply le_S_S_to_le; napply Hle;
123 nlet rec TJm G D on D : Prop ≝
126 | cons A D1 ⇒ TJ G (Rel 0) A ∧ TJm G D1
129 nlemma tjm1: ∀G,D.∀A. TJm G (A::D) → TJ G (Rel 0) A.
130 #G; #D; #A; *; //; nqed.
132 ntheorem transitivity_tj: ∀D.∀A,B. TJ D A B →
133 ∀G. Glegal G → TJm G D → TJ G A B.
134 #D; #A; #B; #tjAB; nelim tjAB;
137 ##|#E; #T; #T0; #T1; #n; #tjT; #tjT1; #H; #H1; #G; #HlegG;
142 ntheorem substitution_tj:
143 ∀G.∀A,B,N,M.TJ (A::G) M B → TJ G N A →
144 TJ G (subst N M) (subst N B).
146 napply (TJ_inv2 (A::G) M B);
148 ##|#G; #A; #N; #tjA; #Hind; #Heq;
150 ##|#G; #A; #B; #C; #n; #tjA; #tjC; #Hind1; #Hind2; #Heq;
152 ##|nnormalize; #E; #A; #B; #i; #j; #k;
153 #Ax; #tjA; #tjB; #Hind1; #_;
154 #Heq; #HeqB; #tjN; napply (prod ?????? Ax);
156 ##|nnormalize; napplyS weak;
160 ntheorem substitution_tj:
161 ∀E.∀A,B,M. E ⊢M:B → ∀G,D.∀N. E = D@A::G → G ⊢ N:A →
162 ((substl D N)@G) ⊢ M[|D| ← N]: B[|D| ← N].
163 #E; #A; #B; #M; #tjMB; nelim tjMB;
164 ##[nnormalize; #i; #j; #k; #G; #D; #N; ncases D;
165 ##[nnormalize; #isnil; ndestruct;
166 ##|#P; #L; nnormalize; #isnil; ndestruct;
168 ##|#G; #A1; #i; #tjA; #Hind; #G1; #D; ncases D;
170 nrewrite > (delift (lift N O) A1 O O O ??); //;
171 nnormalize in Heq; ndestruct;/2/;
172 ##|#H; #L; #N1; #Heq; nnormalize in Heq;
173 #tjN1; nnormalize; ndestruct;
174 (* napplyS start non va *)
175 ncut (S (length T L) = ((length T L)+0+1)); ##[//##] #Heq;
178 ##|#G; #P; #Q; #R; #i; #tjP; #tjR; #Hind1; #Hind2;
179 #G1; #D; #N; ncases D; nnormalize;
180 ##[#Heq; ndestruct; #tjN; //;
183 (* napplyS weak non va *)
184 ncut (S (length T L) = (length T L)+0+1); ##[//##] #Heq;
187 ##|#G; #P; #Q; #i; #j; #k; #Ax; #tjP; #tjQ; #Hind1; #Hind2;
188 #G1; #D; #N; #Heq; #tjN; nnormalize;
191 ##|(* metas not found *)
192 napplyS (Hind2 G1 (P::D) N );
195 ##|#G; #P; #Q; #R; #S; #tjP; #tjS; #Hind1; #Hind2;
196 #G1; #D; #N; #Heq; #tjN; nnormalize;
202 ntheorem substitution_tj:
203 ∀E.∀A,B,M.TJ E M B → ∀G,D.∀N. E = D@A::G → TJ G N A →
205 TJ ((substl D N)@G) (subst_aux M k N) (subst_aux B k N).
206 #E; #A; #B; #M; #tjMB; nelim tjMB;
207 ##[nnormalize; (* /3/; *)
208 ##|#G; #A1; #i; #tjA; #Hind;
210 ##[#N; #Heq; #tjN; #k; nnormalize in ⊢ (% → ?); #kO;
212 nrewrite > (delift (lift N O) A1 O O O ??); //;
213 nnormalize in Heq; ndestruct;/2/;
214 ##|#H; #L; #N1; #Heq; nnormalize in Heq;
215 #tjN1; #k; #len; nnormalize in len;
217 nnormalize; ndestruct;
219 ncut (S (length T L) = S ((length T L)+0)); ##[//##] #Heq;
221 nrewrite < (lift_subst_aux_k N1 H (length T L) O);
222 nrewrite < (plus_n_O (length T L));
223 napply (start (substl L N1@G1) (subst_aux H (length T L) N1) i ?).