theory Myhill+ −
imports Myhill_2 "Derivatives"+ −
begin+ −
+ −
section {* The theorem *}+ −
+ −
theorem Myhill_Nerode:+ −
fixes A::"('a::finite) lang"+ −
shows "(\<exists>r. A = lang r) \<longleftrightarrow> finite (UNIV // \<approx>A)"+ −
using Myhill_Nerode1 Myhill_Nerode2 by auto+ −
+ −
+ −
subsection {* Second direction proved using partial derivatives *}+ −
+ −
text {*+ −
An alternaive proof using the notion of partial derivatives for regular + −
expressions due to Antimirov \cite{Antimirov95}.+ −
*}+ −
+ −
lemma MN_Rel_Derivs:+ −
shows "x \<approx>A y \<longleftrightarrow> Derivs x A = Derivs y A"+ −
unfolding Derivs_def str_eq_def+ −
by auto+ −
+ −
lemma Myhill_Nerode3:+ −
fixes r::"'a rexp"+ −
shows "finite (UNIV // \<approx>(lang r))"+ −
proof -+ −
have "finite (UNIV // =(\<lambda>x. pderivs x r)=)"+ −
proof - + −
have "range (\<lambda>x. pderivs x r) \<subseteq> Pow (pderivs_lang UNIV r)"+ −
unfolding pderivs_lang_def by auto+ −
moreover + −
have "finite (Pow (pderivs_lang UNIV r))" by (simp add: finite_pderivs_lang)+ −
ultimately+ −
have "finite (range (\<lambda>x. pderivs x r))"+ −
by (simp add: finite_subset)+ −
then show "finite (UNIV // =(\<lambda>x. pderivs x r)=)" + −
by (rule finite_eq_tag_rel)+ −
qed+ −
moreover + −
have "=(\<lambda>x. pderivs x r)= \<subseteq> \<approx>(lang r)"+ −
unfolding tag_eq_def+ −
by (auto simp add: MN_Rel_Derivs Derivs_pderivs)+ −
moreover + −
have "equiv UNIV =(\<lambda>x. pderivs x r)="+ −
and "equiv UNIV (\<approx>(lang r))"+ −
unfolding equiv_def refl_on_def sym_def trans_def+ −
unfolding tag_eq_def str_eq_def+ −
by auto+ −
ultimately show "finite (UNIV // \<approx>(lang r))" + −
by (rule refined_partition_finite)+ −
qed+ −
+ −
end+ −