text‹
on lecture notes by Ralph Matthes cite‹"Matthes-ESSLLI2000"›,
proof idea due to Ralph Loader cite‹Loader1998›. ›
subsection‹Standard reduction relation›
declare listrel_mono [mono_set]
inductive
sred :: "dB ==> dB ==> bool" (infixl‹→s›50) and sredlist :: "dB list ==> dB list ==> bool" (infixl‹[→s]›50) where "s [→s] t ≡ listrelp (→s) s t"
| Var: "rs [→s] rs' ==> Var x 🍋🍋 rs →s Var x 🍋🍋 rs'"
| Abs: "r →s r' ==> ss [→s] ss' ==> Abs r 🍋🍋 ss →s Abs r' 🍋🍋 ss'"
| Beta: "r[s/0] 🍋🍋 ss →s t ==> Abs r 🍋 s 🍋🍋 ss →s t"
lemma refl_listrelp: "∀x∈set xs. R x x ==> listrelp R xs xs" by (induct xs) (auto intro: listrelp.intros)
lemma refl_sred: "t →s t" by (induct t rule: Apps_dB_induct) (auto intro: refl_listrelp sred.intros)
lemma refl_sreds: "ts [→s] ts" by (simp add: refl_sred refl_listrelp)
lemma listrelp_conj1: "listrelp (λx y. R x y ∧ S x y) x y ==> listrelp R x y" by (erule listrelp.induct) (auto intro: listrelp.intros)
lemma listrelp_conj2: "listrelp (λx y. R x y ∧ S x y) x y ==> listrelp S x y" by (erule listrelp.induct) (auto intro: listrelp.intros)
lemma listrelp_app: assumes xsys: "listrelp R xs ys" shows"listrelp R xs' ys' ==> listrelp R (xs @ xs') (ys @ ys')"using xsys by (induct arbitrary: xs' ys') (auto intro: listrelp.intros)
lemma lemma1: assumes r: "r →s r'"and s: "s →s s'" shows"r 🍋 s →s r' 🍋 s'"using r proof induct case (Var rs rs' x) thenhave"rs [→s] rs'"by (rule listrelp_conj1) moreoverhave"[s] [→s] [s']"by (iprover intro: s listrelp.intros) ultimatelyhave"rs @ [s] [→s] rs' @ [s']"by (rule listrelp_app) hence"Var x 🍋🍋 (rs @ [s]) →s Var x 🍋🍋 (rs' @ [s'])"by (rule sred.Var) thus ?caseby (simp only: app_last) next case (Abs r r' ss ss') from Abs(3) have"ss [→s] ss'"by (rule listrelp_conj1) moreoverhave"[s] [→s] [s']"by (iprover intro: s listrelp.intros) ultimatelyhave"ss @ [s] [→s] ss' @ [s']"by (rule listrelp_app) with‹r →s r'›have"Abs r 🍋🍋 (ss @ [s]) →s Abs r' 🍋🍋 (ss' @ [s'])" by (rule sred.Abs) thus ?caseby (simp only: app_last) next case (Beta r u ss t) hence"r[u/0] 🍋🍋 (ss @ [s]) →s t 🍋 s'"by (simp only: app_last) hence"Abs r 🍋 u 🍋🍋 (ss @ [s]) →s t 🍋 s'"by (rule sred.Beta) thus ?caseby (simp only: app_last) qed
lemma lemma1': assumes ts: "ts [→s] ts'" shows"r →s r' ==> r 🍋🍋 ts →s r' 🍋🍋 ts'"using ts by (induct arbitrary: r r') (auto intro: lemma1)
lemma lemma2_1: assumes beta: "t →\<beta> u" shows"t →s u"using beta proof induct case (beta s t) have"Abs s 🍋 t 🍋🍋 [] →s s[t/0] 🍋🍋 []"by (iprover intro: sred.Beta refl_sred) thus ?caseby simp next case (appL s t u) thus ?caseby (iprover intro: lemma1 refl_sred) next case (appR s t u) thus ?caseby (iprover intro: lemma1 refl_sred) next case (abs s t) hence"Abs s 🍋🍋 [] →s Abs t 🍋🍋 []"by (iprover intro: sred.Abs listrelp.Nil) thus ?caseby simp qed
lemma listrelp_betas: assumes ts: "listrelp (→\<beta>*) ts ts'" shows"∧t t'. t →\<beta>* t' ==> t 🍋🍋 ts →\<beta>* t' 🍋🍋 ts'"using ts by induct auto
lemma lemma2_2: assumes t: "t →s u" shows"t →\<beta>* u"using t by induct (auto dest: listrelp_conj2
intro: listrelp_betas apps_preserves_beta converse_rtranclp_into_rtranclp)
lemma sred_lift: assumes s: "s →s t" shows"lift s i →s lift t i"using s proof (induct arbitrary: i) case (Var rs rs' x) hence"map (λt. lift t i) rs [→s] map (λt. lift t i) rs'" by induct (auto intro: listrelp.intros) thus ?caseby (cases "x < i") (auto intro: sred.Var) next case (Abs r r' ss ss') from Abs(3) have"map (λt. lift t i) ss [→s] map (λt. lift t i) ss'" by induct (auto intro: listrelp.intros) thus ?caseby (auto intro: sred.Abs Abs) next case (Beta r s ss t) thus ?caseby (auto intro: sred.Beta) qed
lemma lemma3: assumes r: "r →s r'" shows"s →s s' ==> r[s/x] →s r'[s'/x]"using r proof (induct arbitrary: s s' x) case (Var rs rs' y) hence"map (λt. t[s/x]) rs [→s] map (λt. t[s'/x]) rs'" by induct (auto intro: listrelp.intros Var) moreoverhave"Var y[s/x] →s Var y[s'/x]" proof (cases "y < x") case True thus ?thesis by simp (rule refl_sred) next case False thus ?thesis by (cases "y = x") (auto simp add: Var intro: refl_sred) qed ultimatelyshow ?caseby simp (rule lemma1') next case (Abs r r' ss ss') from Abs(4) have"lift s 0 →s lift s' 0"by (rule sred_lift) hence"r[lift s 0/Suc x] →s r'[lift s' 0/Suc x]"by (fast intro: Abs.hyps) moreoverfrom Abs(3) have"map (λt. t[s/x]) ss [→s] map (λt. t[s'/x]) ss'" by induct (auto intro: listrelp.intros Abs) ultimatelyshow ?caseby simp (rule sred.Abs) next case (Beta r u ss t) thus ?caseby (auto simp add: subst_subst intro: sred.Beta) qed
lemma lemma4_aux: assumes rs: "listrelp (λt u. t →s u ∧ (∀r. u →\<beta> r ⟶ t →s r)) rs rs'" shows"rs' => ss ==> rs [→s] ss"using rs proof (induct arbitrary: ss) case Nil thus ?caseby cases (auto intro: listrelp.Nil) next case (Cons x y xs ys) note Cons' = Cons show ?case proof (cases ss) case Nil with Cons show ?thesis by simp next case (Cons y' ys') hence ss: "ss = y' # ys'"by simp from Cons Cons' have"y →\<beta> y' ∧ ys' = ys ∨ y' = y ∧ ys => ys'"by simp hence"x # xs [→s] y' # ys'" proof assume H: "y →\<beta> y' ∧ ys' = ys" with Cons' have"x →s y'"by blast moreoverfrom Cons' have"xs [→s] ys"by (iprover dest: listrelp_conj1) ultimatelyhave"x # xs [→s] y' # ys"by (rule listrelp.Cons) with H show ?thesis by simp next assume H: "y' = y ∧ ys => ys'" with Cons' have"x →s y'"by blast moreoverfrom H have"xs [→s] ys'"by (blast intro: Cons') ultimatelyshow ?thesis by (rule listrelp.Cons) qed with ss show ?thesis by simp qed qed
lemma lemma4: assumes r: "r →s r'" shows"r' →\<beta> r'' ==> r →s r''"using r proof (induct arbitrary: r'') case (Var rs rs' x) thenobtain ss where rs: "rs' => ss"and r'': "r'' = Var x 🍋🍋 ss" by (blast dest: head_Var_reduction) from Var(1) rs have"rs [→s] ss"by (rule lemma4_aux) hence"Var x 🍋🍋 rs →s Var x 🍋🍋 ss"by (rule sred.Var) with r'' show ?caseby simp next case (Abs r r' ss ss') from‹Abs r' 🍋🍋 ss' →\β r''›show ?case proof fix s assume r'': "r'' = s 🍋🍋 ss'" assume"Abs r' →\<beta> s" thenobtain r''' where s: "s = Abs r'''"and r''': "r' →\<beta> r'''"by cases auto from r''' have"r →s r'''"by (blast intro: Abs) moreoverfrom Abs have"ss [→s] ss'"by (iprover dest: listrelp_conj1) ultimatelyhave"Abs r 🍋🍋 ss →s Abs r''' 🍋🍋 ss'"by (rule sred.Abs) with r'' s show"Abs r 🍋🍋 ss →s r''"by simp next fix rs' assume"ss' => rs'" with Abs(3) have"ss [→s] rs'"by (rule lemma4_aux) with‹r →s r'›have"Abs r 🍋🍋 ss →s Abs r' 🍋🍋 rs'"by (rule sred.Abs) moreoverassume"r'' = Abs r' 🍋🍋 rs'" ultimatelyshow"Abs r 🍋🍋 ss →s r''"by simp next fix t u' us' assume"ss' = u' # us'" with Abs(3) obtain u us where
ss: "ss = u # us"and u: "u →s u'"and us: "us [→s] us'" by cases (auto dest!: listrelp_conj1) have"r[u/0] →s r'[u'/0]"using Abs(1) and u by (rule lemma3) with us have"r[u/0] 🍋🍋 us →s r'[u'/0] 🍋🍋 us'"by (rule lemma1') hence"Abs r 🍋 u 🍋🍋 us →s r'[u'/0] 🍋🍋 us'"by (rule sred.Beta) moreoverassume"Abs r' = Abs t"and"r'' = t[u'/0] 🍋🍋 us'" ultimatelyshow"Abs r 🍋🍋 ss →s r''"using ss by simp qed next case (Beta r s ss t) show ?case by (rule sred.Beta) (rule Beta)+ qed
lemma rtrancl_beta_sred: assumes r: "r →\<beta>* r'" shows"r →s r'"using r by induct (iprover intro: refl_sred lemma4)+
subsection‹Leftmost reduction and weakly normalizing terms›
inductive
lred :: "dB ==> dB ==> bool" (infixl‹→l›50) and lredlist :: "dB list ==> dB list ==> bool" (infixl‹[→l]›50) where "s [→l] t ≡ listrelp (→l) s t"
| Var: "rs [→l] rs' ==> Var x 🍋🍋 rs →l Var x 🍋🍋 rs'"
| Abs: "r →l r' ==> Abs r →l Abs r'"
| Beta: "r[s/0] 🍋🍋 ss →l t ==> Abs r 🍋 s 🍋🍋 ss →l t"
lemma lred_imp_sred: assumes lred: "s →l t" shows"s →s t"using lred proof induct case (Var rs rs' x) thenhave"rs [→s] rs'" by induct (iprover intro: listrelp.intros)+ thenshow ?caseby (rule sred.Var) next case (Abs r r') from‹r →s r'› have"Abs r 🍋🍋 [] →s Abs r' 🍋🍋 []"using listrelp.Nil by (rule sred.Abs) thenshow ?caseby simp next case (Beta r s ss t) from‹r[s/0] 🍋🍋 ss →s t› show ?caseby (rule sred.Beta) qed
inductive WN :: "dB => bool" where
Var: "listsp WN rs ==> WN (Var n 🍋🍋 rs)"
| Lambda: "WN r ==> WN (Abs r)"
| Beta: "WN ((r[s/0]) 🍋🍋 ss) ==> WN ((Abs r 🍋 s) 🍋🍋 ss)"
lemma listrelp_imp_listsp1: assumes H: "listrelp (λx y. P x) xs ys" shows"listsp P xs"using H by induct auto
lemma listrelp_imp_listsp2: assumes H: "listrelp (λx y. P y) xs ys" shows"listsp P ys"using H by induct auto
lemma lemma6: assumes wn: "WN r" shows"∃r'. r →l r'"using wn proof induct case (Var rs n) thenhave"∃rs'. rs [→l] rs'" by induct (iprover intro: listrelp.intros)+ thenshow ?caseby (iprover intro: lred.Var) qed (iprover intro: lred.intros)+
lemma lemma7: assumes r: "r →s r'" shows"NF r' ==> r →l r'"using r proof induct case (Var rs rs' x) from‹NF (Var x 🍋🍋 rs')›have"listall NF rs'" by cases simp_all with Var(1) have"rs [→l] rs'" proof induct case Nil show ?caseby (rule listrelp.Nil) next case (Cons x y xs ys) hence"x →l y"and"xs [→l] ys"by simp_all thus ?caseby (rule listrelp.Cons) qed thus ?caseby (rule lred.Var) next case (Abs r r' ss ss') from‹NF (Abs r' 🍋🍋 ss')› have ss': "ss' = []"by (rule Abs_NF) from Abs(3) have ss: "ss = []"using ss' by cases simp_all from ss' Abs have"NF (Abs r')"by simp hence"NF r'"by cases simp_all with Abs have"r →l r'"by simp hence"Abs r →l Abs r'"by (rule lred.Abs) with ss ss' show ?caseby simp next case (Beta r s ss t) hence"r[s/0] 🍋🍋 ss →l t"by simp thus ?caseby (rule lred.Beta) qed
lemma WN_eq: "WN t = (∃t'. t →\<beta>* t' ∧ NF t')" proof assume"WN t" thenhave"∃t'. t →l t'"by (rule lemma6) thenobtain t' where t': "t →l t'" .. thenhave NF: "NF t'"by (rule lemma5) from t' have"t →s t'"by (rule lred_imp_sred) thenhave"t →\<beta>* t'"by (rule lemma2_2) with NF show"∃t'. t →\<beta>* t' ∧ NF t'"by iprover next assume"∃t'. t →\<beta>* t' ∧ NF t'" thenobtain t' where t': "t →\<beta>* t'"and NF: "NF t'" by iprover from t' have"t →s t'"by (rule rtrancl_beta_sred) thenhave"t →l t'"using NF by (rule lemma7) thenshow"WN t"by (rule lemma5) qed
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.