49 less_eq (infix "\<sqsubseteq>" 50) and |
49 less_eq (infix "\<sqsubseteq>" 50) and |
50 less (infix "\<sqsubset>" 50) and |
50 less (infix "\<sqsubset>" 50) and |
51 bot ("\<bottom>") and |
51 bot ("\<bottom>") and |
52 top ("\<top>") |
52 top ("\<top>") |
53 |
53 |
54 |
54 class inf = |
55 class semilattice_inf = order + |
|
56 fixes inf :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<sqinter>" 70) |
55 fixes inf :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<sqinter>" 70) |
|
56 |
|
57 class sup = |
|
58 fixes sup :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<squnion>" 65) |
|
59 |
|
60 class semilattice_inf = order + inf + |
57 assumes inf_le1 [simp]: "x \<sqinter> y \<sqsubseteq> x" |
61 assumes inf_le1 [simp]: "x \<sqinter> y \<sqsubseteq> x" |
58 and inf_le2 [simp]: "x \<sqinter> y \<sqsubseteq> y" |
62 and inf_le2 [simp]: "x \<sqinter> y \<sqsubseteq> y" |
59 and inf_greatest: "x \<sqsubseteq> y \<Longrightarrow> x \<sqsubseteq> z \<Longrightarrow> x \<sqsubseteq> y \<sqinter> z" |
63 and inf_greatest: "x \<sqsubseteq> y \<Longrightarrow> x \<sqsubseteq> z \<Longrightarrow> x \<sqsubseteq> y \<sqinter> z" |
60 |
64 |
61 class semilattice_sup = order + |
65 class semilattice_sup = order + sup + |
62 fixes sup :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<squnion>" 65) |
|
63 assumes sup_ge1 [simp]: "x \<sqsubseteq> x \<squnion> y" |
66 assumes sup_ge1 [simp]: "x \<sqsubseteq> x \<squnion> y" |
64 and sup_ge2 [simp]: "y \<sqsubseteq> x \<squnion> y" |
67 and sup_ge2 [simp]: "y \<sqsubseteq> x \<squnion> y" |
65 and sup_least: "y \<sqsubseteq> x \<Longrightarrow> z \<sqsubseteq> x \<Longrightarrow> y \<squnion> z \<sqsubseteq> x" |
68 and sup_least: "y \<sqsubseteq> x \<Longrightarrow> z \<sqsubseteq> x \<Longrightarrow> y \<squnion> z \<sqsubseteq> x" |
66 begin |
69 begin |
67 |
70 |
68 text {* Dual lattice *} |
71 text {* Dual lattice *} |
69 |
72 |
70 lemma dual_semilattice: |
73 lemma dual_semilattice: |
71 "class.semilattice_inf greater_eq greater sup" |
74 "class.semilattice_inf sup greater_eq greater" |
72 by (rule class.semilattice_inf.intro, rule dual_order) |
75 by (rule class.semilattice_inf.intro, rule dual_order) |
73 (unfold_locales, simp_all add: sup_least) |
76 (unfold_locales, simp_all add: sup_least) |
74 |
77 |
75 end |
78 end |
76 |
79 |
234 |
237 |
235 context lattice |
238 context lattice |
236 begin |
239 begin |
237 |
240 |
238 lemma dual_lattice: |
241 lemma dual_lattice: |
239 "class.lattice (op \<ge>) (op >) sup inf" |
242 "class.lattice sup (op \<ge>) (op >) inf" |
240 by (rule class.lattice.intro, rule dual_semilattice, rule class.semilattice_sup.intro, rule dual_order) |
243 by (rule class.lattice.intro, rule dual_semilattice, rule class.semilattice_sup.intro, rule dual_order) |
241 (unfold_locales, auto) |
244 (unfold_locales, auto) |
242 |
245 |
243 lemma inf_sup_absorb (*[simp]*): "x \<sqinter> (x \<squnion> y) = x" |
246 lemma inf_sup_absorb (*[simp]*): "x \<sqinter> (x \<squnion> y) = x" |
244 by (blast intro: antisym inf_le1 inf_greatest sup_ge1) |
247 by (blast intro: antisym inf_le1 inf_greatest sup_ge1) |
305 begin |
308 begin |
306 |
309 |
307 lemma less_supI1: |
310 lemma less_supI1: |
308 "x \<sqsubset> a \<Longrightarrow> x \<sqsubset> a \<squnion> b" |
311 "x \<sqsubset> a \<Longrightarrow> x \<sqsubset> a \<squnion> b" |
309 proof - |
312 proof - |
310 interpret dual: semilattice_inf "op \<ge>" "op >" sup |
313 interpret dual: semilattice_inf sup "op \<ge>" "op >" |
311 by (fact dual_semilattice) |
314 by (fact dual_semilattice) |
312 assume "x \<sqsubset> a" |
315 assume "x \<sqsubset> a" |
313 then show "x \<sqsubset> a \<squnion> b" |
316 then show "x \<sqsubset> a \<squnion> b" |
314 by (fact dual.less_infI1) |
317 by (fact dual.less_infI1) |
315 qed |
318 qed |
316 |
319 |
317 lemma less_supI2: |
320 lemma less_supI2: |
318 "x \<sqsubset> b \<Longrightarrow> x \<sqsubset> a \<squnion> b" |
321 "x \<sqsubset> b \<Longrightarrow> x \<sqsubset> a \<squnion> b" |
319 proof - |
322 proof - |
320 interpret dual: semilattice_inf "op \<ge>" "op >" sup |
323 interpret dual: semilattice_inf sup "op \<ge>" "op >" |
321 by (fact dual_semilattice) |
324 by (fact dual_semilattice) |
322 assume "x \<sqsubset> b" |
325 assume "x \<sqsubset> b" |
323 then show "x \<sqsubset> a \<squnion> b" |
326 then show "x \<sqsubset> a \<squnion> b" |
324 by (fact dual.less_infI2) |
327 by (fact dual.less_infI2) |
325 qed |
328 qed |
346 lemma inf_sup_distrib2: |
349 lemma inf_sup_distrib2: |
347 "(y \<squnion> z) \<sqinter> x = (y \<sqinter> x) \<squnion> (z \<sqinter> x)" |
350 "(y \<squnion> z) \<sqinter> x = (y \<sqinter> x) \<squnion> (z \<sqinter> x)" |
348 by(simp add: inf_sup_aci inf_sup_distrib1) |
351 by(simp add: inf_sup_aci inf_sup_distrib1) |
349 |
352 |
350 lemma dual_distrib_lattice: |
353 lemma dual_distrib_lattice: |
351 "class.distrib_lattice (op \<ge>) (op >) sup inf" |
354 "class.distrib_lattice sup (op \<ge>) (op >) inf" |
352 by (rule class.distrib_lattice.intro, rule dual_lattice) |
355 by (rule class.distrib_lattice.intro, rule dual_lattice) |
353 (unfold_locales, fact inf_sup_distrib1) |
356 (unfold_locales, fact inf_sup_distrib1) |
354 |
357 |
355 lemmas sup_inf_distrib = |
358 lemmas sup_inf_distrib = |
356 sup_inf_distrib1 sup_inf_distrib2 |
359 sup_inf_distrib1 sup_inf_distrib2 |
418 |
421 |
419 class bounded_lattice = bounded_lattice_bot + bounded_lattice_top |
422 class bounded_lattice = bounded_lattice_bot + bounded_lattice_top |
420 begin |
423 begin |
421 |
424 |
422 lemma dual_bounded_lattice: |
425 lemma dual_bounded_lattice: |
423 "class.bounded_lattice greater_eq greater sup inf \<top> \<bottom>" |
426 "class.bounded_lattice sup greater_eq greater inf \<top> \<bottom>" |
424 by unfold_locales (auto simp add: less_le_not_le) |
427 by unfold_locales (auto simp add: less_le_not_le) |
425 |
428 |
426 end |
429 end |
427 |
430 |
428 class boolean_algebra = distrib_lattice + bounded_lattice + minus + uminus + |
431 class boolean_algebra = distrib_lattice + bounded_lattice + minus + uminus + |
430 and sup_compl_top: "x \<squnion> - x = \<top>" |
433 and sup_compl_top: "x \<squnion> - x = \<top>" |
431 assumes diff_eq: "x - y = x \<sqinter> - y" |
434 assumes diff_eq: "x - y = x \<sqinter> - y" |
432 begin |
435 begin |
433 |
436 |
434 lemma dual_boolean_algebra: |
437 lemma dual_boolean_algebra: |
435 "class.boolean_algebra (\<lambda>x y. x \<squnion> - y) uminus greater_eq greater sup inf \<top> \<bottom>" |
438 "class.boolean_algebra (\<lambda>x y. x \<squnion> - y) uminus sup greater_eq greater inf \<top> \<bottom>" |
436 by (rule class.boolean_algebra.intro, rule dual_bounded_lattice, rule dual_distrib_lattice) |
439 by (rule class.boolean_algebra.intro, rule dual_bounded_lattice, rule dual_distrib_lattice) |
437 (unfold_locales, auto simp add: inf_compl_bot sup_compl_top diff_eq) |
440 (unfold_locales, auto simp add: inf_compl_bot sup_compl_top diff_eq) |
438 |
441 |
439 lemma compl_inf_bot (*[simp]*): |
442 lemma compl_inf_bot (*[simp]*): |
440 "- x \<sqinter> x = \<bottom>" |
443 "- x \<sqinter> x = \<bottom>" |
504 qed |
507 qed |
505 |
508 |
506 lemma compl_sup [simp]: |
509 lemma compl_sup [simp]: |
507 "- (x \<squnion> y) = - x \<sqinter> - y" |
510 "- (x \<squnion> y) = - x \<sqinter> - y" |
508 proof - |
511 proof - |
509 interpret boolean_algebra "\<lambda>x y. x \<squnion> - y" uminus greater_eq greater sup inf \<top> \<bottom> |
512 interpret boolean_algebra "\<lambda>x y. x \<squnion> - y" uminus sup greater_eq greater inf \<top> \<bottom> |
510 by (rule dual_boolean_algebra) |
513 by (rule dual_boolean_algebra) |
511 then show ?thesis by simp |
514 then show ?thesis by simp |
512 qed |
515 qed |
513 |
516 |
514 lemma compl_mono: |
517 lemma compl_mono: |
589 |
592 |
590 |
593 |
591 subsection {* @{const min}/@{const max} on linear orders as |
594 subsection {* @{const min}/@{const max} on linear orders as |
592 special case of @{const inf}/@{const sup} *} |
595 special case of @{const inf}/@{const sup} *} |
593 |
596 |
594 sublocale linorder < min_max!: distrib_lattice less_eq less min max |
597 sublocale linorder < min_max!: distrib_lattice min less_eq less max |
595 proof |
598 proof |
596 fix x y z |
599 fix x y z |
597 show "max x (min y z) = min (max x y) (max x z)" |
600 show "max x (min y z) = min (max x y) (max x z)" |
598 by (auto simp add: min_def max_def) |
601 by (auto simp add: min_def max_def) |
599 qed (auto simp add: min_def max_def not_le less_imp_le) |
602 qed (auto simp add: min_def max_def not_le less_imp_le) |