diff -r e1d4df962ac9 -r 1a3a7b3cd9bb src/HOL/Lambda/Type.thy --- a/src/HOL/Lambda/Type.thy Wed Oct 31 22:04:29 2001 +0100 +++ b/src/HOL/Lambda/Type.thy Wed Oct 31 22:05:37 2001 +0100 @@ -18,8 +18,10 @@ subsection {* Environments *} constdefs + shift :: "(nat \ 'a) \ nat \ 'a \ nat \ 'a" ("_<_:_>" [90, 0, 0] 91) + "e \ \j. if j < i then e j else if j = i then a else e (j - 1)" +syntax (symbols) 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)" lemma shift_eq [simp]: "i = j \ (e\i:T\) j = T" by (simp add: shift_def) @@ -69,11 +71,11 @@ intros Var [intro!]: "env x = T \ env \ Var x : T" Abs [intro!]: "env\0:T\ \ t : U \ env \ Abs t : (T \ U)" - App [intro!]: "env \ s : T \ U \ env \ t : T \ env \ (s \<^sub>\ t) : U" + App [intro!]: "env \ s : T \ U \ env \ t : T \ env \ (s \ t) : U" inductive_cases typing_elims [elim!]: "e \ Var i : T" - "e \ t \<^sub>\ u : T" + "e \ t \ u : T" "e \ Abs t : T" primrec @@ -86,44 +88,44 @@ subsection {* Some examples *} -lemma "e \ Abs (Abs (Abs (Var 1 \<^sub>\ (Var 2 \<^sub>\ Var 1 \<^sub>\ Var 0)))) : ?T" +lemma "e \ Abs (Abs (Abs (Var 1 \ (Var 2 \ Var 1 \ Var 0)))) : ?T" by force -lemma "e \ Abs (Abs (Abs (Var 2 \<^sub>\ Var 0 \<^sub>\ (Var 1 \<^sub>\ Var 0)))) : ?T" +lemma "e \ Abs (Abs (Abs (Var 2 \ Var 0 \ (Var 1 \ Var 0)))) : ?T" by force subsection {* n-ary function types *} lemma list_app_typeD: - "\t T. e \ t \<^sub>\\<^sub>\ ts : T \ \Ts. e \ t : Ts \ T \ e \ ts : Ts" + "\t T. e \ t \\ ts : T \ \Ts. e \ t : Ts \ T \ e \ ts : Ts" apply (induct ts) apply simp apply atomize apply simp - apply (erule_tac x = "t \<^sub>\ a" in allE) + apply (erule_tac x = "t \ a" in allE) apply (erule_tac x = T in allE) apply (erule impE) apply assumption apply (elim exE conjE) - apply (ind_cases "e \ t \<^sub>\ u : T") + apply (ind_cases "e \ t \ u : T") apply (rule_tac x = "Ta # Ts" in exI) apply simp done lemma list_app_typeE: - "e \ t \<^sub>\\<^sub>\ ts : T \ (\Ts. e \ t : Ts \ T \ e \ ts : Ts \ C) \ C" + "e \ t \\ ts : T \ (\Ts. e \ t : Ts \ T \ e \ ts : Ts \ C) \ C" by (insert list_app_typeD) fast lemma list_app_typeI: - "\t T Ts. e \ t : Ts \ T \ e \ ts : Ts \ e \ t \<^sub>\\<^sub>\ ts : T" + "\t T Ts. e \ t : Ts \ T \ e \ ts : Ts \ e \ t \\ ts : T" apply (induct ts) apply simp apply atomize apply (case_tac Ts) apply simp apply simp - apply (erule_tac x = "t \<^sub>\ a" in allE) + apply (erule_tac x = "t \ a" in allE) apply (erule_tac x = T in allE) apply (erule_tac x = lista in allE) apply (erule impE) @@ -152,11 +154,11 @@ subsection {* Lifting preserves termination and well-typedness *} lemma lift_map [simp]: - "\t. lift (t \<^sub>\\<^sub>\ ts) i = lift t i \<^sub>\\<^sub>\ map (\t. lift t i) ts" + "\t. lift (t \\ ts) i = lift t i \\ map (\t. lift t i) ts" by (induct ts) simp_all lemma subst_map [simp]: - "\t. subst (t \<^sub>\\<^sub>\ ts) u i = subst t u i \<^sub>\\<^sub>\ map (\t. subst t u i) ts" + "\t. subst (t \\ ts) u i = subst t u i \\ map (\t. subst t u i) ts" by (induct ts) simp_all lemma lift_IT [intro!]: "t \ IT \ (\i. lift t i \ IT)" @@ -206,39 +208,19 @@ apply blast done -lemma substs_lemma [rule_format]: - "e \ u : T \ \Ts. e\i:T\ \ ts : Ts \ +lemma substs_lemma: + "\Ts. e \ u : T \ e\i:T\ \ ts : Ts \ e \ (map (\t. t[u/i]) ts) : Ts" - apply (induct_tac ts) - apply (intro strip) + apply (induct ts) apply (case_tac Ts) apply simp apply simp - apply (intro strip) + apply atomize apply (case_tac Ts) apply simp apply simp apply (erule conjE) - apply (erule subst_lemma) - apply assumption - apply (rule refl) - done - -lemma substs_lemma [rule_format]: - "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) - apply simp - apply simp - apply (intro strip) - apply (case_tac Ts) - apply simp - apply simp - apply (erule conjE) - apply (erule subst_lemma) - apply assumption + apply (erule (1) subst_lemma) apply (rule refl) done @@ -250,7 +232,7 @@ apply blast apply blast apply atomize - apply (ind_cases "s \<^sub>\ t -> t'") + apply (ind_cases "s \ t -> t'") apply hypsubst apply (ind_cases "env \ Abs t : T \ U") apply (rule subst_lemma) @@ -264,13 +246,12 @@ subsection {* Additional lemmas *} -lemma app_last: "(t \<^sub>\\<^sub>\ ts) \<^sub>\ u = t \<^sub>\\<^sub>\ (ts @ [u])" +lemma app_last: "(t \\ ts) \ u = t \\ (ts @ [u])" by simp lemma subst_Var_IT: "r \ IT \ (\i j. r[Var i/j] \ IT)" apply (induct set: IT) txt {* Case @{term Var}: *} - apply atomize apply (simp (no_asm) add: subst_Var) apply ((rule conjI impI)+, @@ -297,13 +278,13 @@ done lemma Var_IT: "Var n \ IT" - apply (subgoal_tac "Var n \<^sub>\\<^sub>\ [] \ IT") + apply (subgoal_tac "Var n \\ [] \ IT") apply simp apply (rule IT.Var) apply (rule lists.Nil) done -lemma app_Var_IT: "t \ IT \ t \<^sub>\ Var i \ IT" +lemma app_Var_IT: "t \ IT \ t \ Var i \ IT" apply (induct set: IT) apply (subst app_last) apply (rule IT.Var) @@ -355,11 +336,11 @@ assume uT: "e \ u : T" { case (Var n rs) - assume nT: "e\i:T\ \ Var n \<^sub>\\<^sub>\ rs : T'" + assume nT: "e\i:T\ \ Var n \\ rs : T'" let ?ty = "{t. \T'. e\i:T\ \ t : T'}" let ?R = "\t. \e T' u i. e\i:T\ \ t : T' \ u \ IT \ e \ u : T \ t[u/i] \ IT" - show "(Var n \<^sub>\\<^sub>\ rs)[u/i] \ IT" + show "(Var n \\ rs)[u/i] \ IT" proof (cases "n = i") case True show ?thesis @@ -368,9 +349,9 @@ 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 + with nT have "e\i:T\ \ Var n \ a \\ as : T'" by simp then obtain Ts - where headT: "e\i:T\ \ Var n \<^sub>\ a : Ts \ T'" + where headT: "e\i:T\ \ Var n \ a : Ts \ T'" and argsT: "e\i:T\ \ as : Ts" by (rule list_app_typeE) from headT obtain T'' @@ -380,14 +361,14 @@ from varT True have T: "T = T'' \ Ts \ T'" by cases auto with uT have uT': "e \ u : T'' \ Ts \ T'" by simp - 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" + 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 \<^sub>\ Var 0)[a[u/i]/0] \ IT" + 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 \<^sub>\ Var 0 \ IT" by (rule app_Var_IT) - show "e\0:T''\ \ lift u 0 \<^sub>\ Var 0 : Ts \ T'" + 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') @@ -399,7 +380,7 @@ from argT uT show "e \ a[u/i] : T''" by (rule subst_lemma) simp qed - thus "u \<^sub>\ a[u/i] \ IT" by simp + 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" @@ -421,18 +402,18 @@ by (rule lists.Cons) (rule Cons) thus ?case by simp qed - thus "Var 0 \<^sub>\\<^sub>\ ?ls as \ IT" by (rule IT.Var) + thus "Var 0 \\ ?ls as \ IT" by (rule IT.Var) have "e\0:Ts \ T'\ \ Var 0 : Ts \ T'" by (rule typing.Var) simp 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'" + 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 \<^sub>\ a[u/i] : Ts \ T'" + with uT' show "e \ u \ a[u/i] : Ts \ T'" by (rule typing.App) qed with Cons True show ?thesis @@ -469,25 +450,25 @@ by fastsimp next case (Beta r a as) - 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 T: "e\i:T\ \ Abs r \ a \\ as : T'" + assume SI1: "\e T' u i. PROP ?Q (r[a/0] \\ 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]) \<^sub>\ a[u/i] \<^sub>\\<^sub>\ map (\t. t[u/i]) as \ IT" + have "Abs (r[lift u 0/Suc i]) \ a[u/i] \\ map (\t. t[u/i]) as \ IT" proof (rule IT.Beta) - have "Abs r \<^sub>\ a \<^sub>\\<^sub>\ as -> r[a/0] \<^sub>\\<^sub>\ as" + have "Abs r \ a \\ as -> r[a/0] \\ as" by (rule apps_preserves_beta) (rule beta.beta) - with T have "e\i:T\ \ r[a/0] \<^sub>\\<^sub>\ as : T'" + with T have "e\i:T\ \ r[a/0] \\ as : T'" by (rule subject_reduction) - hence "(r[a/0] \<^sub>\\<^sub>\ as)[u/i] \ IT" + hence "(r[a/0] \\ 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" + 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\i:T\ \ Abs r \<^sub>\ a : U" + from T obtain U where "e\i:T\ \ Abs r \ 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 \<^sub>\ a \<^sub>\\<^sub>\ as)[u/i] \ IT" by simp + thus "(Abs r \ a \\ as)[u/i] \ IT" by simp } qed qed @@ -506,18 +487,18 @@ show ?case by (rule IT.Lambda) next case (App T U e s t) - have "(Var 0 \<^sub>\ lift t 0)[s/0] \ IT" + have "(Var 0 \ 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 \<^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 + 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 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" + ultimately show "e\0:T \ U\ \ Var 0 \ lift t 0 : U" by (rule typing.App) qed thus ?case by simp