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 ultimatelyshow ?thesis by iprover qed
theorem eta_par_beta: assumes st: "s →\<eta> t" and tu: "t => u" shows"∃t'. s => t' ∧ t' →\<eta>* u"using tu st proof (induct arbitrary: s) case (var n) thus ?caseby (iprover intro: par_beta_refl) next case (abs s' t) note abs' = this from‹s →\η Abs s'›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‹¬ free s'' 0›have"∃t'. Abs (s'' 🍋 Var 0) => t' ∧ t' →\<eta>* Abs t" by (rule eta_case) with eta show ?thesis by simp next case (abs r) from‹r →\η s'› obtain t' where r: "r => t'"and t': "t' →\<eta>* t"by (iprover dest: abs') from r have"Abs r => Abs t'" .. moreoverfrom t' have"Abs t' →\<eta>* Abs t"by (rule rtrancl_eta_Abs) ultimatelyshow ?thesis using abs by simp iprover qed next case (app u u' t t') from‹s →\η u 🍋 t›show ?case proof cases case (eta s' dummy) from app have"u 🍋 t => u' 🍋 t'"by simp with eta have"s'[dummy/0] => u' 🍋 t'"by simp with‹¬ free s' 0›have"∃r. Abs (s' 🍋 Var 0) => r ∧ r →\<eta>* u' 🍋 t'" by (rule eta_case) with eta show ?thesis by simp next case (appL s') from‹s' →\η u› obtain r where s': "s' => r"and r: "r →\<eta>* u'"by (iprover dest: app) from s' and app have"s' 🍋 t => r 🍋 t'"by simp moreoverfrom r have"r 🍋 t' →\<eta>* u' 🍋 t'"by (simp add: rtrancl_eta_AppL) ultimatelyshow ?thesis using appL by simp iprover next case (appR s') from‹s' →\η t› obtain r where s': "s' => r"and r: "r →\<eta>* t'"by (iprover dest: app) from s' and app have"u 🍋 s' => u' 🍋 r"by simp moreoverfrom r have"u' 🍋 r →\<eta>* u' 🍋 t'"by (simp add: rtrancl_eta_AppR) ultimatelyshow ?thesis using appR by simp iprover qed next case (beta u u' t t') from‹s →\η Abs u 🍋 t›show ?case proof cases case (eta s' dummy) from beta have"Abs u 🍋 t => u'[t'/0]"by simp with eta have"s'[dummy/0] => u'[t'/0]"by simp with‹¬ free s' 0›have"∃r. Abs (s' 🍋 Var 0) => r ∧ r →\<eta>* u'[t'/0]" by (rule eta_case) with eta show ?thesis by simp next case (appL s') from‹s' →\η Abs u›show ?thesis proof cases case (eta s'' dummy) have"Abs (lift u 1) = lift (Abs u) 0"by simp alsofrom eta have"… = s''"by (simp add: lift_subst_dummy del: lift_subst) finallyhave s: "s = Abs (Abs (lift u 1) 🍋 Var 0) 🍋 t"using appL and eta by simp from beta have"lift u 1 => lift u' 1"by simp hence"Abs (lift u 1) 🍋 Var 0 => lift u' 1[Var 0/0]" using par_beta.var .. hence"Abs (Abs (lift u 1) 🍋 Var 0) 🍋 t => lift u' 1[Var 0/0][t'/0]" using‹t => t'› .. with s have"s => u'[t'/0]"by simp thus ?thesis by iprover next case (abs r) from‹r →\η u› obtain r'' where r: "r => r''"and r'': "r'' →\<eta>* u'"by (iprover dest: beta) from r and beta have"Abs r 🍋 t => r''[t'/0]"by simp moreoverfrom r'' have"r''[t'/0] →\<eta>* u'[t'/0]" by (rule rtrancl_eta_subst') ultimatelyshow ?thesis using abs and appL by simp iprover qed next case (appR s') from‹s' →\η t› obtain r where s': "s' => r"and r: "r →\<eta>* t'"by (iprover dest: beta) from s' and beta have"Abs u 🍋 s' => u'[r/0]"by simp moreoverfrom r have"u'[r/0] →\<eta>* u'[t'/0]" by (rule rtrancl_eta_subst'') ultimatelyshow ?thesis using appR by simp iprover qed qed
theorem eta_postponement': assumes eta: "s →\<eta>* t"and beta: "t => u" shows"∃t'. s => t' ∧ t' →\<eta>* u"using eta beta proof (induct arbitrary: u) case base thus ?caseby blast next case (step s' s'' s''') thenobtain t' where s': "s' => t'"and t': "t' →\<eta>* s'''" by (auto dest: eta_par_beta) from s' obtain t'' where s: "s => t''"and t'': "t'' →\<eta>* t'"using step by blast from t'' and t' have"t'' →\<eta>* s'''"by (rule rtranclp_trans) with s show ?caseby iprover qed
theorem eta_postponement: assumes"(sup beta eta)** s t" shows"(beta** OO eta**) s t"using assms proof induct case base show ?caseby blast next case (step s' s'') from step(3) obtain t' where s: "s →\<beta>* t'"and t': "t' →\<eta>* s'"by blast from step(2) show ?case proof assume"s' →\<beta> s''" with beta_subset_par_beta have"s' => s''" .. with t' obtain t'' where st: "t' => t''"and tu: "t'' →\<eta>* s''" by (auto dest: eta_postponement') from par_beta_subset_beta st have"t' →\<beta>* t''" .. with s have"s →\<beta>* t''"by (rule rtranclp_trans) thus ?thesis using tu .. next assume"s' →\<eta> s''" with t' have"t' →\<eta>* s''" .. with s show ?thesis .. qed 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.