# HG changeset patch # User wenzelm # Date 1004091859 -7200 # Node ID a9672446b45fd0e3102f232357cc5994230c31c9 # Parent 06fac365248dc08fc5bd04b6c59184bcc40b3e3e tuned notation; diff -r 06fac365248d -r a9672446b45f src/HOL/Lambda/Lambda.thy --- a/src/HOL/Lambda/Lambda.thy Thu Oct 25 22:59:11 2001 +0200 +++ b/src/HOL/Lambda/Lambda.thy Fri Oct 26 12:24:19 2001 +0200 @@ -16,6 +16,9 @@ | App dB dB (infixl "$" 200) | Abs dB +syntax (symbols) + App :: "dB => dB => dB" (infixl "\<^sub>\" 200) + consts subst :: "[dB, dB, nat] => dB" ("_[_'/_]" [300, 0, 0] 300) lift :: "[dB, nat] => dB" diff -r 06fac365248d -r a9672446b45f src/HOL/Lambda/ListApplication.thy --- a/src/HOL/Lambda/ListApplication.thy Thu Oct 25 22:59:11 2001 +0200 +++ b/src/HOL/Lambda/ListApplication.thy Fri Oct 26 12:24:19 2001 +0200 @@ -9,7 +9,10 @@ theory ListApplication = Lambda: syntax - "_list_application" :: "dB => dB list => dB" (infixl "$$" 150) + "_list_application" :: "dB => dB list => dB" (infixl "$$" 150) +syntax (symbols) + "_list_application" :: "dB => dB => dB" (infixl "\<^sub>\\<^sub>\" 150) + translations "t $$ ts" == "foldl (op $) t ts" diff -r 06fac365248d -r a9672446b45f src/HOL/Lambda/ROOT.ML --- a/src/HOL/Lambda/ROOT.ML Thu Oct 25 22:59:11 2001 +0200 +++ b/src/HOL/Lambda/ROOT.ML Fri Oct 26 12:24:19 2001 +0200 @@ -4,6 +4,8 @@ Copyright 1998 TUM *) +Syntax.ambiguity_level := 100; + time_use_thy "Eta"; time_use_thy "Accessible_Part"; time_use_thy "Type"; diff -r 06fac365248d -r a9672446b45f src/HOL/Lambda/Type.thy --- a/src/HOL/Lambda/Type.thy Thu Oct 25 22:59:11 2001 +0200 +++ b/src/HOL/Lambda/Type.thy Fri Oct 26 12:24:19 2001 +0200 @@ -19,82 +19,90 @@ datatype type = Atom nat - | Fun type type (infixr "=>" 200) + | Fun type type (infixr "\" 200) consts - typing :: "((nat => type) \ dB \ type) set" + typing :: "((nat \ type) \ dB \ type) set" + typings :: "(nat \ type) \ dB list \ type list \ bool" syntax - "_typing" :: "[nat => type, dB, type] => bool" ("_ |- _ : _" [50,50,50] 50) - "_funs" :: "[type list, type] => type" (infixl "=>>" 150) + "_funs" :: "type list \ type \ type" (infixr "=\" 200) + "_typing" :: "(nat \ type) \ dB \ type \ bool" ("_ |- _ : _" [50, 50, 50] 50) + "_typings" :: "(nat \ type) \ dB list \ type list \ bool" + ("_ ||- _ : _" [50, 50, 50] 50) + +syntax (symbols) + "_typing" :: "(nat \ type) \ dB \ type \ bool" ("_ \ _ : _" [50, 50, 50] 50) +syntax (latex) + "_typings" :: "(nat \ type) \ dB list \ type list \ bool" + ("_ \ _ : _" [50, 50, 50] 50) translations - "env |- t : T" == "(env, t, T) \ typing" - "Ts =>> T" == "foldr Fun Ts T" + "Ts =\ T" \ "foldr Fun Ts T" + "env \ t : T" \ "(env, t, T) \ typing" + "env \ ts : Ts" \ "typings env ts Ts" inductive typing intros - Var [intro!]: "env x = T ==> env |- Var x : T" - Abs [intro!]: "(nat_case T env) |- t : U ==> env |- Abs t : (T => U)" - App [intro!]: "env |- s : T => U ==> env |- t : T ==> env |- (s $ t) : U" + Var [intro!]: "env x = T \ env \ Var x : T" + Abs [intro!]: "(nat_case T env) \ t : U \ env \ Abs t : (T \ U)" + App [intro!]: "env \ s : T \ U \ env \ t : T \ env \ (s \<^sub>\ t) : U" -constdefs - shift :: "(nat \ 'a) \ nat \ 'a \ nat \ 'a" ("_<_:_>" [50,0,0] 51) - "e == \j. if j < i then e j else if j = i then a else e (j - 1)" +inductive_cases typing_elims [elim!]: + "e \ Var i : T" + "e \ t \<^sub>\ u : T" + "e \ Abs t : T" -inductive_cases [elim!]: - "e |- Var i : T" - "e |- t $ u : T" - "e |- Abs t : T" +primrec + "(e \ [] : Ts) = (Ts = [])" + "(e \ (t # ts) : Ts) = + (case Ts of + [] \ False + | T # Ts \ e \ t : T \ e \ ts : Ts)" -consts - "types" :: "[nat => type, dB list, type list] => bool" -primrec - "types e [] Ts = (Ts = [])" - "types e (t # ts) Ts = - (case Ts of - [] => False - | T # Ts => e |- t : T \ types e ts Ts)" - -inductive_cases [elim!]: +inductive_cases lists_elim [elim!]: "x # xs \ lists S" declare IT.intros [intro!] +constdefs + shift :: "(nat \ 'a) \ nat \ 'a \ nat \ 'a" ("_\_:_\" [90, 0, 0] 91) + "e\i:a\ \ \j. if j < i then e j else if j = i then a else e (j - 1)" + subsection {* Some examples *} -lemma "e |- Abs (Abs (Abs (Var 1 $ (Var 2 $ Var 1 $ Var 0)))) : ?T" +lemma "e \ Abs (Abs (Abs (Var 1 \<^sub>\ (Var 2 \<^sub>\ Var 1 \<^sub>\ Var 0)))) : ?T" by force -lemma "e |- Abs (Abs (Abs (Var 2 $ Var 0 $ (Var 1 $ Var 0)))) : ?T" +lemma "e \ Abs (Abs (Abs (Var 2 \<^sub>\ Var 0 \<^sub>\ (Var 1 \<^sub>\ Var 0)))) : ?T" by force subsection {* @{text n}-ary function types *} lemma list_app_typeD [rule_format]: - "\t T. e |- t $$ ts : T --> (\Ts. e |- t : Ts =>> T \ types e ts Ts)" + "\t T. e \ t \<^sub>\\<^sub>\ ts : T \ (\Ts. e \ t : Ts =\ T \ e \ ts : Ts)" apply (induct_tac ts) apply simp apply (intro strip) apply simp - apply (erule_tac x = "t $ a" in allE) + apply (erule_tac x = "t \<^sub>\ a" in allE) apply (erule_tac x = T in allE) apply (erule impE) apply assumption apply (elim exE conjE) - apply (ind_cases "e |- t $ u : T") + apply (ind_cases "e \ t \<^sub>\ u : T") apply (rule_tac x = "Ta # Ts" in exI) apply simp done lemma list_app_typeE: - "e |- t $$ ts : T \ (\Ts. e |- t : Ts =>> T \ types e ts Ts \ C) \ C" + "e \ t \<^sub>\\<^sub>\ ts : T \ (\Ts. e \ t : Ts =\ T \ e \ ts : Ts \ C) \ C" by (insert list_app_typeD) fast lemma list_app_typeI [rule_format]: - "\t T Ts. e |- t : Ts =>> T --> types e ts Ts --> e |- t $$ ts : T" + "\t T Ts. e \ t : Ts =\ T \ e \ ts : Ts \ e \ t \<^sub>\\<^sub>\ ts : T" apply (induct_tac ts) apply (intro strip) apply simp @@ -102,7 +110,7 @@ apply (case_tac Ts) apply simp apply simp - apply (erule_tac x = "t $ a" in allE) + apply (erule_tac x = "t \<^sub>\ a" in allE) apply (erule_tac x = T in allE) apply (erule_tac x = lista in allE) apply (erule impE) @@ -112,8 +120,8 @@ apply blast done -lemma lists_types [rule_format]: - "\Ts. types e ts Ts --> ts \ lists {t. \T. e |- t : T}" +lemma lists_typings [rule_format]: + "\Ts. e \ ts : Ts \ ts \ lists {t. \T. e \ t : T}" apply (induct_tac ts) apply (intro strip) apply (case_tac Ts) @@ -133,15 +141,15 @@ subsection {* Lifting preserves termination and well-typedness *} lemma lift_map [simp]: - "\t. lift (t $$ ts) i = lift t i $$ map (\t. lift t i) ts" + "\t. lift (t \<^sub>\\<^sub>\ ts) i = lift t i \<^sub>\\<^sub>\ map (\t. lift t i) ts" by (induct ts) simp_all lemma subst_map [simp]: - "\t. subst (t $$ ts) u i = subst t u i $$ map (\t. subst t u i) ts" + "\t. subst (t \<^sub>\\<^sub>\ ts) u i = subst t u i \<^sub>\\<^sub>\ map (\t. subst t u i) ts" by (induct ts) simp_all lemma lift_IT [rule_format, intro!]: - "t \ IT ==> \i. lift t i \ IT" + "t \ IT \ \i. lift t i \ IT" apply (erule IT.induct) apply (rule allI) apply (simp (no_asm)) @@ -177,16 +185,16 @@ done lemma lift_type': - "e |- t : T ==> e |- lift t i : T" + "e \ t : T \ e\i:U\ \ lift t i : T" proof - - assume "e |- t : T" - thus "\i U. e |- lift t i : T" + assume "e \ t : T" + thus "\i U. e\i:U\ \ lift t i : T" by induct (auto simp add: shift_def) qed lemma lift_type [intro!]: - "e |- t : T ==> nat_case U e |- lift t 0 : T" - apply (subgoal_tac "nat_case U e = e<0:U>") + "e \ t : T \ nat_case U e \ lift t 0 : T" + apply (subgoal_tac "nat_case U e = e\0:U\") apply (erule ssubst) apply (erule lift_type') apply (rule ext) @@ -194,8 +202,8 @@ apply (simp_all add: shift_def) done -lemma lift_types [rule_format]: - "\Ts. types e ts Ts --> types (e) (map (\t. lift t i) ts) Ts" +lemma lift_typings [rule_format]: + "\Ts. e \ ts : Ts \ (e\i:U\) \ (map (\t. lift t i) ts) : Ts" apply (induct_tac ts) apply simp apply (intro strip) @@ -209,8 +217,7 @@ subsection {* Substitution lemmas *} lemma subst_lemma [rule_format]: - "e |- t : T ==> \e' i U u. e' |- u : U --> - e = e' --> e' |- t[u/i] : T" + "e \ t : T \ \e' i U u. e' \ u : U \ e = e'\i:U\ \ e' \ t[u/i] : T" apply (unfold shift_def) apply (erule typing.induct) apply (intro strip) @@ -230,8 +237,8 @@ done lemma substs_lemma [rule_format]: - "e |- u : T ==> \Ts. types (e) ts Ts --> - types e (map (\t. t[u/i]) ts) Ts" + "e \ u : T \ \Ts. (e\i:T\) \ ts : Ts \ + e \ (map (\t. t[u/i]) ts) : Ts" apply (induct_tac ts) apply (intro strip) apply (case_tac Ts) @@ -251,14 +258,14 @@ subsection {* Subject reduction *} lemma subject_reduction [rule_format]: - "e |- t : T ==> \t'. t -> t' --> e |- t' : T" + "e \ t : T \ \t'. t -> t' \ e \ t' : T" apply (erule typing.induct) apply blast apply blast apply (intro strip) - apply (ind_cases "s $ t -> t'") + apply (ind_cases "s \<^sub>\ t -> t'") apply hypsubst - apply (ind_cases "env |- Abs t : T => U") + apply (ind_cases "env \ Abs t : T \ U") apply (rule subst_lemma) apply assumption apply assumption @@ -270,10 +277,10 @@ subsection {* Additional lemmas *} -lemma app_last: "(t $$ ts) $ u = t $$ (ts @ [u])" +lemma app_last: "(t \<^sub>\\<^sub>\ ts) \<^sub>\ u = t \<^sub>\\<^sub>\ (ts @ [u])" by simp -lemma subst_Var_IT [rule_format]: "r \ IT ==> \i j. r[Var i/j] \ IT" +lemma subst_Var_IT [rule_format]: "r \ IT \ \i j. r[Var i/j] \ IT" apply (erule IT.induct) txt {* Case @{term Var}: *} apply (intro strip) @@ -303,13 +310,13 @@ done lemma Var_IT: "Var n \ IT" - apply (subgoal_tac "Var n $$ [] \ IT") + apply (subgoal_tac "Var n \<^sub>\\<^sub>\ [] \ IT") apply simp apply (rule IT.Var) apply (rule lists.Nil) done -lemma app_Var_IT: "t \ IT ==> t $ Var i \ IT" +lemma app_Var_IT: "t \ IT \ t \<^sub>\ Var i \ IT" apply (erule IT.induct) apply (subst app_last) apply (rule IT.Var) @@ -328,8 +335,8 @@ done lemma type_induct [induct type]: - "(\T. (\T1 T2. T = T1 => T2 \ P T1) \ - (\T1 T2. T = T1 => T2 \ P T2) \ P T) \ P T" + "(\T. (\T1 T2. T = T1 \ T2 \ P T1) \ + (\T1 T2. T = T1 \ T2 \ P T2) \ P T) \ P T" proof - case rule_context show ?thesis @@ -346,164 +353,164 @@ subsection {* Well-typed substitution preserves termination *} lemma subst_type_IT: - "\t e T u i. t \ IT \ e |- t : T \ - u \ IT \ e |- u : U \ t[u/i] \ IT" + "\t e T u i. t \ IT \ e\i:U\ \ t : T \ + u \ IT \ e \ u : U \ t[u/i] \ IT" (is "PROP ?P U" is "\t e T u i. _ \ PROP ?Q t e T u i U") proof (induct U) fix T t - assume MI1: "\T1 T2. T = T1 => T2 \ PROP ?P T1" - assume MI2: "\T1 T2. T = T1 => T2 \ PROP ?P T2" + assume MI1: "\T1 T2. T = T1 \ T2 \ PROP ?P T1" + assume MI2: "\T1 T2. T = T1 \ T2 \ PROP ?P T2" assume "t \ IT" thus "\e T' u i. PROP ?Q t e T' u i T" proof induct fix e T' u i - assume uIT: "u : IT" - assume uT: "e |- u : T" + assume uIT: "u \ IT" + assume uT: "e \ u : T" { case (Var n rs) - assume nT: "e |- Var n $$ rs : T'" - let ?ty = "{t. \T'. e |- t : T'}" + assume nT: "e\i:T\ \ Var n \<^sub>\\<^sub>\ rs : T'" + let ?ty = "{t. \T'. e\i:T\ \ t : T'}" let ?R = "\t. \e T' u i. - e |- t : T' \ u \ IT \ e |- u : T \ t[u/i] \ IT" - show "(Var n $$ rs)[u/i] \ IT" + e\i:T\ \ t : T' \ u \ IT \ e \ u : T \ t[u/i] \ IT" + show "(Var n \<^sub>\\<^sub>\ rs)[u/i] \ IT" proof (cases "n = i") - case True - show ?thesis - proof (cases rs) - case Nil - with uIT True show ?thesis by simp - next - case (Cons a as) - with nT have "e |- Var n $ a $$ as : T'" by simp - then obtain Ts - where headT: "e |- Var n $ a : Ts =>> T'" - and argsT: "types (e) as Ts" - by (rule list_app_typeE) - from headT obtain T'' - where varT: "e |- Var n : T'' => (Ts =>> T')" - and argT: "e |- a : T''" - by cases simp_all - from varT True have T: "T = T'' => (Ts =>> T')" - by cases (auto simp add: shift_def) - with uT have uT': "e |- u : T'' => (Ts =>> T')" by simp - from Var have SI: "?R a" by cases (simp_all add: Cons) - from T have "(Var 0 $$ map (\t. lift t 0) - (map (\t. t[u/i]) as))[(u $ a[u/i])/0] \ IT" - proof (rule MI2) - from T have "(lift u 0 $ Var 0)[a[u/i]/0] \ IT" - proof (rule MI1) - have "lift u 0 : IT" by (rule lift_IT) - thus "lift u 0 $ Var 0 \ IT" by (rule app_Var_IT) - show "e<0:T''> |- lift u 0 $ Var 0 : Ts =>> T'" - proof (rule typing.App) - show "e<0:T''> |- lift u 0 : T'' => (Ts =>> T')" - by (rule lift_type') (rule uT') - show "e<0:T''> |- Var 0 : T''" - by (rule typing.Var) (simp add: shift_def) - qed - from argT uIT uT show "a[u/i] : IT" - by (rule SI[rule_format]) - from argT uT show "e |- a[u/i] : T''" - by (rule subst_lemma) (simp add: shift_def) - qed - thus "u $ a[u/i] \ IT" by simp - from Var have "as : lists {t. ?R t}" - by cases (simp_all add: Cons) - moreover from argsT have "as : lists ?ty" - by (rule lists_types) - ultimately have "as : lists ({t. ?R t} \ ?ty)" - by (rule lists_IntI) - hence "map (\t. lift t 0) (map (\t. t[u/i]) as) \ lists IT" - (is "(?ls as) \ _") - proof induct - case Nil - show ?case by fastsimp - next - case (Cons b bs) - hence I: "?R b" by simp - from Cons obtain U where "e |- b : U" by fast - with uT uIT I have "b[u/i] : IT" by simp - hence "lift (b[u/i]) 0 : IT" by (rule lift_IT) - hence "lift (b[u/i]) 0 # ?ls bs \ lists IT" - by (rule lists.Cons) (rule Cons) - thus ?case by simp - qed - thus "Var 0 $$ ?ls as \ IT" by (rule IT.Var) - have "e<0:Ts =>> T'> |- Var 0 : Ts =>> T'" - by (rule typing.Var) (simp add: shift_def) - moreover from uT argsT have "types e (map (\t. t[u/i]) as) Ts" - by (rule substs_lemma) - hence "types (e<0:Ts =>> T'>) (?ls as) Ts" - by (rule lift_types) - ultimately show "e<0:Ts =>> T'> |- Var 0 $$ ?ls as : T'" - by (rule list_app_typeI) - from argT uT have "e |- a[u/i] : T''" - by (rule subst_lemma) (rule refl) - with uT' show "e |- u $ a[u/i] : Ts =>> T'" - by (rule typing.App) - qed - with Cons True show ?thesis - by (simp add: map_compose [symmetric] o_def) - qed + case True + show ?thesis + proof (cases rs) + case Nil + with uIT True show ?thesis by simp + next + case (Cons a as) + with nT have "e\i:T\ \ Var n \<^sub>\ a \<^sub>\\<^sub>\ as : T'" by simp + then obtain Ts + where headT: "e\i:T\ \ Var n \<^sub>\ a : Ts =\ T'" + and argsT: "(e\i:T\) \ as : Ts" + by (rule list_app_typeE) + from headT obtain T'' + where varT: "e\i:T\ \ Var n : T'' \ Ts =\ T'" + and argT: "e\i:T\ \ a : T''" + by cases simp_all + from varT True have T: "T = T'' \ Ts =\ T'" + by cases (auto simp add: shift_def) + with uT have uT': "e \ u : T'' \ Ts =\ T'" by simp + from Var have SI: "?R a" by cases (simp_all add: Cons) + from T have "(Var 0 \<^sub>\\<^sub>\ map (\t. lift t 0) + (map (\t. t[u/i]) as))[(u \<^sub>\ a[u/i])/0] \ IT" + proof (rule MI2) + from T have "(lift u 0 \<^sub>\ Var 0)[a[u/i]/0] \ IT" + proof (rule MI1) + have "lift u 0 \ IT" by (rule lift_IT) + thus "lift u 0 \<^sub>\ Var 0 \ IT" by (rule app_Var_IT) + show "e\0:T''\ \ lift u 0 \<^sub>\ Var 0 : Ts =\ T'" + proof (rule typing.App) + show "e\0:T''\ \ lift u 0 : T'' \ Ts =\ T'" + by (rule lift_type') (rule uT') + show "e\0:T''\ \ Var 0 : T''" + by (rule typing.Var) (simp add: shift_def) + qed + from argT uIT uT show "a[u/i] \ IT" + by (rule SI[rule_format]) + from argT uT show "e \ a[u/i] : T''" + by (rule subst_lemma) (simp add: shift_def) + qed + thus "u \<^sub>\ a[u/i] \ IT" by simp + from Var have "as \ lists {t. ?R t}" + by cases (simp_all add: Cons) + moreover from argsT have "as \ lists ?ty" + by (rule lists_typings) + ultimately have "as \ lists ({t. ?R t} \ ?ty)" + by (rule lists_IntI) + hence "map (\t. lift t 0) (map (\t. t[u/i]) as) \ lists IT" + (is "(?ls as) \ _") + proof induct + case Nil + show ?case by fastsimp + next + case (Cons b bs) + hence I: "?R b" by simp + from Cons obtain U where "e\i:T\ \ b : U" by fast + with uT uIT I have "b[u/i] \ IT" by simp + hence "lift (b[u/i]) 0 \ IT" by (rule lift_IT) + hence "lift (b[u/i]) 0 # ?ls bs \ lists IT" + by (rule lists.Cons) (rule Cons) + thus ?case by simp + qed + thus "Var 0 \<^sub>\\<^sub>\ ?ls as \ IT" by (rule IT.Var) + have "e\0:Ts =\ T'\ \ Var 0 : Ts =\ T'" + by (rule typing.Var) (simp add: shift_def) + moreover from uT argsT have "e \ map (\t. t[u/i]) as : Ts" + by (rule substs_lemma) + hence "(e\0:Ts =\ T'\) \ ?ls as : Ts" + by (rule lift_typings) + ultimately show "e\0:Ts =\ T'\ \ Var 0 \<^sub>\\<^sub>\ ?ls as : T'" + by (rule list_app_typeI) + from argT uT have "e \ a[u/i] : T''" + by (rule subst_lemma) (rule refl) + with uT' show "e \ u \<^sub>\ a[u/i] : Ts =\ T'" + by (rule typing.App) + qed + with Cons True show ?thesis + by (simp add: map_compose [symmetric] o_def) + qed next - case False - from Var have "rs : lists {t. ?R t}" by simp - moreover from nT obtain Ts where "types (e) rs Ts" - by (rule list_app_typeE) - hence "rs : lists ?ty" by (rule lists_types) - ultimately have "rs : lists ({t. ?R t} \ ?ty)" - by (rule lists_IntI) - hence "map (\x. x[u/i]) rs \ lists IT" - proof induct - case Nil - show ?case by fastsimp - next - case (Cons a as) - hence I: "?R a" by simp - from Cons obtain U where "e |- a : U" by fast - with uT uIT I have "a[u/i] : IT" by simp - hence "a[u/i] # map (\t. t[u/i]) as \ lists IT" - by (rule lists.Cons) (rule Cons) - thus ?case by simp - qed - with False show ?thesis by (auto simp add: subst_Var) + case False + from Var have "rs \ lists {t. ?R t}" by simp + moreover from nT obtain Ts where "(e\i:T\) \ rs : Ts" + by (rule list_app_typeE) + hence "rs \ lists ?ty" by (rule lists_typings) + ultimately have "rs \ lists ({t. ?R t} \ ?ty)" + by (rule lists_IntI) + hence "map (\x. x[u/i]) rs \ lists IT" + proof induct + case Nil + show ?case by fastsimp + next + case (Cons a as) + hence I: "?R a" by simp + from Cons obtain U where "e\i:T\ \ a : U" by fast + with uT uIT I have "a[u/i] \ IT" by simp + hence "(a[u/i] # map (\t. t[u/i]) as) \ lists IT" + by (rule lists.Cons) (rule Cons) + thus ?case by simp + qed + with False show ?thesis by (auto simp add: subst_Var) qed next case (Lambda r) - assume "e |- Abs r : T'" - and "\e T' u i. PROP ?Q r e T' u i T" + assume "e\i:T\ \ Abs r : T'" + and "\e T' u i. PROP ?Q r e T' u i T" with uIT uT show "Abs r[u/i] \ IT" - by (fastsimp simp add: shift_def) + by (fastsimp simp add: shift_def) next case (Beta r a as) - assume T: "e |- Abs r $ a $$ as : T'" - assume SI1: "\e T' u i. PROP ?Q (r[a/0] $$ as) e T' u i T" + assume T: "e\i:T\ \ Abs r \<^sub>\ a \<^sub>\\<^sub>\ as : T'" + assume SI1: "\e T' u i. PROP ?Q (r[a/0] \<^sub>\\<^sub>\ as) e T' u i T" assume SI2: "\e T' u i. PROP ?Q a e T' u i T" - have "Abs (r[lift u 0/Suc i]) $ a[u/i] $$ map (\t. t[u/i]) as \ IT" + have "Abs (r[lift u 0/Suc i]) \<^sub>\ a[u/i] \<^sub>\\<^sub>\ map (\t. t[u/i]) as \ IT" proof (rule IT.Beta) - have "Abs r $ a $$ as -> r[a/0] $$ as" - by (rule apps_preserves_beta) (rule beta.beta) - with T have "e |- r[a/0] $$ as : T'" - by (rule subject_reduction) - hence "(r[a/0] $$ as)[u/i] \ IT" - by (rule SI1) - thus "r[lift u 0/Suc i][a[u/i]/0] $$ map (\t. t[u/i]) as \ IT" - by (simp del: subst_map add: subst_subst subst_map [symmetric]) - from T obtain U where "e |- Abs r $ a : U" - by (rule list_app_typeE) fast - then obtain T'' where "e |- a : T''" by cases simp_all - thus "a[u/i] \ IT" by (rule SI2) + have "Abs r \<^sub>\ a \<^sub>\\<^sub>\ as -> r[a/0] \<^sub>\\<^sub>\ as" + by (rule apps_preserves_beta) (rule beta.beta) + with T have "e\i:T\ \ r[a/0] \<^sub>\\<^sub>\ as : T'" + by (rule subject_reduction) + hence "(r[a/0] \<^sub>\\<^sub>\ as)[u/i] \ IT" + by (rule SI1) + thus "r[lift u 0/Suc i][a[u/i]/0] \<^sub>\\<^sub>\ map (\t. t[u/i]) as \ IT" + by (simp del: subst_map add: subst_subst subst_map [symmetric]) + from T obtain U where "e\i:T\ \ Abs r \<^sub>\ a : U" + by (rule list_app_typeE) fast + then obtain T'' where "e\i:T\ \ a : T''" by cases simp_all + thus "a[u/i] \ IT" by (rule SI2) qed - thus "(Abs r $ a $$ as)[u/i] \ IT" by simp + thus "(Abs r \<^sub>\ a \<^sub>\\<^sub>\ as)[u/i] \ IT" by simp } qed qed subsection {* Well-typed terms are strongly normalizing *} -lemma type_implies_IT: "e |- t : T ==> t \ IT" +lemma type_implies_IT: "e \ t : T \ t \ IT" proof - - assume "e |- t : T" + assume "e \ t : T" thus ?thesis proof induct case Var @@ -513,27 +520,27 @@ show ?case by (rule IT.Lambda) next case (App T U e s t) - have "(Var 0 $ lift t 0)[s/0] \ IT" + have "(Var 0 \<^sub>\ lift t 0)[s/0] \ IT" proof (rule subst_type_IT) - have "lift t 0 : IT" by (rule lift_IT) - hence "[lift t 0] : lists IT" by (rule lists.Cons) (rule lists.Nil) - hence "Var 0 $$ [lift t 0] : IT" by (rule IT.Var) - also have "(Var 0 $$ [lift t 0]) = (Var 0 $ lift t 0)" by simp - finally show "\ : IT" . - have "e<0:T => U> |- Var 0 : T => U" - by (rule typing.Var) (simp add: shift_def) - moreover have "e<0:T => U> |- lift t 0 : T" - by (rule lift_type') - ultimately show "e<0:T => U> |- Var 0 $ lift t 0 : U" - by (rule typing.App) + have "lift t 0 \ IT" by (rule lift_IT) + hence "[lift t 0] \ lists IT" by (rule lists.Cons) (rule lists.Nil) + hence "Var 0 \<^sub>\\<^sub>\ [lift t 0] \ IT" by (rule IT.Var) + also have "(Var 0 \<^sub>\\<^sub>\ [lift t 0]) = (Var 0 \<^sub>\ lift t 0)" by simp + finally show "\ \ IT" . + have "e\0:T \ U\ \ Var 0 : T \ U" + by (rule typing.Var) (simp add: shift_def) + moreover have "e\0:T \ U\ \ lift t 0 : T" + by (rule lift_type') + ultimately show "e\0:T \ U\ \ Var 0 \<^sub>\ lift t 0 : U" + by (rule typing.App) qed thus ?case by simp qed qed -theorem type_implies_termi: "e |- t : T ==> t \ termi beta" +theorem type_implies_termi: "e \ t : T \ t \ termi beta" proof - - assume "e |- t : T" + assume "e \ t : T" hence "t \ IT" by (rule type_implies_IT) thus ?thesis by (rule IT_implies_termi) qed