src/HOL/Library/Kleene_Algebras.thy
changeset 23820 8290cd33c4d5
parent 23754 75873e94357c
child 24748 ee0a0eb6b738
equal deleted inserted replaced
23819:2040846d1bbe 23820:8290cd33c4d5
   246   from a have "x * a \<le> x" by (rule add_est2)
   246   from a have "x * a \<le> x" by (rule add_est2)
   247   with star4 show "x * star a \<le> x" .
   247   with star4 show "x * star a \<le> x" .
   248 qed
   248 qed
   249 
   249 
   250 
   250 
   251 lemma star_mono:
       
   252   fixes x y :: "'a :: kleene"
       
   253   assumes "x \<le> y"
       
   254   shows "star x \<le> star y"
       
   255   oops
       
   256 
       
   257 lemma star_idemp:
   251 lemma star_idemp:
   258   fixes x :: "'a :: kleene"
   252   fixes x :: "'a :: kleene"
   259   shows "star (star x) = star x"
   253   shows "star (star x) = star x"
   260   oops
   254   oops
   261 
       
   262 lemma zero_star[simp]:
       
   263   shows "star (0::'a::kleene) = 1"
       
   264   oops
       
   265 
       
   266 
   255 
   267 lemma star_unfold_left:
   256 lemma star_unfold_left:
   268   fixes a :: "'a :: kleene"
   257   fixes a :: "'a :: kleene"
   269   shows "1 + a * star a = star a"
   258   shows "1 + a * star a = star a"
   270 proof (rule order_antisym, rule star1)
   259 proof (rule order_antisym, rule star1)
   293 
   282 
   294   with star4' have "1 * star a \<le> 1 + star a * a" .
   283   with star4' have "1 * star a \<le> 1 + star a * a" .
   295   thus "star a \<le> 1 + star a * a" by simp
   284   thus "star a \<le> 1 + star a * a" by simp
   296 qed
   285 qed
   297 
   286 
   298 
   287 lemma star_zero[simp]:
       
   288   shows "star (0::'a::kleene) = 1"
       
   289   by (rule star_unfold_left[of 0, simplified])
   299 
   290 
   300 lemma star_commute:
   291 lemma star_commute:
   301   fixes a b x :: "'a :: kleene"
   292   fixes a b x :: "'a :: kleene"
   302   assumes a: "a * x = x * b"
   293   assumes a: "a * x = x * b"
   303   shows "star a * x = x * star b"
   294   shows "star a * x = x * star b"
   337         by (rule mult_mono[OF star2]) auto
   328         by (rule mult_mono[OF star2]) auto
   338       thus ?thesis
   329       thus ?thesis
   339         by (simp add:left_distrib mult_assoc)
   330         by (simp add:left_distrib mult_assoc)
   340     qed
   331     qed
   341   qed
   332   qed
   342 qed      
   333 qed
   343 
       
   344 
       
   345 
   334 
   346 lemma star_assoc:
   335 lemma star_assoc:
   347   fixes c d :: "'a :: kleene"
   336   fixes c d :: "'a :: kleene"
   348   shows "star (c * d) * c = c * star (d * c)"
   337   shows "star (c * d) * c = c * star (d * c)"
   349   oops
   338   by (auto simp:mult_assoc star_commute)  
   350 
   339 
   351 lemma star_dist:
   340 lemma star_dist:
   352   fixes a b :: "'a :: kleene"
   341   fixes a b :: "'a :: kleene"
   353   shows "star (a + b) = star a * star (b * star a)"
   342   shows "star (a + b) = star a * star (b * star a)"
   354   oops
   343   oops
   355 
   344 
   356 lemma star_one:
   345 lemma star_one:
   357   fixes a p p' :: "'a :: kleene"
   346   fixes a p p' :: "'a :: kleene"
   358   assumes "p * p' = 1" and "p' * p = 1"
   347   assumes "p * p' = 1" and "p' * p = 1"
   359   shows "p' * star a * p = star (p' * a * p)"
   348   shows "p' * star a * p = star (p' * a * p)"
       
   349 proof -
       
   350   from assms
       
   351   have "p' * star a * p = p' * star (p * p' * a) * p"
       
   352     by simp
       
   353   also have "\<dots> = p' * p * star (p' * a * p)"
       
   354     by (simp add: mult_assoc star_assoc)
       
   355   also have "\<dots> = star (p' * a * p)"
       
   356     by (simp add: assms)
       
   357   finally show ?thesis .
       
   358 qed
       
   359 
       
   360 lemma star_mono:
       
   361   fixes x y :: "'a :: kleene"
       
   362   assumes "x \<le> y"
       
   363   shows "star x \<le> star y"
   360   oops
   364   oops
   361 
   365 
   362 
       
   363 lemma star_zero: 
       
   364   "star (0::'a::kleene) = 1"
       
   365   by (rule star_unfold_left[of 0, simplified])
       
   366 
   366 
   367 
   367 
   368 (* Own lemmas *)
   368 (* Own lemmas *)
   369 
   369 
   370 
   370