Attic/old/My.thy
changeset 170 b1258b7d2789
parent 24 f72c82bf59e5
equal deleted inserted replaced
169:b794db0b79db 170:b1258b7d2789
       
     1 theory My
       
     2 imports Main Infinite_Set
       
     3 begin
       
     4 
       
     5 
       
     6 definition
       
     7   Seq :: "string set \<Rightarrow> string set \<Rightarrow> string set" ("_ ;; _" [100,100] 100)
       
     8 where 
       
     9   "L1 ;; L2 = {s1 @ s2 | s1 s2. s1 \<in> L1 \<and> s2 \<in> L2}"
       
    10 
       
    11 inductive_set
       
    12   Star :: "string set \<Rightarrow> string set" ("_\<star>" [101] 102)
       
    13   for L :: "string set"
       
    14 where
       
    15   start[intro]: "[] \<in> L\<star>"
       
    16 | step[intro]:  "\<lbrakk>s1 \<in> L; s2 \<in> L\<star>\<rbrakk> \<Longrightarrow> s1@s2 \<in> L\<star>"
       
    17 
       
    18 lemma lang_star_cases:
       
    19   shows "L\<star> =  {[]} \<union> L ;; L\<star>"
       
    20 unfolding Seq_def
       
    21 by (auto) (metis Star.simps)
       
    22 
       
    23 lemma lang_star_cases2:
       
    24   shows "L ;; L\<star>  = L\<star> ;; L"
       
    25 sorry
       
    26 
       
    27 
       
    28 theorem ardens_revised:
       
    29   assumes nemp: "[] \<notin> A"
       
    30   shows "(X = X ;; A \<union> B) \<longleftrightarrow> (X = B ;; A\<star>)"
       
    31 proof
       
    32   assume eq: "X = B ;; A\<star>"
       
    33   have "A\<star> =  {[]} \<union> A\<star> ;; A" sorry
       
    34   then have "B ;; A\<star> = B ;; ({[]} \<union> A\<star> ;; A)" unfolding Seq_def by simp
       
    35   also have "\<dots> = B \<union> B ;; (A\<star> ;; A)"  unfolding Seq_def by auto
       
    36   also have "\<dots> = B \<union> (B ;; A\<star>) ;; A"  unfolding Seq_def
       
    37     by (auto) (metis append_assoc)+
       
    38   finally show "X = X ;; A \<union> B" using eq by auto
       
    39 next
       
    40   assume "X = X ;; A \<union> B"
       
    41   then have "B \<subseteq> X" "X ;; A \<subseteq> X" by auto
       
    42   show "X = B ;; A\<star>" sorry
       
    43 qed
       
    44 
       
    45 datatype rexp =
       
    46   NULL
       
    47 | EMPTY
       
    48 | CHAR char
       
    49 | SEQ rexp rexp
       
    50 | ALT rexp rexp
       
    51 | STAR rexp
       
    52 
       
    53 fun
       
    54   Sem :: "rexp \<Rightarrow> string set" ("\<lparr>_\<rparr>" [0] 1000)
       
    55 where
       
    56     "\<lparr>NULL\<rparr> = {}"
       
    57   | "\<lparr>EMPTY\<rparr> = {[]}"
       
    58   | "\<lparr>CHAR c\<rparr> = {[c]}"
       
    59   | "\<lparr>SEQ r1 r2\<rparr> = \<lparr>r1\<rparr> ;; \<lparr>r2\<rparr>"
       
    60   | "\<lparr>ALT r1 r2\<rparr> = \<lparr>r1\<rparr> \<union> \<lparr>r2\<rparr>"
       
    61   | "\<lparr>STAR r\<rparr> = \<lparr>r\<rparr>\<star>"
       
    62 
       
    63 definition 
       
    64   folds :: "('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> 'a set \<Rightarrow> 'b"
       
    65 where
       
    66   "folds f z S \<equiv> SOME x. fold_graph f z S x"
       
    67 
       
    68 lemma folds_simp_null [simp]:
       
    69   "finite rs \<Longrightarrow> x \<in> \<lparr>folds ALT NULL rs\<rparr> \<longleftrightarrow> (\<exists>r \<in> rs. x \<in> \<lparr>r\<rparr>)"
       
    70 apply (simp add: folds_def)
       
    71 apply (rule someI2_ex)
       
    72 apply (erule finite_imp_fold_graph)
       
    73 apply (erule fold_graph.induct)
       
    74 apply (auto)
       
    75 done
       
    76 
       
    77 lemma folds_simp_empty [simp]:
       
    78   "finite rs \<Longrightarrow> x \<in> \<lparr>folds ALT EMPTY rs\<rparr> \<longleftrightarrow> (\<exists>r \<in> rs. x \<in> \<lparr>r\<rparr>) \<or> x = []"
       
    79 apply (simp add: folds_def)
       
    80 apply (rule someI2_ex)
       
    81 apply (erule finite_imp_fold_graph)
       
    82 apply (erule fold_graph.induct)
       
    83 apply (auto)
       
    84 done
       
    85 
       
    86 lemma [simp]:
       
    87   shows "(x, y) \<in> {(x, y). P x y} \<longleftrightarrow> P x y"
       
    88 by simp
       
    89 
       
    90 definition
       
    91   str_eq ("_ \<approx>_ _")
       
    92 where
       
    93   "x \<approx>Lang y \<equiv> (\<forall>z. x @ z \<in> Lang \<longleftrightarrow> y @ z \<in> Lang)"
       
    94 
       
    95 definition
       
    96   str_eq_rel ("\<approx>_")
       
    97 where
       
    98   "\<approx>Lang \<equiv> {(x, y). x \<approx>Lang y}"
       
    99 
       
   100 definition
       
   101   final :: "string set \<Rightarrow> string set \<Rightarrow> bool"
       
   102 where
       
   103   "final X Lang \<equiv> (X \<in> UNIV // \<approx>Lang) \<and> (\<forall>s \<in> X. s \<in> Lang)"
       
   104 
       
   105 lemma lang_is_union_of_finals: 
       
   106   "Lang = \<Union> {X. final X Lang}"
       
   107 proof -
       
   108   have  "Lang \<subseteq> \<Union> {X. final X Lang}"
       
   109     unfolding final_def
       
   110     unfolding quotient_def Image_def
       
   111     unfolding str_eq_rel_def
       
   112     apply(simp)
       
   113     apply(auto)
       
   114     apply(rule_tac x="(\<approx>Lang) `` {x}" in exI)
       
   115     unfolding Image_def
       
   116     unfolding str_eq_rel_def
       
   117     apply(auto)
       
   118     unfolding str_eq_def
       
   119     apply(auto)
       
   120     apply(drule_tac x="[]" in spec)
       
   121     apply(simp)
       
   122     done
       
   123   moreover
       
   124   have "\<Union>{X. final X Lang} \<subseteq> Lang" 
       
   125     unfolding final_def by auto
       
   126   ultimately 
       
   127   show "Lang = \<Union> {X. final X Lang}"
       
   128     by blast
       
   129 qed
       
   130 
       
   131 lemma all_rexp:
       
   132   "\<lbrakk>finite (UNIV // \<approx>Lang); X \<in> (UNIV // \<approx>Lang)\<rbrakk> \<Longrightarrow> \<exists>r. X = \<lparr>r\<rparr>"
       
   133 sorry
       
   134 
       
   135 lemma final_rexp:
       
   136   "\<lbrakk>finite (UNIV // (\<approx>Lang)); final X Lang\<rbrakk> \<Longrightarrow> \<exists>r. X = \<lparr>r\<rparr>"
       
   137 unfolding final_def
       
   138 using all_rexp by blast
       
   139 
       
   140 lemma finite_f_one_to_one:
       
   141   assumes "finite B"
       
   142   and "\<forall>x \<in> B. \<exists>y. f y = x"
       
   143   shows "\<exists>rs. finite rs \<and> (B = {f y | y . y \<in> rs})"
       
   144 using assms
       
   145 by (induct) (auto)
       
   146 
       
   147 lemma finite_final:
       
   148   assumes "finite (UNIV // (\<approx>Lang))"
       
   149   shows "finite {X. final X Lang}"
       
   150 using assms
       
   151 proof -
       
   152   have "{X. final X Lang} \<subseteq> (UNIV // (\<approx>Lang))"
       
   153     unfolding final_def by auto
       
   154   with assms show "finite {X. final X Lang}" 
       
   155     using finite_subset by auto
       
   156 qed
       
   157 
       
   158 lemma finite_regular_aux:
       
   159   fixes Lang :: "string set"
       
   160   assumes "finite (UNIV // (\<approx>Lang))"
       
   161   shows "\<exists>rs. Lang = \<lparr>folds ALT NULL rs\<rparr>"
       
   162 apply(subst lang_is_union_of_finals)
       
   163 using assms
       
   164 apply -
       
   165 apply(drule finite_final)
       
   166 apply(drule_tac f="Sem" in finite_f_one_to_one)
       
   167 apply(clarify)
       
   168 apply(drule final_rexp[OF assms])
       
   169 apply(auto)[1]
       
   170 apply(clarify)
       
   171 apply(rule_tac x="rs" in exI)
       
   172 apply(simp)
       
   173 apply(rule set_eqI)
       
   174 apply(auto)
       
   175 done
       
   176 
       
   177 lemma finite_regular:
       
   178   fixes Lang :: "string set"
       
   179   assumes "finite (UNIV // (\<approx>Lang))"
       
   180   shows "\<exists>r. Lang =  \<lparr>r\<rparr>"
       
   181 using assms finite_regular_aux
       
   182 by auto
       
   183 
       
   184 
       
   185 
       
   186 section {* other direction *}
       
   187 
       
   188 
       
   189 lemma inj_image_lang:
       
   190   fixes f::"string \<Rightarrow> 'a"
       
   191   assumes str_inj: "\<And>x y. f x = f y \<Longrightarrow> x \<approx>Lang y"
       
   192   shows "inj_on (image f) (UNIV // (\<approx>Lang))"
       
   193 proof - 
       
   194   { fix x y::string
       
   195     assume eq_tag: "f ` {z. x \<approx>Lang z} = f ` {z. y \<approx>Lang z}"
       
   196     moreover
       
   197     have "{z. x \<approx>Lang z} \<noteq> {}" unfolding str_eq_def by auto
       
   198     ultimately obtain a b where "x \<approx>Lang a" "y \<approx>Lang b" "f a = f b" by blast
       
   199     then have "x \<approx>Lang a" "y \<approx>Lang b" "a \<approx>Lang b" using str_inj by auto
       
   200     then have "x \<approx>Lang y" unfolding str_eq_def by simp 
       
   201     then have "{z. x \<approx>Lang z} = {z. y \<approx>Lang z}" unfolding str_eq_def by simp
       
   202   }
       
   203   then have "\<forall>x\<in>UNIV // \<approx>Lang. \<forall>y\<in>UNIV // \<approx>Lang. f ` x = f ` y \<longrightarrow> x = y"
       
   204     unfolding quotient_def Image_def str_eq_rel_def by simp
       
   205   then show "inj_on (image f) (UNIV // (\<approx>Lang))"
       
   206     unfolding inj_on_def by simp
       
   207 qed
       
   208 
       
   209 
       
   210 lemma finite_range_image: 
       
   211   assumes fin: "finite (range f)"
       
   212   shows "finite ((image f) ` X)"
       
   213 proof -
       
   214   from fin have "finite (Pow (f ` UNIV))" by auto
       
   215   moreover
       
   216   have "(image f) ` X \<subseteq> Pow (f ` UNIV)" by auto
       
   217   ultimately show "finite ((image f) ` X)" using finite_subset by auto
       
   218 qed
       
   219 
       
   220 definition 
       
   221   tag1 :: "string set \<Rightarrow> string set \<Rightarrow> string \<Rightarrow> (string set \<times> string set)"
       
   222 where
       
   223   "tag1 L\<^isub>1 L\<^isub>2 \<equiv> \<lambda>x. ((\<approx>L\<^isub>1) `` {x}, (\<approx>L\<^isub>2) `` {x})"
       
   224 
       
   225 lemma tag1_range_finite:
       
   226   assumes finite1: "finite (UNIV // \<approx>L\<^isub>1)"
       
   227   and finite2: "finite (UNIV // \<approx>L\<^isub>2)"
       
   228   shows "finite (range (tag1 L\<^isub>1 L\<^isub>2))"
       
   229 proof -
       
   230   have "finite (UNIV // \<approx>L\<^isub>1 \<times> UNIV // \<approx>L\<^isub>2)" using finite1 finite2 by auto
       
   231   moreover
       
   232   have "range (tag1 L\<^isub>1 L\<^isub>2) \<subseteq> (UNIV // \<approx>L\<^isub>1) \<times> (UNIV // \<approx>L\<^isub>2)"
       
   233     unfolding tag1_def quotient_def by auto
       
   234   ultimately show "finite (range (tag1 L\<^isub>1 L\<^isub>2))" 
       
   235     using finite_subset by blast
       
   236 qed
       
   237 
       
   238 lemma tag1_inj:
       
   239   "tag1 L\<^isub>1 L\<^isub>2 x = tag1 L\<^isub>1 L\<^isub>2 y \<Longrightarrow> x \<approx>(L\<^isub>1 \<union> L\<^isub>2) y"
       
   240 unfolding tag1_def Image_def str_eq_rel_def str_eq_def
       
   241 by auto
       
   242 
       
   243 lemma quot_alt_cu:
       
   244   fixes L\<^isub>1 L\<^isub>2::"string set"
       
   245   assumes fin1: "finite (UNIV // \<approx>L\<^isub>1)"
       
   246   and fin2: "finite (UNIV // \<approx>L\<^isub>2)"
       
   247   shows "finite (UNIV // \<approx>(L\<^isub>1 \<union> L\<^isub>2))"
       
   248 proof -
       
   249   have "finite (range (tag1 L\<^isub>1 L\<^isub>2))" 
       
   250     using fin1 fin2 tag1_range_finite by simp
       
   251   then have "finite (image (tag1 L\<^isub>1 L\<^isub>2) ` (UNIV // \<approx>(L\<^isub>1 \<union> L\<^isub>2)))" 
       
   252     using finite_range_image by blast
       
   253   moreover 
       
   254   have "\<And>x y. tag1 L\<^isub>1 L\<^isub>2 x = tag1 L\<^isub>1 L\<^isub>2 y \<Longrightarrow> x \<approx>(L\<^isub>1 \<union> L\<^isub>2) y" 
       
   255     using tag1_inj by simp
       
   256   then have "inj_on (image (tag1 L\<^isub>1 L\<^isub>2)) (UNIV // \<approx>(L\<^isub>1 \<union> L\<^isub>2))" 
       
   257     using inj_image_lang by blast
       
   258   ultimately 
       
   259   show "finite (UNIV // \<approx>(L\<^isub>1 \<union> L\<^isub>2))" by (rule finite_imageD)
       
   260 qed
       
   261 
       
   262 
       
   263 section {* finite \<Rightarrow> regular *}
       
   264 
       
   265 definition
       
   266   transitions :: "string set \<Rightarrow> string set \<Rightarrow> rexp set" ("_\<Turnstile>\<Rightarrow>_")
       
   267 where
       
   268   "Y \<Turnstile>\<Rightarrow> X \<equiv> {CHAR c | c. Y ;; {[c]} \<subseteq> X}"
       
   269 
       
   270 definition
       
   271   transitions_rexp ("_ \<turnstile>\<rightarrow> _")
       
   272 where
       
   273   "Y \<turnstile>\<rightarrow> X \<equiv> if [] \<in> X then folds ALT EMPTY (Y \<Turnstile>\<Rightarrow>X) else folds ALT NULL (Y \<Turnstile>\<Rightarrow>X)"
       
   274 
       
   275 definition
       
   276   "rhs CS X \<equiv> if X = {[]} then {({[]}, EMPTY)} else {(Y, Y \<turnstile>\<rightarrow>X) | Y. Y \<in> CS}"
       
   277 
       
   278 definition
       
   279   "rhs_sem CS X \<equiv> \<Union> {(Y;; \<lparr>r\<rparr>) | Y r . (Y, r) \<in> rhs CS X}"
       
   280 
       
   281 definition
       
   282   "eqs CS \<equiv> (\<Union>X \<in> CS. {(X, rhs CS X)})"
       
   283 
       
   284 definition
       
   285   "eqs_sem CS \<equiv> (\<Union>X \<in> CS. {(X, rhs_sem CS X)})"
       
   286 
       
   287 lemma [simp]:
       
   288   shows "finite (Y \<Turnstile>\<Rightarrow> X)"
       
   289 unfolding transitions_def
       
   290 by auto
       
   291 
       
   292 
       
   293 lemma defined_by_str:
       
   294   assumes "s \<in> X" 
       
   295   and "X \<in> UNIV // (\<approx>Lang)"
       
   296   shows "X = (\<approx>Lang) `` {s}"
       
   297 using assms
       
   298 unfolding quotient_def Image_def
       
   299 unfolding str_eq_rel_def str_eq_def
       
   300 by auto
       
   301 
       
   302 lemma every_eqclass_has_transition:
       
   303   assumes has_str: "s @ [c] \<in> X"
       
   304   and     in_CS:   "X \<in> UNIV // (\<approx>Lang)"
       
   305   obtains Y where "Y \<in> UNIV // (\<approx>Lang)" and "Y ;; {[c]} \<subseteq> X" and "s \<in> Y"
       
   306 proof -
       
   307   def Y \<equiv> "(\<approx>Lang) `` {s}"
       
   308   have "Y \<in> UNIV // (\<approx>Lang)" 
       
   309     unfolding Y_def quotient_def by auto
       
   310   moreover
       
   311   have "X = (\<approx>Lang) `` {s @ [c]}" 
       
   312     using has_str in_CS defined_by_str by blast
       
   313   then have "Y ;; {[c]} \<subseteq> X" 
       
   314     unfolding Y_def Image_def Seq_def
       
   315     unfolding str_eq_rel_def
       
   316     by (auto) (simp add: str_eq_def)
       
   317   moreover
       
   318   have "s \<in> Y" unfolding Y_def 
       
   319     unfolding Image_def str_eq_rel_def str_eq_def by simp
       
   320   (*moreover 
       
   321   have "True" by simp FIXME *) 
       
   322   ultimately show thesis by (blast intro: that)
       
   323 qed
       
   324 
       
   325 lemma test:
       
   326   assumes "[] \<in> X"
       
   327   shows "[] \<in> \<lparr>Y \<turnstile>\<rightarrow> X\<rparr>"
       
   328 using assms
       
   329 by (simp add: transitions_rexp_def)
       
   330 
       
   331 lemma rhs_sem:
       
   332   assumes "X \<in> (UNIV // (\<approx>Lang))"
       
   333   shows "X \<subseteq> rhs_sem (UNIV // (\<approx>Lang)) X"
       
   334 apply(case_tac "X = {[]}")
       
   335 apply(simp)
       
   336 apply(simp add: rhs_sem_def rhs_def Seq_def)
       
   337 apply(rule subsetI)
       
   338 apply(case_tac "x = []")
       
   339 apply(simp add: rhs_sem_def rhs_def)
       
   340 apply(rule_tac x = "X" in exI)
       
   341 apply(simp)
       
   342 apply(rule_tac x = "X" in exI)
       
   343 apply(simp add: assms)
       
   344 apply(simp add: transitions_rexp_def)
       
   345 oops
       
   346 
       
   347 
       
   348 (*
       
   349 fun
       
   350   power :: "string \<Rightarrow> nat \<Rightarrow> string" (infixr "\<Up>" 100)
       
   351 where
       
   352   "s \<Up> 0 = s"
       
   353 | "s \<Up> (Suc n) = s @ (s \<Up> n)"
       
   354 
       
   355 definition 
       
   356  "Lone = {(''0'' \<Up> n) @ (''1'' \<Up> n) | n. True }"
       
   357 
       
   358 lemma
       
   359   "infinite (UNIV // (\<approx>Lone))"
       
   360 unfolding infinite_iff_countable_subset
       
   361 apply(rule_tac x="\<lambda>n. {(''0'' \<Up> n) @ (''1'' \<Up> i) | i. i \<in> {..n} }" in exI)
       
   362 apply(auto)
       
   363 prefer 2
       
   364 unfolding Lone_def
       
   365 unfolding quotient_def
       
   366 unfolding Image_def
       
   367 apply(simp)
       
   368 unfolding str_eq_rel_def
       
   369 unfolding str_eq_def
       
   370 apply(auto)
       
   371 apply(rule_tac x="''0'' \<Up> n" in exI)
       
   372 apply(auto)
       
   373 unfolding infinite_nat_iff_unbounded
       
   374 unfolding Lone_def
       
   375 *)
       
   376 
       
   377 
       
   378 
       
   379 text {* Derivatives *}
       
   380 
       
   381 definition
       
   382   DERS :: "string \<Rightarrow> string set \<Rightarrow> string set"
       
   383 where
       
   384   "DERS s L \<equiv> {s'. s @ s' \<in> L}"
       
   385 
       
   386 lemma
       
   387   shows "x \<approx>L y \<longleftrightarrow> DERS x L = DERS y L"
       
   388 unfolding DERS_def str_eq_def
       
   389 by auto