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
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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.