subsection‹Definition of eta-reduction and relatives›
primrec
free :: "dB => nat => bool" where "free (Var j) i = (j = i)"
| "free (s 🚫 t) i = (free s i ∨ free t i)"
| "free (Abs s) i = free s (i + 1)"
inductive
eta :: "[dB, dB] => bool" (infixl‹→\η›50) where
eta [simp, intro]: "¬ free s 0 ==> Abs (s 🚫 Var 0) →\<eta> s[dummy/0]"
| appL [simp, intro]: "s →\<eta> t ==> s 🚫 u →\<eta> t 🚫 u"
| appR [simp, intro]: "s →\<eta> t ==> u 🚫 s →\<eta> u 🚫 t"
| abs [simp, intro]: "s →\<eta> t ==> Abs s →\<eta> Abs t"
abbreviation
eta_reds :: "[dB, dB] => bool" (infixl‹→\η*›50) where "s →\<eta>* t == eta** s t"
abbreviation
eta_red0 :: "[dB, dB] => bool" (infixl‹→\η=›50) where "s →\<eta>= t == eta== s t"
inductive_cases eta_cases [elim!]: "Abs s →\<eta> z" "s 🚫 t →\<eta> u" "Var i →\<eta> t"
subsection‹Properties of ‹eta›, ‹subst› and ‹free››
lemma subst_not_free [simp]: "¬ free s i ==> s[t/i] = s[u/i]" by (induct s arbitrary: i t u) (simp_all add: subst_Var)
lemma free_lift [simp]: "free (lift t k) i = (i < k ∧ free t i ∨ k < i ∧ free t (i - 1))" apply (induct t arbitrary: i k) apply (auto cong: conj_cong) done
lemma free_subst [simp]: "free (s[t/k]) i = (free s k ∧ free t i ∨ free s (if i < k then i else i + 1))" apply (induct s arbitrary: i k t) prefer2 apply simp apply blast prefer2 apply simp apply (simp add: diff_Suc subst_Var split: nat.split) done
lemma free_eta: "s →\<eta> t ==> free t i = free s i" by (induct arbitrary: i set: eta) (simp_all cong: conj_cong)
lemma not_free_eta: "[| s →\<eta> t; ¬ free s i |] ==> ¬ free t i" by (simp add: free_eta)
lemma eta_subst [simp]: "s →\<eta> t ==> s[u/i] →\<eta> t[u/i]" by (induct arbitrary: u i set: eta) (simp_all add: subst_subst [symmetric])
theorem lift_subst_dummy: "¬ free s i ==> lift (s[dummy/i]) i = s" by (induct s arbitrary: i dummy) simp_all
lemma rtrancl_eta_Abs: "s →\<eta>* s' ==> Abs s →\<eta>* Abs s'" by (induct set: rtranclp)
(blast intro: rtranclp.rtrancl_into_rtrancl)+
lemma rtrancl_eta_AppL: "s →\<eta>* s' ==> s 🚫 t →\<eta>* s' 🚫 t" by (induct set: rtranclp)
(blast intro: rtranclp.rtrancl_into_rtrancl)+
lemma rtrancl_eta_AppR: "t →\<eta>* t' ==> s 🚫 t →\<eta>* s 🚫 t'" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+
lemma rtrancl_eta_App: "[| s →\<eta>* s'; t →\<eta>* t' |] ==> s 🚫 t →\<eta>* s' 🚫 t'" by (blast intro!: rtrancl_eta_AppL rtrancl_eta_AppR intro: rtranclp_trans)
subsection‹Commutation of ‹beta› and ‹eta››
lemma free_beta: "s →\<beta> t ==> free t i ==> free s i" by (induct arbitrary: i set: beta) auto
lemma beta_subst [intro]: "s →\<beta> t ==> s[u/i] →\<beta> t[u/i]" by (induct arbitrary: u i set: beta) (simp_all add: subst_subst [symmetric])
lemma subst_Var_Suc [simp]: "t[Var i/i] = t[Var(i)/i + 1]" by (induct t arbitrary: i) (auto elim!: linorder_neqE simp: subst_Var)
lemma eta_lift [simp]: "s →\<eta> t ==> lift s i →\<eta> lift t i" by (induct arbitrary: i set: eta) simp_all
lemma rtrancl_eta_subst: "s →\<eta> t ==> u[s/i] →\<eta>* u[t/i]" apply (induct u arbitrary: s t i) apply (simp_all add: subst_Var) apply blast apply (blast intro: rtrancl_eta_App) apply (blast intro!: rtrancl_eta_Abs eta_lift) done
lemma rtrancl_eta_subst': fixes s t :: dB assumes eta: "s →\<eta>* t" shows"s[u/i] →\<eta>* t[u/i]"using eta by induct (iprover intro: eta_subst)+
lemma rtrancl_eta_subst'': fixes s t :: dB assumes eta: "s →\<eta>* t" shows"u[s/i] →\<eta>* u[t/i]"using eta by induct (iprover intro: rtrancl_eta_subst rtranclp_trans)+
theorem explicit_is_implicit: "(∀s u. (¬ free s 0) --> R (Abs (s 🚫 Var 0)) (s[u/0])) = (∀s. R (Abs (lift s 0 🚫 Var 0)) s)" by (auto simp add: not_free_iff_lifted)
subsection‹Eta-postponement theorem›
text‹
Based on a paper proof due to Andreas Abel.
Unlike the proof by Masako Takahashi cite‹"Takahashi-IandC"›, it does not
use parallel eta reduction, which only seems to complicate matters unnecessarily. ›
theorem eta_case: fixes s :: dB assumes free: "¬ free s 0" and s: "s[dummy/0] => u" shows"∃t'. Abs (s 🚫 Var 0) => t' ∧ t' →\<eta>* u" proof - from s have"lift (s[dummy/0]) 0 => lift u 0"by (simp del: lift_subst) with free have"s => lift u 0"by (simp add: lift_subst_dummy del: lift_subst) hence"Abs (s 🚫 Var 0) => Abs (lift u 0 🚫 Var 0)"by simp moreoverhave"¬ free (lift u 0) 0"by simp hence"Abs (lift u 0 🚫 Var 0) →\<eta> lift u 0[dummy/0]" by (rule eta.eta) hence"Abs (lift u 0 🚫 Var 0) →\<eta>* u" by simp
ultimately show ?thesis by iprover
qed
theorem eta_par_beta:
assumes st: "s \<rightarrow>\<^sub>\<eta> t" and tu: "t => u"
shows "\<exists>t'. s => t' \<and> t' \<rightarrow>\<^sub>\<eta>\<^sup>* u"using tu st
proof (induct arbitrary: s) case (var n)
thus ?case by (iprover intro: par_beta_refl)
next case (abs s' t)
note abs' = this
from \<open>s \<rightarrow>\<^sub>\<eta> Abs s'\<close> show ?case
proof cases case (eta s'' dummy)
from abs have "Abs s' => Abs t" by simp
with eta have "s''[dummy/0] => Abs t" by simp
with \<open>\<not> free s''0\<close> have "\<exists>t'. Abs (s'' \<degree> Var 0) => t' \<and> t' \<rightarrow>\<^sub>\<eta>\<^sup>* Abs t"
by (rule eta_case)
with eta show ?thesis by simp
next case (abs r)
from \<open>r \<rightarrow>\<^sub>\<eta> s'\<close>
obtain t' where r: "r => t'" and t': "t' \<rightarrow>\<^sub>\<eta>\<^sup>* t" by (iprover dest: abs')
from r have "Abs r => Abs t'" ..
moreover from t' have "Abs t' \<rightarrow>\<^sub>\<eta>\<^sup>* Abs t" by (rule rtrancl_eta_Abs)
ultimately show ?thesis using abs by simp iprover
qed
next case (app u u' t t')
from \<open>s \<rightarrow>\<^sub>\<eta> u \<degree> t\<close> show ?case
proof cases case (eta s' dummy)
from app have "u \<degree> t => u' \<degree> t'" by simp
with eta have "s'[dummy/0] => u' \<degree> t'" by simp
with \<open>\<not> free s' 0\<close> have "\<exists>r. Abs (s' \<degree> Var 0) => r \<and> r \<rightarrow>\<^sub>\<eta>\<^sup>* u' \<degree> t'"
by (rule eta_case)
with eta show ?thesis by simp
next case (appL s')
from \<open>s' \<rightarrow>\<^sub>\<eta> u\<close>
obtain r where s': "s' => r" and r: "r \<rightarrow>\<^sub>\<eta>\<^sup>* u'" by (iprover dest: app)
from s' and app have "s' \<degree> t => r \<degree> t'" by simp
moreover from r have "r \<degree> t' \<rightarrow>\<^sub>\<eta>\<^sup>* u' \<degree> t'" by (simp add: rtrancl_eta_AppL)
ultimately show ?thesis using appL by simp iprover
next case (appR s')
from \<open>s' \<rightarrow>\<^sub>\<eta> t\<close>
obtain r where s': "s' => r" and r: "r \<rightarrow>\<^sub>\<eta>\<^sup>* t'" by (iprover dest: app)
from s' and app have "u \<degree> s' => u' \<degree> r" by simp
moreover from r have "u' \<degree> r \<rightarrow>\<^sub>\<eta>\<^sup>* u' \<degree> t'" by (simp add: rtrancl_eta_AppR)
ultimately show ?thesis using appR by simp iprover
qed
next case (beta u u' t t')
from \<open>s \<rightarrow>\<^sub>\<eta> Abs u \<degree> t\<close> show ?case
proof cases case (eta s' dummy)
from beta have "Abs u \<degree> t => u'[t'/0]" by simp
with eta have "s'[dummy/0] => u'[t'/0]" by simp
with \<open>\<not> free s' 0\<close> have "\<exists>r. Abs (s' \<degree> Var 0) => r \<and> r \<rightarrow>\<^sub>\<eta>\<^sup>* u'[t'/0]"
by (rule eta_case)
with eta show ?thesis by simp
next case (appL s')
from \<open>s' \<rightarrow>\<^sub>\<eta> Abs u\<close> show ?thesis
proof cases case (eta s'' dummy)
have "Abs (lift u 1) = lift (Abs u) 0" by simp
also from eta have "\<dots> = s''" by (simp add: lift_subst_dummy del: lift_subst)
finally have s: "s = Abs (Abs (lift u 1) \<degree> Var 0) \<degree> t"using appL and eta by simp
from beta have "lift u 1 => lift u' 1" by simp
hence "Abs (lift u 1) \<degree> Var 0 => lift u' 1[Var 0/0]" using par_beta.var ..
hence "Abs (Abs (lift u 1) \<degree> Var 0) \<degree> t => lift u' 1[Var 0/0][t'/0]" using \<open>t => t'\<close> ..
with s have "s => u'[t'/0]" by simp
thus ?thesis by iprover
next case (abs r)
from \<open>r \<rightarrow>\<^sub>\<eta> u\<close>
obtain r'' where r: "r => r''"and r'': "r'' \<rightarrow>\<^sub>\<eta>\<^sup>* u'" by (iprover dest: beta)
from r and beta have "Abs r \<degree> t => r''[t'/0]" by simp
moreover from r'' have "r''[t'/0] \<rightarrow>\<^sub>\<eta>\<^sup>* u'[t'/0]"
by (rule rtrancl_eta_subst')
ultimately show ?thesis using abs and appL by simp iprover
qed
next case (appR s')
from \<open>s' \<rightarrow>\<^sub>\<eta> t\<close>
obtain r where s': "s' => r" and r: "r \<rightarrow>\<^sub>\<eta>\<^sup>* t'" by (iprover dest: beta)
from s' and beta have "Abs u \<degree> s' => u'[r/0]" by simp
moreover from r have "u'[r/0] \<rightarrow>\<^sub>\<eta>\<^sup>* u'[t'/0]"
by (rule rtrancl_eta_subst'')
ultimately show ?thesis using appR by simp iprover
qed
qed
theorem eta_postponement':
assumes eta: "s \<rightarrow>\<^sub>\<eta>\<^sup>* t"and beta: "t => u"
shows "\<exists>t'. s => t' \<and> t' \<rightarrow>\<^sub>\<eta>\<^sup>* u"using eta beta
proof (induct arbitrary: u) case base
thus ?case by blast
next case (step s' s'' s''')
then obtain t' where s': "s' => t'"and t': "t' \<rightarrow>\<^sub>\<eta>\<^sup>* s'''"
by (auto dest: eta_par_beta)
from s' obtain t'' where s: "s => t''" and t'': "t'' \<rightarrow>\<^sub>\<eta>\<^sup>* t'" using step
by blast
from t''and t' have "t'' \<rightarrow>\<^sub>\<eta>\<^sup>* s'''" by (rule rtranclp_trans)
with s show ?case by iprover
qed
theorem eta_postponement:
assumes "(sup beta eta)\<^sup>*\<^sup>* s t"
shows "(beta\<^sup>*\<^sup>* OO eta\<^sup>*\<^sup>*) s t"using assms
proof induct case base
show ?case by blast
next case (step s' s'')
from step(3) obtain t' where s: "s \<rightarrow>\<^sub>\<beta>\<^sup>* t'" and t': "t' \<rightarrow>\<^sub>\<eta>\<^sup>* s'" by blast
from step(2) show ?case
proof
assume "s' \<rightarrow>\<^sub>\<beta> s''"
with beta_subset_par_beta have "s' => s''" ..
with t' obtain t'' where st: "t' => t''" and tu: "t'' \<rightarrow>\<^sub>\<eta>\<^sup>* s''"
by (auto dest: eta_postponement')
from par_beta_subset_beta st have "t' \<rightarrow>\<^sub>\<beta>\<^sup>* t''" ..
with s have "s \<rightarrow>\<^sub>\<beta>\<^sup>* t''" by (rule rtranclp_trans)
thus ?thesis using tu ..
next
assume "s' \<rightarrow>\<^sub>\<eta> s''"
with t' have "t' \<rightarrow>\<^sub>\<eta>\<^sup>* s''" ..
with s show ?thesis ..
qed
qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-08-25)
¤
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.