# HG changeset patch # User berghofe # Date 1133525412 -3600 # Node ID eb3a7d3d874b74f560eb7df8a1918ee5594c1bfd # Parent 444f16d232a2200be135b3712e67745a4f55fb50 Factored out proof for normalization of applications (norm_list). diff -r 444f16d232a2 -r eb3a7d3d874b src/HOL/Lambda/WeakNorm.thy --- a/src/HOL/Lambda/WeakNorm.thy Fri Dec 02 08:06:59 2005 +0100 +++ b/src/HOL/Lambda/WeakNorm.thy Fri Dec 02 13:10:12 2005 +0100 @@ -176,6 +176,51 @@ subsection {* Main theorems *} +lemma norm_list: + assumes f_compat: "\t t'. t \\<^sub>\\<^sup>* t' \ f t \\<^sub>\\<^sup>* f t'" + and f_NF: "\t. t \ NF \ f t \ NF" + and uNF: "u \ NF" and uT: "e \ u : T" + shows "\Us. e\i:T\ \ as : Us \ + listall (\t. \e T' u i. e\i:T\ \ t : T' \ + u \ NF \ e \ u : T \ (\t'. t[u/i] \\<^sub>\\<^sup>* t' \ t' \ NF)) as \ + \as'. \j. Var j \\ map (\t. f (t[u/i])) as \\<^sub>\\<^sup>* + Var j \\ map f as' \ Var j \\ map f as' \ NF" + (is "\Us. _ \ listall ?R as \ \as'. ?ex Us as as'") +proof (induct as rule: rev_induct) + case (Nil Us) + with Var_NF have "?ex Us [] []" by simp + thus ?case .. +next + case (snoc b bs Us) + have "e\i:T\ \ bs @ [b] : Us" . + then obtain Vs W where Us: "Us = Vs @ [W]" + and bs: "e\i:T\ \ bs : Vs" and bT: "e\i:T\ \ b : W" + by (rule types_snocE) + from snoc have "listall ?R bs" by simp + with bs have "\bs'. ?ex Vs bs bs'" by (rule snoc) + then obtain bs' where + bsred: "\j. Var j \\ map (\t. f (t[u/i])) bs \\<^sub>\\<^sup>* Var j \\ map f bs'" + and bsNF: "\j. Var j \\ map f bs' \ NF" by iprover + from snoc have "?R b" by simp + with bT and uNF and uT have "\b'. b[u/i] \\<^sub>\\<^sup>* b' \ b' \ NF" + by iprover + then obtain b' where bred: "b[u/i] \\<^sub>\\<^sup>* b'" and bNF: "b' \ NF" + by iprover + from bsNF [of 0] have "listall (\t. t \ NF) (map f bs')" + by (rule App_NF_D) + moreover have "f b' \ NF" by (rule f_NF) + ultimately have "listall (\t. t \ NF) (map f (bs' @ [b']))" + by simp + hence "\j. Var j \\ map f (bs' @ [b']) \ NF" by (rule NF.App) + moreover from bred have "f (b[u/i]) \\<^sub>\\<^sup>* f b'" + by (rule f_compat) + with bsred have + "\j. (Var j \\ map (\t. f (t[u/i])) bs) \ f (b[u/i]) \\<^sub>\\<^sup>* + (Var j \\ map f bs') \ f b'" by (rule rtrancl_beta_App) + ultimately have "?ex Us (bs @ [b]) (bs' @ [b'])" by simp + thus ?case .. +qed + lemma subst_type_NF: "\t e T u i. t \ NF \ e\i:U\ \ t : T \ u \ NF \ e \ u : U \ \t'. t[u/i] \\<^sub>\\<^sup>* t' \ t' \ NF" (is "PROP ?P U" is "\t e T u i. _ \ PROP ?Q t e T u i U") @@ -191,7 +236,11 @@ fix e T' u i assume uNF: "u \ NF" and uT: "e \ u : T" { case (App ts x e_ T'_ u_ i_) - assume appT: "e\i:T\ \ Var x \\ ts : T'" + assume "e\i:T\ \ Var x \\ ts : T'" + then obtain Us + where varT: "e\i:T\ \ Var x : Us \ T'" + and argsT: "e\i:T\ \ ts : Us" + by (rule var_app_typesE) from nat_eq_dec show "\t'. (Var x \\ ts)[u/i] \\<^sub>\\<^sup>* t' \ t' \ NF" proof assume eq: "x = i" @@ -202,59 +251,20 @@ with Nil and uNF show ?thesis by simp iprover next case (Cons a as) - with appT have "e\i:T\ \ Var x \\ (a # as) : T'" by simp - then obtain Us - where varT': "e\i:T\ \ Var x : Us \ T'" - and argsT': "e\i:T\ \ a # as : Us" - by (rule var_app_typesE) - from argsT' obtain T'' Ts where Us: "Us = T'' # Ts" + with argsT obtain T'' Ts where Us: "Us = T'' # Ts" by (cases Us) (rule FalseE, simp+) - from varT' and Us have varT: "e\i:T\ \ Var x : T'' \ Ts \ T'" + from varT and Us have varT: "e\i:T\ \ Var x : T'' \ Ts \ T'" by simp from varT eq have T: "T = T'' \ Ts \ T'" by cases auto with uT have uT': "e \ u : T'' \ Ts \ T'" by simp - from argsT' and Us have argsT: "e\i:T\ \ as : Ts" by simp - from argsT' and Us have argT: "e\i:T\ \ a : T''" by simp + from argsT Us Cons have argsT': "e\i:T\ \ as : Ts" by simp + from argsT Us Cons have argT: "e\i:T\ \ a : T''" by simp from argT uT refl have aT: "e \ a[u/i] : T''" by (rule subst_lemma) - have as: "\Us. e\i:T\ \ as : Us \ listall ?R as \ - \as'. Var 0 \\ map (\t. lift (t[u/i]) 0) as \\<^sub>\\<^sup>* - Var 0 \\ map (\t. lift t 0) as' \ - Var 0 \\ map (\t. lift t 0) as' \ NF" - (is "\Us. _ \ _ \ \as'. ?ex Us as as'") - proof (induct as rule: rev_induct) - case (Nil Us) - with Var_NF have "?ex Us [] []" by simp - thus ?case .. - next - case (snoc b bs Us) - have "e\i:T\ \ bs @ [b] : Us" . - then obtain Vs W where Us: "Us = Vs @ [W]" - and bs: "e\i:T\ \ bs : Vs" and bT: "e\i:T\ \ b : W" by (rule types_snocE) - from snoc have "listall ?R bs" by simp - with bs have "\bs'. ?ex Vs bs bs'" by (rule snoc) - then obtain bs' where - bsred: "Var 0 \\ map (\t. lift (t[u/i]) 0) bs \\<^sub>\\<^sup>* - Var 0 \\ map (\t. lift t 0) bs'" - and bsNF: "Var 0 \\ map (\t. lift t 0) bs' \ NF" by iprover - from snoc have "?R b" by simp - with bT and uNF and uT have "\b'. b[u/i] \\<^sub>\\<^sup>* b' \ b' \ NF" by iprover - then obtain b' where bred: "b[u/i] \\<^sub>\\<^sup>* b'" and bNF: "b' \ NF" by iprover - from bsNF have "listall (\t. t \ NF) (map (\t. lift t 0) bs')" - by (rule App_NF_D) - moreover have "lift b' 0 \ NF" by (rule lift_NF) - ultimately have "listall (\t. t \ NF) (map (\t. lift t 0) (bs' @ [b']))" - by simp - hence "Var 0 \\ map (\t. lift t 0) (bs' @ [b']) \ NF" by (rule NF.App) - moreover from bred have "lift (b[u/i]) 0 \\<^sub>\\<^sup>* lift b' 0" - by (rule lift_preserves_beta') - with bsred have - "(Var 0 \\ map (\t. lift (t[u/i]) 0) bs) \ lift (b[u/i]) 0 \\<^sub>\\<^sup>* - (Var 0 \\ map (\t. lift t 0) bs') \ lift b' 0" by (rule rtrancl_beta_App) - ultimately have "?ex Us (bs @ [b]) (bs' @ [b'])" by simp - thus ?case .. - qed from App and Cons have "listall ?R as" by simp (iprover dest: listall_conj2) - with argsT have "\as'. ?ex Ts as as'" by (rule as) + with lift_preserves_beta' lift_NF uNF uT argsT' + have "\as'. \j. Var j \\ map (\t. lift (t[u/i]) 0) as \\<^sub>\\<^sup>* + Var j \\ map (\t. lift t 0) as' \ + Var j \\ map (\t. lift t 0) as' \ NF" by (rule norm_list) then obtain as' where asred: "Var 0 \\ map (\t. lift (t[u/i]) 0) as \\<^sub>\\<^sup>* Var 0 \\ map (\t. lift t 0) as'" @@ -291,7 +301,7 @@ have "e\0:Ts \ T'\ \ Var 0 \\ map (\t. lift (t[u/i]) 0) as : T'" proof (rule list_app_typeI) show "e\0:Ts \ T'\ \ Var 0 : Ts \ T'" by (rule typing.Var) simp - from uT argsT have "e \ map (\t. t[u/i]) as : Ts" + from uT argsT' have "e \ map (\t. t[u/i]) as : Ts" by (rule substs_lemma) hence "e\0:Ts \ T'\ \ map (\t. lift t 0) (map (\t. t[u/i]) as) : Ts" by (rule lift_types) @@ -319,53 +329,19 @@ qed next assume neq: "x \ i" - show ?thesis - proof - - from appT obtain Us - where varT: "e\i:T\ \ Var x : Us \ T'" - and argsT: "e\i:T\ \ ts : Us" - by (rule var_app_typesE) - have ts: "\Us. e\i:T\ \ ts : Us \ listall ?R ts \ - \ts'. \x'. Var x' \\ map (\t. t[u/i]) ts \\<^sub>\\<^sup>* Var x' \\ ts' \ - Var x' \\ ts' \ NF" - (is "\Us. _ \ _ \ \ts'. ?ex Us ts ts'") - proof (induct ts rule: rev_induct) - case (Nil Us) - with Var_NF have "?ex Us [] []" by simp - thus ?case .. - next - case (snoc b bs Us) - have "e\i:T\ \ bs @ [b] : Us" . - then obtain Vs W where Us: "Us = Vs @ [W]" - and bs: "e\i:T\ \ bs : Vs" and bT: "e\i:T\ \ b : W" by (rule types_snocE) - from snoc have "listall ?R bs" by simp - with bs have "\bs'. ?ex Vs bs bs'" by (rule snoc) - then obtain bs' where - bsred: "\x'. Var x' \\ map (\t. t[u/i]) bs \\<^sub>\\<^sup>* Var x' \\ bs'" - and bsNF: "\x'. Var x' \\ bs' \ NF" by iprover - from snoc have "?R b" by simp - with bT and uNF and uT have "\b'. b[u/i] \\<^sub>\\<^sup>* b' \ b' \ NF" by iprover - then obtain b' where bred: "b[u/i] \\<^sub>\\<^sup>* b'" and bNF: "b' \ NF" by iprover - from bsred bred have "\x'. (Var x' \\ map (\t. t[u/i]) bs) \ b[u/i] \\<^sub>\\<^sup>* - (Var x' \\ bs') \ b'" by (rule rtrancl_beta_App) - moreover from bsNF [of 0] have "listall (\t. t \ NF) bs'" - by (rule App_NF_D) - with bNF have "listall (\t. t \ NF) (bs' @ [b'])" by simp - hence "\x'. Var x' \\ (bs' @ [b']) \ NF" by (rule NF.App) - ultimately have "?ex Us (bs @ [b]) (bs' @ [b'])" by simp - thus ?case .. - qed - from App have "listall ?R ts" by (iprover dest: listall_conj2) - with argsT have "\ts'. ?ex Ts ts ts'" by (rule ts) - then obtain ts' where NF: "?ex Ts ts ts'" .. - from nat_le_dec show ?thesis - proof - assume "i < x" - with NF show ?thesis by simp iprover - next - assume "\ (i < x)" - with NF neq show ?thesis by (simp add: subst_Var) iprover - qed + from App have "listall ?R ts" by (iprover dest: listall_conj2) + with TrueI TrueI uNF uT argsT + have "\ts'. \j. Var j \\ map (\t. t[u/i]) ts \\<^sub>\\<^sup>* Var j \\ ts' \ + Var j \\ ts' \ NF" (is "\ts'. ?ex ts'") + by (rule norm_list [of "\t. t", simplified]) + then obtain ts' where NF: "?ex ts'" .. + from nat_le_dec show ?thesis + proof + assume "i < x" + with NF show ?thesis by simp iprover + next + assume "\ (i < x)" + with NF neq show ?thesis by (simp add: subst_Var) iprover qed qed next