src/HOL/Lattices.thy
changeset 44845 5e51075cbd97
parent 44085 a65e26f1427b
child 44918 6a80fbc4e72c
equal deleted inserted replaced
44844:f74a4175a3a8 44845:5e51075cbd97
    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)