Myhill_1.thy
changeset 94 5b12cd0a3b3c
parent 92 a9ebc410a5c8
child 95 9540c2f2ea77
equal deleted inserted replaced
93:2aa3756dcc9f 94:5b12cd0a3b3c
   247   then have "X \<subseteq> B ;; A\<star>" by auto
   247   then have "X \<subseteq> B ;; A\<star>" by auto
   248   ultimately 
   248   ultimately 
   249   show "X = B ;; A\<star>" by simp
   249   show "X = B ;; A\<star>" by simp
   250 qed
   250 qed
   251 
   251 
       
   252 (*
       
   253 corollary arden_eq:
       
   254   assumes nemp: "[] \<notin> A"
       
   255   shows "(X ;; A \<union> B) = (B ;; A\<star>)"
       
   256 proof -
       
   257   { assume "X = X ;; A \<union> B"
       
   258     then have "X = B ;; A\<star>"
       
   259     then have ?thesis
       
   260       thm arden[THEN iffD1]
       
   261 apply(rule set_eqI)
       
   262 thm arden[THEN iffD1]
       
   263 apply(rule iffI)
       
   264 apply(rule trans)
       
   265 apply(rule arden[THEN iffD2, symmetric])
       
   266 apply(rule arden[OF iffD1, symmetric])
       
   267 thm trans
       
   268 proof -
       
   269   { assume "X = X ;; A \<union> B"
       
   270     then have "X = B ;; A\<star>" using arden[OF nemp] by blast
       
   271     moreover 
       
   272   
       
   273     
       
   274 using arden[of "A" "X" "B", OF nemp]
       
   275 apply(erule_tac iffE)
       
   276 apply(blast)
       
   277 *)
       
   278 
   252 
   279 
   253 section {* Regular Expressions *}
   280 section {* Regular Expressions *}
   254 
   281 
   255 datatype rexp =
   282 datatype rexp =
   256   NULL
   283   NULL
   285 text {* ALT-combination of a set or regulare expressions *}
   312 text {* ALT-combination of a set or regulare expressions *}
   286 
   313 
   287 abbreviation
   314 abbreviation
   288   Setalt  ("\<Uplus>_" [1000] 999) 
   315   Setalt  ("\<Uplus>_" [1000] 999) 
   289 where
   316 where
   290   "\<Uplus>A == folds ALT NULL A"
   317   "\<Uplus>A \<equiv> folds ALT NULL A"
   291 
   318 
   292 text {* 
   319 text {* 
   293   For finite sets, @{term Setalt} is preserved under @{term L}.
   320   For finite sets, @{term Setalt} is preserved under @{term L}.
   294 *}
   321 *}
   295 
   322 
   296 lemma folds_alt_simp [simp]:
   323 lemma folds_alt_simp [simp]:
   297   fixes rs::"rexp set"
   324   fixes rs::"rexp set"
   298   assumes a: "finite rs"
   325   assumes a: "finite rs"
   299   shows "L (\<Uplus>rs) = \<Union> (L ` rs)"
   326   shows "L (\<Uplus>rs) = \<Union> (L ` rs)"
       
   327 unfolding folds_def
   300 apply(rule set_eqI)
   328 apply(rule set_eqI)
   301 apply(simp add: folds_def)
       
   302 apply(rule someI2_ex)
   329 apply(rule someI2_ex)
   303 apply(rule_tac finite_imp_fold_graph[OF a])
   330 apply(rule_tac finite_imp_fold_graph[OF a])
   304 apply(erule fold_graph.induct)
   331 apply(erule fold_graph.induct)
   305 apply(auto)
   332 apply(auto)
   306 done
   333 done
   344 apply(auto)
   371 apply(auto)
   345 done
   372 done
   346 
   373 
   347 lemma finals_in_partitions:
   374 lemma finals_in_partitions:
   348   shows "finals A \<subseteq> (UNIV // \<approx>A)"
   375   shows "finals A \<subseteq> (UNIV // \<approx>A)"
   349 unfolding finals_def
   376 unfolding finals_def quotient_def
   350 unfolding quotient_def
       
   351 by auto
   377 by auto
   352 
   378 
   353 
   379 
   354 section {* Equational systems *}
   380 section {* Equational systems *}
   355 
   381 
   374    fun L_rhs:: "rhs_item set \<Rightarrow> lang"
   400    fun L_rhs:: "rhs_item set \<Rightarrow> lang"
   375    where 
   401    where 
   376      "L_rhs rhs = \<Union> (L ` rhs)"
   402      "L_rhs rhs = \<Union> (L ` rhs)"
   377 end
   403 end
   378 
   404 
   379 definition
       
   380   "trns_of rhs X \<equiv> {Trn X r | r. Trn X r \<in> rhs}"
       
   381 
       
   382 text {* Transitions between equivalence classes *}
   405 text {* Transitions between equivalence classes *}
   383 
   406 
   384 definition 
   407 definition 
   385   transition :: "lang \<Rightarrow> char \<Rightarrow> lang \<Rightarrow> bool" ("_ \<Turnstile>_\<Rightarrow>_" [100,100,100] 100)
   408   transition :: "lang \<Rightarrow> char \<Rightarrow> lang \<Rightarrow> bool" ("_ \<Turnstile>_\<Rightarrow>_" [100,100,100] 100)
   386 where
   409 where
   416 
   439 
   417 definition
   440 definition
   418   "append_rhs_rexp rhs rexp \<equiv> (append_rexp rexp) ` rhs"
   441   "append_rhs_rexp rhs rexp \<equiv> (append_rexp rexp) ` rhs"
   419 
   442 
   420 definition 
   443 definition 
   421   "arden_op X rhs \<equiv> 
   444   "Arden X rhs \<equiv> 
   422      append_rhs_rexp (rhs - trns_of rhs X) (STAR (\<Uplus> {r. Trn X r \<in> rhs}))"
   445      append_rhs_rexp (rhs - {Trn X r | r. Trn X r \<in> rhs}) (STAR (\<Uplus> {r. Trn X r \<in> rhs}))"
   423 
   446 
   424 
   447 
   425 section {* Substitution Operation on equations *}
   448 section {* Substitution Operation on equations *}
   426 
   449 
   427 text {* 
   450 text {* 
   428   Suppose and equation @{text "X = xrhs"}, @{text "subst_op"} substitutes 
   451   Suppose and equation @{text "X = xrhs"}, @{text "subst_op"} substitutes 
   429   all occurences of @{text "X"} in @{text "rhs"} by @{text "xrhs"}.
   452   all occurences of @{text "X"} in @{text "rhs"} by @{text "xrhs"}.
   430 *}
   453 *}
   431 
   454 
   432 definition 
   455 definition 
   433   "subst_op rhs X xrhs \<equiv> 
   456   "Subst rhs X xrhs \<equiv> 
   434         (rhs - (trns_of rhs X)) \<union> (append_rhs_rexp xrhs (\<Uplus> {r. Trn X r \<in> rhs}))"
   457         (rhs - {Trn X r | r. Trn X r \<in> rhs}) \<union> (append_rhs_rexp xrhs (\<Uplus> {r. Trn X r \<in> rhs}))"
   435 
   458 
   436 text {*
   459 text {*
   437   @{text "eqs_subst ES X xrhs"} substitutes @{text xrhs} into every 
   460   @{text "eqs_subst ES X xrhs"} substitutes @{text xrhs} into every 
   438   equation of the equational system @{text ES}.
   461   equation of the equational system @{text ES}.
   439 *}
   462 *}
   440 
   463 
   441 definition
   464 definition
   442   "subst_op_all ES X xrhs \<equiv> {(Y, subst_op yrhs X xrhs) | Y yrhs. (Y, yrhs) \<in> ES}"
   465   "Subst_all ES X xrhs \<equiv> {(Y, Subst yrhs X xrhs) | Y yrhs. (Y, yrhs) \<in> ES}"
   443 
   466 
   444 
   467 
   445 section {* While-combinator *}
   468 section {* While-combinator *}
   446 
   469 
   447 text {*
   470 text {*
   452   @{text "arden_variate Y yrhs"}.
   475   @{text "arden_variate Y yrhs"}.
   453   *}
   476   *}
   454 
   477 
   455 definition
   478 definition
   456   "remove_op ES Y yrhs \<equiv> 
   479   "remove_op ES Y yrhs \<equiv> 
   457       subst_op_all  (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)"
   480       Subst_all  (ES - {(Y, yrhs)}) Y (Arden Y yrhs)"
   458 
   481 
   459 text {*
   482 text {*
   460   The following term @{text "iterm X ES"} represents one iteration in the while loop.
   483   The following term @{text "iterm X ES"} represents one iteration in the while loop.
   461   It arbitrarily chooses a @{text "Y"} different from @{text "X"} to remove.
   484   It arbitrarily chooses a @{text "Y"} different from @{text "X"} to remove.
   462 *}
   485 *}
   758 text {*
   781 text {*
   759   From this point until @{text "iteration_step"}, 
   782   From this point until @{text "iteration_step"}, 
   760   the correctness of the iteration step @{text "iter X ES"} is proved.
   783   the correctness of the iteration step @{text "iter X ES"} is proved.
   761 *}
   784 *}
   762 
   785 
   763 lemma arden_op_keeps_eq:
   786 lemma Arden_keeps_eq:
   764   assumes l_eq_r: "X = L rhs"
   787   assumes l_eq_r: "X = L rhs"
   765   and not_empty: "[] \<notin> L (\<Uplus>{r. Trn X r \<in> rhs})"
   788   and not_empty: "[] \<notin> L (\<Uplus>{r. Trn X r \<in> rhs})"
   766   and finite: "finite rhs"
   789   and finite: "finite rhs"
   767   shows "X = L (arden_op X rhs)"
   790   shows "X = L (Arden X rhs)"
   768 proof -
   791 proof -
   769   def A \<equiv> "L (\<Uplus>{r. Trn X r \<in> rhs})"
   792   def A \<equiv> "L (\<Uplus>{r. Trn X r \<in> rhs})"
   770   def b \<equiv> "rhs - trns_of rhs X"
   793   def b \<equiv> "rhs - {Trn X r | r. Trn X r \<in> rhs}"
   771   def B \<equiv> "L b" 
   794   def B \<equiv> "L b" 
   772   have "X = B ;; A\<star>"
   795   have "X = B ;; A\<star>"
   773   proof-
   796   proof-
   774     have "L rhs = L(trns_of rhs X \<union> b)" by (auto simp: b_def trns_of_def)
   797     have "L rhs = L({Trn X r | r. Trn X r \<in> rhs} \<union> b)" by (auto simp: b_def)
   775     also have "\<dots> = X ;; A \<union> B"
   798     also have "\<dots> = X ;; A \<union> B"
   776       unfolding trns_of_def
       
   777       unfolding L_rhs_union_distrib[symmetric]
   799       unfolding L_rhs_union_distrib[symmetric]
   778       by (simp only: lang_of_rexp_of finite B_def A_def)
   800       by (simp only: lang_of_rexp_of finite B_def A_def)
   779     finally show ?thesis
   801     finally show ?thesis
   780       using l_eq_r not_empty
   802       using l_eq_r not_empty
   781       apply(rule_tac arden[THEN iffD1])
   803       apply(rule_tac arden[THEN iffD1])
   782       apply(simp add: A_def)
   804       apply(simp add: A_def)
   783       apply(simp)
   805       apply(simp)
   784       done
   806       done
   785   qed
   807   qed
   786   moreover have "L (arden_op X rhs) = (B ;; A\<star>)"
   808   moreover have "L (Arden X rhs) = B ;; A\<star>"
   787     by (simp only:arden_op_def L_rhs_union_distrib lang_of_append_rhs 
   809     by (simp only:Arden_def L_rhs_union_distrib lang_of_append_rhs 
   788                   B_def A_def b_def L_rexp.simps seq_union_distrib_left)
   810                   B_def A_def b_def L_rexp.simps seq_union_distrib_left)
   789    ultimately show ?thesis by simp
   811    ultimately show ?thesis by simp
   790 qed 
   812 qed 
   791 
   813 
   792 lemma append_keeps_finite:
   814 lemma append_keeps_finite:
   793   "finite rhs \<Longrightarrow> finite (append_rhs_rexp rhs r)"
   815   "finite rhs \<Longrightarrow> finite (append_rhs_rexp rhs r)"
   794 by (auto simp:append_rhs_rexp_def)
   816 by (auto simp:append_rhs_rexp_def)
   795 
   817 
   796 lemma arden_op_keeps_finite:
   818 lemma Arden_keeps_finite:
   797   "finite rhs \<Longrightarrow> finite (arden_op X rhs)"
   819   "finite rhs \<Longrightarrow> finite (Arden X rhs)"
   798 by (auto simp:arden_op_def append_keeps_finite)
   820 by (auto simp:Arden_def append_keeps_finite)
   799 
   821 
   800 lemma append_keeps_nonempty:
   822 lemma append_keeps_nonempty:
   801   "rhs_nonempty rhs \<Longrightarrow> rhs_nonempty (append_rhs_rexp rhs r)"
   823   "rhs_nonempty rhs \<Longrightarrow> rhs_nonempty (append_rhs_rexp rhs r)"
   802 apply (auto simp:rhs_nonempty_def append_rhs_rexp_def)
   824 apply (auto simp:rhs_nonempty_def append_rhs_rexp_def)
   803 by (case_tac x, auto simp:Seq_def)
   825 by (case_tac x, auto simp:Seq_def)
   808 
   830 
   809 lemma nonempty_set_union:
   831 lemma nonempty_set_union:
   810   "\<lbrakk>rhs_nonempty rhs; rhs_nonempty rhs'\<rbrakk> \<Longrightarrow> rhs_nonempty (rhs \<union> rhs')"
   832   "\<lbrakk>rhs_nonempty rhs; rhs_nonempty rhs'\<rbrakk> \<Longrightarrow> rhs_nonempty (rhs \<union> rhs')"
   811 by (auto simp:rhs_nonempty_def)
   833 by (auto simp:rhs_nonempty_def)
   812 
   834 
   813 lemma arden_op_keeps_nonempty:
   835 lemma Arden_keeps_nonempty:
   814   "rhs_nonempty rhs \<Longrightarrow> rhs_nonempty (arden_op X rhs)"
   836   "rhs_nonempty rhs \<Longrightarrow> rhs_nonempty (Arden X rhs)"
   815 by (simp only:arden_op_def append_keeps_nonempty nonempty_set_sub)
   837 by (simp only:Arden_def append_keeps_nonempty nonempty_set_sub)
   816 
   838 
   817 
   839 
   818 lemma subst_op_keeps_nonempty:
   840 lemma Subst_keeps_nonempty:
   819   "\<lbrakk>rhs_nonempty rhs; rhs_nonempty xrhs\<rbrakk> \<Longrightarrow> rhs_nonempty (subst_op rhs X xrhs)"
   841   "\<lbrakk>rhs_nonempty rhs; rhs_nonempty xrhs\<rbrakk> \<Longrightarrow> rhs_nonempty (Subst rhs X xrhs)"
   820 by (simp only:subst_op_def append_keeps_nonempty  nonempty_set_union nonempty_set_sub)
   842 by (simp only:Subst_def append_keeps_nonempty  nonempty_set_union nonempty_set_sub)
   821 
   843 
   822 lemma subst_op_keeps_eq:
   844 lemma Subst_keeps_eq:
   823   assumes substor: "X = L xrhs"
   845   assumes substor: "X = L xrhs"
   824   and finite: "finite rhs"
   846   and finite: "finite rhs"
   825   shows "L (subst_op rhs X xrhs) = L rhs" (is "?Left = ?Right")
   847   shows "L (Subst rhs X xrhs) = L rhs" (is "?Left = ?Right")
   826 proof-
   848 proof-
   827   def A \<equiv> "L (rhs - trns_of rhs X)"
   849   def A \<equiv> "L (rhs - {Trn X r | r. Trn X r \<in> rhs})"
   828   have "?Left = A \<union> L (append_rhs_rexp xrhs (\<Uplus>{r. Trn X r \<in> rhs}))"
   850   have "?Left = A \<union> L (append_rhs_rexp xrhs (\<Uplus>{r. Trn X r \<in> rhs}))"
   829     unfolding subst_op_def
   851     unfolding Subst_def
   830     unfolding L_rhs_union_distrib[symmetric]
   852     unfolding L_rhs_union_distrib[symmetric]
   831     by (simp add: A_def)
   853     by (simp add: A_def)
   832   moreover have "?Right = A \<union> L ({Trn X r | r. Trn X r \<in> rhs})"
   854   moreover have "?Right = A \<union> L ({Trn X r | r. Trn X r \<in> rhs})"
   833   proof-
   855   proof-
   834     have "rhs = (rhs - trns_of rhs X) \<union> (trns_of rhs X)" by (auto simp add: trns_of_def)
   856     have "rhs = (rhs - {Trn X r | r. Trn X r \<in> rhs}) \<union> ({Trn X r | r. Trn X r \<in> rhs})" by auto
   835     thus ?thesis 
   857     thus ?thesis 
   836       unfolding A_def
   858       unfolding A_def
   837       unfolding L_rhs_union_distrib
   859       unfolding L_rhs_union_distrib
   838       unfolding trns_of_def
       
   839       by simp
   860       by simp
   840   qed
   861   qed
   841   moreover have "L (append_rhs_rexp xrhs (\<Uplus>{r. Trn X r \<in> rhs})) = L ({Trn X r | r. Trn X r \<in> rhs})" 
   862   moreover have "L (append_rhs_rexp xrhs (\<Uplus>{r. Trn X r \<in> rhs})) = L ({Trn X r | r. Trn X r \<in> rhs})" 
   842     using finite substor  by (simp only:lang_of_append_rhs lang_of_rexp_of)
   863     using finite substor  by (simp only:lang_of_append_rhs lang_of_rexp_of)
   843   ultimately show ?thesis by simp
   864   ultimately show ?thesis by simp
   844 qed
   865 qed
   845 
   866 
   846 lemma subst_op_keeps_finite_rhs:
   867 lemma Subst_keeps_finite_rhs:
   847   "\<lbrakk>finite rhs; finite yrhs\<rbrakk> \<Longrightarrow> finite (subst_op rhs Y yrhs)"
   868   "\<lbrakk>finite rhs; finite yrhs\<rbrakk> \<Longrightarrow> finite (Subst rhs Y yrhs)"
   848 by (auto simp:subst_op_def append_keeps_finite)
   869 by (auto simp:Subst_def append_keeps_finite)
   849 
   870 
   850 lemma subst_op_all_keeps_finite:
   871 lemma Subst_all_keeps_finite:
   851   assumes finite:"finite (ES:: (string set \<times> rhs_item set) set)"
   872   assumes finite:"finite (ES:: (string set \<times> rhs_item set) set)"
   852   shows "finite (subst_op_all ES Y yrhs)"
   873   shows "finite (Subst_all ES Y yrhs)"
   853 proof -
   874 proof -
   854   have "finite {(Ya, subst_op yrhsa Y yrhs) |Ya yrhsa. (Ya, yrhsa) \<in> ES}" 
   875   have "finite {(Ya, Subst yrhsa Y yrhs) |Ya yrhsa. (Ya, yrhsa) \<in> ES}" 
   855                                                                   (is "finite ?A")
   876                                                                   (is "finite ?A")
   856   proof-
   877   proof-
   857     def eqns' \<equiv> "{((Ya::string set), yrhsa)| Ya yrhsa. (Ya, yrhsa) \<in> ES}"
   878     def eqns' \<equiv> "{((Ya::string set), yrhsa)| Ya yrhsa. (Ya, yrhsa) \<in> ES}"
   858     def h \<equiv> "\<lambda> ((Ya::string set), yrhsa). (Ya, subst_op yrhsa Y yrhs)"
   879     def h \<equiv> "\<lambda> ((Ya::string set), yrhsa). (Ya, Subst yrhsa Y yrhs)"
   859     have "finite (h ` eqns')" using finite h_def eqns'_def by auto
   880     have "finite (h ` eqns')" using finite h_def eqns'_def by auto
   860     moreover have "?A = h ` eqns'" by (auto simp:h_def eqns'_def)
   881     moreover have "?A = h ` eqns'" by (auto simp:h_def eqns'_def)
   861     ultimately show ?thesis by auto      
   882     ultimately show ?thesis by auto      
   862   qed
   883   qed
   863   thus ?thesis by (simp add:subst_op_all_def)
   884   thus ?thesis by (simp add:Subst_all_def)
   864 qed
   885 qed
   865 
   886 
   866 lemma subst_op_all_keeps_finite_rhs:
   887 lemma Subst_all_keeps_finite_rhs:
   867   "\<lbrakk>finite_rhs ES; finite yrhs\<rbrakk> \<Longrightarrow> finite_rhs (subst_op_all ES Y yrhs)"
   888   "\<lbrakk>finite_rhs ES; finite yrhs\<rbrakk> \<Longrightarrow> finite_rhs (Subst_all ES Y yrhs)"
   868 by (auto intro:subst_op_keeps_finite_rhs simp add:subst_op_all_def finite_rhs_def)
   889 by (auto intro:Subst_keeps_finite_rhs simp add:Subst_all_def finite_rhs_def)
   869 
   890 
   870 lemma append_rhs_keeps_cls:
   891 lemma append_rhs_keeps_cls:
   871   "classes_of (append_rhs_rexp rhs r) = classes_of rhs"
   892   "classes_of (append_rhs_rexp rhs r) = classes_of rhs"
   872 apply (auto simp:classes_of_def append_rhs_rexp_def)
   893 apply (auto simp:classes_of_def append_rhs_rexp_def)
   873 apply (case_tac xa, auto simp:image_def)
   894 apply (case_tac xa, auto simp:image_def)
   874 by (rule_tac x = "SEQ ra r" in exI, rule_tac x = "Trn x ra" in bexI, simp+)
   895 by (rule_tac x = "SEQ ra r" in exI, rule_tac x = "Trn x ra" in bexI, simp+)
   875 
   896 
   876 lemma arden_op_removes_cl:
   897 lemma Arden_removes_cl:
   877   "classes_of (arden_op Y yrhs) = classes_of yrhs - {Y}"
   898   "classes_of (Arden Y yrhs) = classes_of yrhs - {Y}"
   878 apply (simp add:arden_op_def append_rhs_keeps_cls trns_of_def)
   899 apply (simp add:Arden_def append_rhs_keeps_cls)
   879 by (auto simp:classes_of_def)
   900 by (auto simp:classes_of_def)
   880 
   901 
   881 lemma lefts_of_keeps_cls:
   902 lemma lefts_of_keeps_cls:
   882   "lefts_of (subst_op_all ES Y yrhs) = lefts_of ES"
   903   "lefts_of (Subst_all ES Y yrhs) = lefts_of ES"
   883 by (auto simp:lefts_of_def subst_op_all_def)
   904 by (auto simp:lefts_of_def Subst_all_def)
   884 
   905 
   885 lemma subst_op_updates_cls:
   906 lemma Subst_updates_cls:
   886   "X \<notin> classes_of xrhs \<Longrightarrow> 
   907   "X \<notin> classes_of xrhs \<Longrightarrow> 
   887       classes_of (subst_op rhs X xrhs) = classes_of rhs \<union> classes_of xrhs - {X}"
   908       classes_of (Subst rhs X xrhs) = classes_of rhs \<union> classes_of xrhs - {X}"
   888 apply (simp only:subst_op_def append_rhs_keeps_cls 
   909 apply (simp only:Subst_def append_rhs_keeps_cls 
   889                               classes_of_union_distrib[THEN sym])
   910                               classes_of_union_distrib[THEN sym])
   890 by (auto simp:classes_of_def trns_of_def)
   911 by (auto simp:classes_of_def)
   891 
   912 
   892 lemma subst_op_all_keeps_self_contained:
   913 lemma Subst_all_keeps_self_contained:
   893   fixes Y
   914   fixes Y
   894   assumes sc: "self_contained (ES \<union> {(Y, yrhs)})" (is "self_contained ?A")
   915   assumes sc: "self_contained (ES \<union> {(Y, yrhs)})" (is "self_contained ?A")
   895   shows "self_contained (subst_op_all ES Y (arden_op Y yrhs))" 
   916   shows "self_contained (Subst_all ES Y (Arden Y yrhs))" 
   896                                                    (is "self_contained ?B")
   917                                                    (is "self_contained ?B")
   897 proof-
   918 proof-
   898   { fix X xrhs'
   919   { fix X xrhs'
   899     assume "(X, xrhs') \<in> ?B"
   920     assume "(X, xrhs') \<in> ?B"
   900     then obtain xrhs 
   921     then obtain xrhs 
   901       where xrhs_xrhs': "xrhs' = subst_op xrhs Y (arden_op Y yrhs)"
   922       where xrhs_xrhs': "xrhs' = Subst xrhs Y (Arden Y yrhs)"
   902       and X_in: "(X, xrhs) \<in> ES" by (simp add:subst_op_all_def, blast)    
   923       and X_in: "(X, xrhs) \<in> ES" by (simp add:Subst_all_def, blast)    
   903     have "classes_of xrhs' \<subseteq> lefts_of ?B"
   924     have "classes_of xrhs' \<subseteq> lefts_of ?B"
   904     proof-
   925     proof-
   905       have "lefts_of ?B = lefts_of ES" by (auto simp add:lefts_of_def subst_op_all_def)
   926       have "lefts_of ?B = lefts_of ES" by (auto simp add:lefts_of_def Subst_all_def)
   906       moreover have "classes_of xrhs' \<subseteq> lefts_of ES"
   927       moreover have "classes_of xrhs' \<subseteq> lefts_of ES"
   907       proof-
   928       proof-
   908         have "classes_of xrhs' \<subseteq> 
   929         have "classes_of xrhs' \<subseteq> 
   909                         classes_of xrhs \<union> classes_of (arden_op Y yrhs) - {Y}"
   930                         classes_of xrhs \<union> classes_of (Arden Y yrhs) - {Y}"
   910         proof-
   931         proof-
   911           have "Y \<notin> classes_of (arden_op Y yrhs)" 
   932           have "Y \<notin> classes_of (Arden Y yrhs)" 
   912             using arden_op_removes_cl by simp
   933             using Arden_removes_cl by simp
   913           thus ?thesis using xrhs_xrhs' by (auto simp:subst_op_updates_cls)
   934           thus ?thesis using xrhs_xrhs' by (auto simp:Subst_updates_cls)
   914         qed
   935         qed
   915         moreover have "classes_of xrhs \<subseteq> lefts_of ES \<union> {Y}" using X_in sc
   936         moreover have "classes_of xrhs \<subseteq> lefts_of ES \<union> {Y}" using X_in sc
   916           apply (simp only:self_contained_def lefts_of_union_distrib[THEN sym])
   937           apply (simp only:self_contained_def lefts_of_union_distrib[THEN sym])
   917           by (drule_tac x = "(X, xrhs)" in bspec, auto simp:lefts_of_def)
   938           by (drule_tac x = "(X, xrhs)" in bspec, auto simp:lefts_of_def)
   918         moreover have "classes_of (arden_op Y yrhs) \<subseteq> lefts_of ES \<union> {Y}" 
   939         moreover have "classes_of (Arden Y yrhs) \<subseteq> lefts_of ES \<union> {Y}" 
   919           using sc 
   940           using sc 
   920           by (auto simp add:arden_op_removes_cl self_contained_def lefts_of_def)
   941           by (auto simp add:Arden_removes_cl self_contained_def lefts_of_def)
   921         ultimately show ?thesis by auto
   942         ultimately show ?thesis by auto
   922       qed
   943       qed
   923       ultimately show ?thesis by simp
   944       ultimately show ?thesis by simp
   924     qed
   945     qed
   925   } thus ?thesis by (auto simp only:subst_op_all_def self_contained_def)
   946   } thus ?thesis by (auto simp only:Subst_all_def self_contained_def)
   926 qed
   947 qed
   927 
   948 
   928 lemma subst_op_all_satisfy_invariant:
   949 lemma Subst_all_satisfy_invariant:
   929   assumes invariant_ES: "invariant (ES \<union> {(Y, yrhs)})"
   950   assumes invariant_ES: "invariant (ES \<union> {(Y, yrhs)})"
   930   shows "invariant (subst_op_all ES Y (arden_op Y yrhs))"
   951   shows "invariant (Subst_all ES Y (Arden Y yrhs))"
   931 proof -  
   952 proof -  
   932   have finite_yrhs: "finite yrhs" 
   953   have finite_yrhs: "finite yrhs" 
   933     using invariant_ES by (auto simp:invariant_def finite_rhs_def)
   954     using invariant_ES by (auto simp:invariant_def finite_rhs_def)
   934   have nonempty_yrhs: "rhs_nonempty yrhs" 
   955   have nonempty_yrhs: "rhs_nonempty yrhs" 
   935     using invariant_ES by (auto simp:invariant_def ardenable_def)
   956     using invariant_ES by (auto simp:invariant_def ardenable_def)
   936   have Y_eq_yrhs: "Y = L yrhs" 
   957   have Y_eq_yrhs: "Y = L yrhs" 
   937     using invariant_ES by (simp only:invariant_def valid_eqns_def, blast)
   958     using invariant_ES by (simp only:invariant_def valid_eqns_def, blast)
   938   have "distinct_equas (subst_op_all ES Y (arden_op Y yrhs))" 
   959   have "distinct_equas (Subst_all ES Y (Arden Y yrhs))" 
   939     using invariant_ES
   960     using invariant_ES
   940     by (auto simp:distinct_equas_def subst_op_all_def invariant_def)
   961     by (auto simp:distinct_equas_def Subst_all_def invariant_def)
   941   moreover have "finite (subst_op_all ES Y (arden_op Y yrhs))" 
   962   moreover have "finite (Subst_all ES Y (Arden Y yrhs))" 
   942     using invariant_ES by (simp add:invariant_def subst_op_all_keeps_finite)
   963     using invariant_ES by (simp add:invariant_def Subst_all_keeps_finite)
   943   moreover have "finite_rhs (subst_op_all ES Y (arden_op Y yrhs))"
   964   moreover have "finite_rhs (Subst_all ES Y (Arden Y yrhs))"
   944   proof-
   965   proof-
   945     have "finite_rhs ES" using invariant_ES 
   966     have "finite_rhs ES" using invariant_ES 
   946       by (simp add:invariant_def finite_rhs_def)
   967       by (simp add:invariant_def finite_rhs_def)
   947     moreover have "finite (arden_op Y yrhs)"
   968     moreover have "finite (Arden Y yrhs)"
   948     proof -
   969     proof -
   949       have "finite yrhs" using invariant_ES 
   970       have "finite yrhs" using invariant_ES 
   950         by (auto simp:invariant_def finite_rhs_def)
   971         by (auto simp:invariant_def finite_rhs_def)
   951       thus ?thesis using arden_op_keeps_finite by simp
   972       thus ?thesis using Arden_keeps_finite by simp
   952     qed
   973     qed
   953     ultimately show ?thesis 
   974     ultimately show ?thesis 
   954       by (simp add:subst_op_all_keeps_finite_rhs)
   975       by (simp add:Subst_all_keeps_finite_rhs)
   955   qed
   976   qed
   956   moreover have "ardenable (subst_op_all ES Y (arden_op Y yrhs))"
   977   moreover have "ardenable (Subst_all ES Y (Arden Y yrhs))"
   957   proof - 
   978   proof - 
   958     { fix X rhs
   979     { fix X rhs
   959       assume "(X, rhs) \<in> ES"
   980       assume "(X, rhs) \<in> ES"
   960       hence "rhs_nonempty rhs"  using prems invariant_ES  
   981       hence "rhs_nonempty rhs"  using prems invariant_ES  
   961         by (simp add:invariant_def ardenable_def)
   982         by (simp add:invariant_def ardenable_def)
   962       with nonempty_yrhs 
   983       with nonempty_yrhs 
   963       have "rhs_nonempty (subst_op rhs Y (arden_op Y yrhs))"
   984       have "rhs_nonempty (Subst rhs Y (Arden Y yrhs))"
   964         by (simp add:nonempty_yrhs 
   985         by (simp add:nonempty_yrhs 
   965                subst_op_keeps_nonempty arden_op_keeps_nonempty)
   986                Subst_keeps_nonempty Arden_keeps_nonempty)
   966     } thus ?thesis by (auto simp add:ardenable_def subst_op_all_def)
   987     } thus ?thesis by (auto simp add:ardenable_def Subst_all_def)
   967   qed
   988   qed
   968   moreover have "valid_eqns (subst_op_all ES Y (arden_op Y yrhs))"
   989   moreover have "valid_eqns (Subst_all ES Y (Arden Y yrhs))"
   969   proof-
   990   proof-
   970     have "Y = L (arden_op Y yrhs)" 
   991     have "Y = L (Arden Y yrhs)" 
   971       using Y_eq_yrhs invariant_ES finite_yrhs nonempty_yrhs      
   992       using Y_eq_yrhs invariant_ES finite_yrhs nonempty_yrhs      
   972       by (rule_tac arden_op_keeps_eq, (simp add:rexp_of_empty)+)
   993       by (rule_tac Arden_keeps_eq, (simp add:rexp_of_empty)+)
   973     thus ?thesis using invariant_ES 
   994     thus ?thesis using invariant_ES 
   974       by (clarsimp simp add:valid_eqns_def 
   995       by (clarsimp simp add:valid_eqns_def 
   975               subst_op_all_def subst_op_keeps_eq invariant_def finite_rhs_def
   996               Subst_all_def Subst_keeps_eq invariant_def finite_rhs_def
   976                    simp del:L_rhs.simps)
   997                    simp del:L_rhs.simps)
   977   qed
   998   qed
   978   moreover 
   999   moreover 
   979   have self_subst: "self_contained (subst_op_all ES Y (arden_op Y yrhs))"
  1000   have self_subst: "self_contained (Subst_all ES Y (Arden Y yrhs))"
   980     using invariant_ES subst_op_all_keeps_self_contained by (simp add:invariant_def)
  1001     using invariant_ES Subst_all_keeps_self_contained by (simp add:invariant_def)
   981   ultimately show ?thesis using invariant_ES by (simp add:invariant_def)
  1002   ultimately show ?thesis using invariant_ES by (simp add:invariant_def)
   982 qed
  1003 qed
   983 
  1004 
   984 lemma subst_op_all_card_le: 
  1005 lemma Subst_all_card_le: 
   985   assumes finite: "finite (ES::(string set \<times> rhs_item set) set)"
  1006   assumes finite: "finite (ES::(string set \<times> rhs_item set) set)"
   986   shows "card (subst_op_all ES Y yrhs) <= card ES"
  1007   shows "card (Subst_all ES Y yrhs) <= card ES"
   987 proof-
  1008 proof-
   988   def f \<equiv> "\<lambda> x. ((fst x)::string set, subst_op (snd x) Y yrhs)"
  1009   def f \<equiv> "\<lambda> x. ((fst x)::string set, Subst (snd x) Y yrhs)"
   989   have "subst_op_all ES Y yrhs = f ` ES" 
  1010   have "Subst_all ES Y yrhs = f ` ES" 
   990     apply (auto simp:subst_op_all_def f_def image_def)
  1011     apply (auto simp:Subst_all_def f_def image_def)
   991     by (rule_tac x = "(Ya, yrhsa)" in bexI, simp+)
  1012     by (rule_tac x = "(Ya, yrhsa)" in bexI, simp+)
   992   thus ?thesis using finite by (auto intro:card_image_le)
  1013   thus ?thesis using finite by (auto intro:card_image_le)
   993 qed
  1014 qed
   994 
  1015 
   995 lemma subst_op_all_cls_remains: 
  1016 lemma Subst_all_cls_remains: 
   996   "(X, xrhs) \<in> ES \<Longrightarrow> \<exists> xrhs'. (X, xrhs') \<in> (subst_op_all ES Y yrhs)"
  1017   "(X, xrhs) \<in> ES \<Longrightarrow> \<exists> xrhs'. (X, xrhs') \<in> (Subst_all ES Y yrhs)"
   997 by (auto simp:subst_op_all_def)
  1018 by (auto simp:Subst_all_def)
   998 
  1019 
   999 lemma card_noteq_1_has_more:
  1020 lemma card_noteq_1_has_more:
  1000   assumes card:"card S \<noteq> 1"
  1021   assumes card:"card S \<noteq> 1"
  1001   and e_in: "e \<in> S"
  1022   and e_in: "e \<in> S"
  1002   and finite: "finite S"
  1023   and finite: "finite S"
  1029     from X_in_ES Y_in_ES and not_eq and Inv_ES
  1050     from X_in_ES Y_in_ES and not_eq and Inv_ES
  1030     show "(Y, yrhs) \<in> ES \<and> X \<noteq> Y"
  1051     show "(Y, yrhs) \<in> ES \<and> X \<noteq> Y"
  1031       by (auto simp: invariant_def distinct_equas_def)
  1052       by (auto simp: invariant_def distinct_equas_def)
  1032   next
  1053   next
  1033     fix x
  1054     fix x
  1034     let ?ES' = "let (Y, yrhs) = x in subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)"
  1055     let ?ES' = "let (Y, yrhs) = x in Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)"
  1035     assume prem: "case x of (Y, yrhs) \<Rightarrow> (Y, yrhs) \<in> ES \<and> (X \<noteq> Y)"
  1056     assume prem: "case x of (Y, yrhs) \<Rightarrow> (Y, yrhs) \<in> ES \<and> (X \<noteq> Y)"
  1036     thus "invariant (?ES') \<and> (\<exists>xrhs'. (X, xrhs') \<in> ?ES') \<and> (?ES', ES) \<in> measure card"
  1057     thus "invariant (?ES') \<and> (\<exists>xrhs'. (X, xrhs') \<in> ?ES') \<and> (?ES', ES) \<in> measure card"
  1037     proof(cases "x", simp)
  1058     proof(cases "x", simp)
  1038       fix Y yrhs
  1059       fix Y yrhs
  1039       assume h: "(Y, yrhs) \<in> ES \<and>  X \<noteq> Y" 
  1060       assume h: "(Y, yrhs) \<in> ES \<and>  X \<noteq> Y" 
  1040       show "invariant (subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)) \<and>
  1061       show "invariant (Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)) \<and>
  1041              (\<exists>xrhs'. (X, xrhs') \<in> subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)) \<and>
  1062              (\<exists>xrhs'. (X, xrhs') \<in> Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)) \<and>
  1042              card (subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)) < card ES"
  1063              card (Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)) < card ES"
  1043       proof -
  1064       proof -
  1044         have "invariant (subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs))" 
  1065         have "invariant (Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs))" 
  1045         proof(rule subst_op_all_satisfy_invariant)
  1066         proof(rule Subst_all_satisfy_invariant)
  1046           from h have "(Y, yrhs) \<in> ES" by simp
  1067           from h have "(Y, yrhs) \<in> ES" by simp
  1047           hence "ES - {(Y, yrhs)} \<union> {(Y, yrhs)} = ES" by auto
  1068           hence "ES - {(Y, yrhs)} \<union> {(Y, yrhs)} = ES" by auto
  1048           with Inv_ES show "invariant (ES - {(Y, yrhs)} \<union> {(Y, yrhs)})" by auto
  1069           with Inv_ES show "invariant (ES - {(Y, yrhs)} \<union> {(Y, yrhs)})" by auto
  1049         qed
  1070         qed
  1050         moreover have 
  1071         moreover have 
  1051           "(\<exists>xrhs'. (X, xrhs') \<in> subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs))"
  1072           "(\<exists>xrhs'. (X, xrhs') \<in> Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs))"
  1052         proof(rule subst_op_all_cls_remains)
  1073         proof(rule Subst_all_cls_remains)
  1053           from X_in_ES and h
  1074           from X_in_ES and h
  1054           show "(X, xrhs) \<in> ES - {(Y, yrhs)}" by auto
  1075           show "(X, xrhs) \<in> ES - {(Y, yrhs)}" by auto
  1055         qed
  1076         qed
  1056         moreover have 
  1077         moreover have 
  1057           "card (subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)) < card ES"
  1078           "card (Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)) < card ES"
  1058         proof(rule le_less_trans)
  1079         proof(rule le_less_trans)
  1059           show 
  1080           show 
  1060             "card (subst_op_all (ES - {(Y, yrhs)}) Y (arden_op Y yrhs)) \<le> 
  1081             "card (Subst_all (ES - {(Y, yrhs)}) Y (Arden Y yrhs)) \<le> 
  1061                                                                 card (ES - {(Y, yrhs)})"
  1082                                                                 card (ES - {(Y, yrhs)})"
  1062           proof(rule subst_op_all_card_le)
  1083           proof(rule Subst_all_card_le)
  1063             show "finite (ES - {(Y, yrhs)})" using finite_ES by auto
  1084             show "finite (ES - {(Y, yrhs)})" using finite_ES by auto
  1064           qed
  1085           qed
  1065         next
  1086         next
  1066           show "card (ES - {(Y, yrhs)}) < card ES" using finite_ES h
  1087           show "card (ES - {(Y, yrhs)}) < card ES" using finite_ES h
  1067             by (auto simp:card_gt_0_iff intro:diff_Suc_less)
  1088             by (auto simp:card_gt_0_iff intro:diff_Suc_less)
  1068         qed
  1089         qed
  1069         ultimately show ?thesis 
  1090         ultimately show ?thesis 
  1070           by (auto dest: subst_op_all_card_le elim:le_less_trans)
  1091           by (auto dest: Subst_all_card_le elim:le_less_trans)
  1071       qed
  1092       qed
  1072     qed
  1093     qed
  1073   qed
  1094   qed
  1074 qed
  1095 qed
  1075 
  1096 
  1124 
  1145 
  1125 lemma last_cl_exists_rexp:
  1146 lemma last_cl_exists_rexp:
  1126   assumes Inv_ES: "invariant {(X, xrhs)}"
  1147   assumes Inv_ES: "invariant {(X, xrhs)}"
  1127   shows "\<exists> (r::rexp). L r = X" (is "\<exists> r. ?P r")
  1148   shows "\<exists> (r::rexp). L r = X" (is "\<exists> r. ?P r")
  1128 proof-
  1149 proof-
  1129   def A \<equiv> "arden_op X xrhs"
  1150   def A \<equiv> "Arden X xrhs"
  1130   have "?P (\<Uplus>{r. Lam r \<in> A})"
  1151   have "?P (\<Uplus>{r. Lam r \<in> A})"
  1131   proof -
  1152   proof -
  1132     have "L (\<Uplus>{r. Lam r \<in> A}) = L ({Lam r | r. Lam r \<in>  A})"
  1153     have "L (\<Uplus>{r. Lam r \<in> A}) = L ({Lam r | r. Lam r \<in>  A})"
  1133     proof(rule rexp_of_lam_eq_lam_set)
  1154     proof(rule rexp_of_lam_eq_lam_set)
  1134       show "finite A" 
  1155       show "finite A" 
  1135 	unfolding A_def
  1156 	unfolding A_def
  1136 	using Inv_ES
  1157 	using Inv_ES
  1137         by (rule_tac arden_op_keeps_finite) 
  1158         by (rule_tac Arden_keeps_finite) 
  1138            (auto simp add: invariant_def finite_rhs_def)
  1159            (auto simp add: invariant_def finite_rhs_def)
  1139     qed
  1160     qed
  1140     also have "\<dots> = L A"
  1161     also have "\<dots> = L A"
  1141     proof-
  1162     proof-
  1142       have "{Lam r | r. Lam r \<in> A} = A"
  1163       have "{Lam r | r. Lam r \<in> A} = A"
  1143       proof-
  1164       proof-
  1144         have "classes_of A = {}" using Inv_ES 
  1165         have "classes_of A = {}" using Inv_ES 
  1145 	  unfolding A_def
  1166 	  unfolding A_def
  1146           by (simp add:arden_op_removes_cl 
  1167           by (simp add:Arden_removes_cl 
  1147                        self_contained_def invariant_def lefts_of_def) 
  1168                        self_contained_def invariant_def lefts_of_def) 
  1148         thus ?thesis
  1169         thus ?thesis
  1149 	  unfolding A_def
  1170 	  unfolding A_def
  1150           by (auto simp only: classes_of_def, case_tac x, auto)
  1171           by (auto simp only: classes_of_def, case_tac x, auto)
  1151       qed
  1172       qed
  1152       thus ?thesis by simp
  1173       thus ?thesis by simp
  1153     qed
  1174     qed
  1154     also have "\<dots> = X"
  1175     also have "\<dots> = X"
  1155     unfolding A_def
  1176     unfolding A_def
  1156     proof(rule arden_op_keeps_eq [THEN sym])
  1177     proof(rule Arden_keeps_eq [THEN sym])
  1157       show "X = L xrhs" using Inv_ES 
  1178       show "X = L xrhs" using Inv_ES 
  1158         by (auto simp only: invariant_def valid_eqns_def)  
  1179         by (auto simp only: invariant_def valid_eqns_def)  
  1159     next
  1180     next
  1160       from Inv_ES show "[] \<notin> L (\<Uplus>{r. Trn X r \<in> xrhs})"
  1181       from Inv_ES show "[] \<notin> L (\<Uplus>{r. Trn X r \<in> xrhs})"
  1161         by(simp add: invariant_def ardenable_def rexp_of_empty finite_rhs_def)
  1182         by(simp add: invariant_def ardenable_def rexp_of_empty finite_rhs_def)