equal
deleted
inserted
replaced
91 |
91 |
92 lemma "e \<turnstile> Abs (Abs (Abs (Var 2 \<^sub>\<degree> Var 0 \<^sub>\<degree> (Var 1 \<^sub>\<degree> Var 0)))) : ?T" |
92 lemma "e \<turnstile> Abs (Abs (Abs (Var 2 \<^sub>\<degree> Var 0 \<^sub>\<degree> (Var 1 \<^sub>\<degree> Var 0)))) : ?T" |
93 by force |
93 by force |
94 |
94 |
95 |
95 |
96 subsection {* @{text n}-ary function types *} |
96 subsection {* n-ary function types *} |
97 |
97 |
98 lemma list_app_typeD [rule_format]: |
98 lemma list_app_typeD [rule_format]: |
99 "\<forall>t T. e \<turnstile> t \<^sub>\<degree>\<^sub>\<degree> ts : T \<longrightarrow> (\<exists>Ts. e \<turnstile> t : Ts \<Rrightarrow> T \<and> e \<tturnstile> ts : Ts)" |
99 "\<forall>t T. e \<turnstile> t \<^sub>\<degree>\<^sub>\<degree> ts : T \<longrightarrow> (\<exists>Ts. e \<turnstile> t : Ts \<Rrightarrow> T \<and> e \<tturnstile> ts : Ts)" |
100 apply (induct_tac ts) |
100 apply (induct_tac ts) |
101 apply simp |
101 apply simp |
191 thus "\<And>i U. e\<langle>i:U\<rangle> \<turnstile> lift t i : T" |
191 thus "\<And>i U. e\<langle>i:U\<rangle> \<turnstile> lift t i : T" |
192 by induct auto |
192 by induct auto |
193 qed |
193 qed |
194 |
194 |
195 lemma lift_typings [rule_format]: |
195 lemma lift_typings [rule_format]: |
196 "\<forall>Ts. e \<tturnstile> ts : Ts \<longrightarrow> (e\<langle>i:U\<rangle>) \<tturnstile> (map (\<lambda>t. lift t i) ts) : Ts" |
196 "\<forall>Ts. e \<tturnstile> ts : Ts \<longrightarrow> e\<langle>i:U\<rangle> \<tturnstile> (map (\<lambda>t. lift t i) ts) : Ts" |
197 apply (induct_tac ts) |
197 apply (induct_tac ts) |
198 apply simp |
198 apply simp |
199 apply (intro strip) |
199 apply (intro strip) |
200 apply (case_tac Ts) |
200 apply (case_tac Ts) |
201 apply auto |
201 apply auto |
212 apply auto |
212 apply auto |
213 apply blast |
213 apply blast |
214 done |
214 done |
215 |
215 |
216 lemma substs_lemma [rule_format]: |
216 lemma substs_lemma [rule_format]: |
217 "e \<turnstile> u : T \<Longrightarrow> \<forall>Ts. (e\<langle>i:T\<rangle>) \<tturnstile> ts : Ts \<longrightarrow> |
217 "e \<turnstile> u : T \<Longrightarrow> \<forall>Ts. e\<langle>i:T\<rangle> \<tturnstile> ts : Ts \<longrightarrow> |
218 e \<tturnstile> (map (\<lambda>t. t[u/i]) ts) : Ts" |
218 e \<tturnstile> (map (\<lambda>t. t[u/i]) ts) : Ts" |
219 apply (induct_tac ts) |
219 apply (induct_tac ts) |
220 apply (intro strip) |
220 apply (intro strip) |
221 apply (case_tac Ts) |
221 apply (case_tac Ts) |
222 apply simp |
222 apply simp |
368 and argT: "e\<langle>i:T\<rangle> \<turnstile> a : T''" |
368 and argT: "e\<langle>i:T\<rangle> \<turnstile> a : T''" |
369 by cases simp_all |
369 by cases simp_all |
370 from varT True have T: "T = T'' \<Rightarrow> Ts \<Rrightarrow> T'" |
370 from varT True have T: "T = T'' \<Rightarrow> Ts \<Rrightarrow> T'" |
371 by cases auto |
371 by cases auto |
372 with uT have uT': "e \<turnstile> u : T'' \<Rightarrow> Ts \<Rrightarrow> T'" by simp |
372 with uT have uT': "e \<turnstile> u : T'' \<Rightarrow> Ts \<Rrightarrow> T'" by simp |
373 from Var have SI: "?R a" by cases (simp_all add: Cons) |
|
374 from T have "(Var 0 \<^sub>\<degree>\<^sub>\<degree> map (\<lambda>t. lift t 0) |
373 from T have "(Var 0 \<^sub>\<degree>\<^sub>\<degree> map (\<lambda>t. lift t 0) |
375 (map (\<lambda>t. t[u/i]) as))[(u \<^sub>\<degree> a[u/i])/0] \<in> IT" |
374 (map (\<lambda>t. t[u/i]) as))[(u \<^sub>\<degree> a[u/i])/0] \<in> IT" |
376 proof (rule MI2) |
375 proof (rule MI2) |
377 from T have "(lift u 0 \<^sub>\<degree> Var 0)[a[u/i]/0] \<in> IT" |
376 from T have "(lift u 0 \<^sub>\<degree> Var 0)[a[u/i]/0] \<in> IT" |
378 proof (rule MI1) |
377 proof (rule MI1) |
383 show "e\<langle>0:T''\<rangle> \<turnstile> lift u 0 : T'' \<Rightarrow> Ts \<Rrightarrow> T'" |
382 show "e\<langle>0:T''\<rangle> \<turnstile> lift u 0 : T'' \<Rightarrow> Ts \<Rrightarrow> T'" |
384 by (rule lift_type) (rule uT') |
383 by (rule lift_type) (rule uT') |
385 show "e\<langle>0:T''\<rangle> \<turnstile> Var 0 : T''" |
384 show "e\<langle>0:T''\<rangle> \<turnstile> Var 0 : T''" |
386 by (rule typing.Var) simp |
385 by (rule typing.Var) simp |
387 qed |
386 qed |
388 from argT uIT uT show "a[u/i] \<in> IT" |
387 from Var have "?R a" by cases (simp_all add: Cons) |
389 by (rule SI[rule_format]) |
388 with argT uIT uT show "a[u/i] \<in> IT" by simp |
390 from argT uT show "e \<turnstile> a[u/i] : T''" |
389 from argT uT show "e \<turnstile> a[u/i] : T''" |
391 by (rule subst_lemma) simp |
390 by (rule subst_lemma) simp |
392 qed |
391 qed |
393 thus "u \<^sub>\<degree> a[u/i] \<in> IT" by simp |
392 thus "u \<^sub>\<degree> a[u/i] \<in> IT" by simp |
394 from Var have "as \<in> lists {t. ?R t}" |
393 from Var have "as \<in> lists {t. ?R t}" |