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 |