src/HOL/Lambda/Type.thy
changeset 11950 9bd6e8e62a06
parent 11947 013d52bb0000
child 11987 bf31b35949ce
equal deleted inserted replaced
11949:38e20c036e37 11950:9bd6e8e62a06
    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}"