src/HOL/Lattices.thy
changeset 34973 ae634fad947e
parent 34209 c7f621786035
child 35028 108662d50512
equal deleted inserted replaced
34972:cc1d4c3ca9db 34973:ae634fad947e
   110 end
   110 end
   111 
   111 
   112 
   112 
   113 subsubsection {* Equational laws *}
   113 subsubsection {* Equational laws *}
   114 
   114 
       
   115 sublocale lower_semilattice < inf!: semilattice inf
       
   116 proof
       
   117   fix a b c
       
   118   show "(a \<sqinter> b) \<sqinter> c = a \<sqinter> (b \<sqinter> c)"
       
   119     by (rule antisym) (auto intro: le_infI1 le_infI2)
       
   120   show "a \<sqinter> b = b \<sqinter> a"
       
   121     by (rule antisym) auto
       
   122   show "a \<sqinter> a = a"
       
   123     by (rule antisym) auto
       
   124 qed
       
   125 
   115 context lower_semilattice
   126 context lower_semilattice
   116 begin
   127 begin
   117 
   128 
       
   129 lemma inf_assoc: "(x \<sqinter> y) \<sqinter> z = x \<sqinter> (y \<sqinter> z)"
       
   130   by (fact inf.assoc)
       
   131 
   118 lemma inf_commute: "(x \<sqinter> y) = (y \<sqinter> x)"
   132 lemma inf_commute: "(x \<sqinter> y) = (y \<sqinter> x)"
   119   by (rule antisym) auto
   133   by (fact inf.commute)
   120 
   134 
   121 lemma inf_assoc: "(x \<sqinter> y) \<sqinter> z = x \<sqinter> (y \<sqinter> z)"
   135 lemma inf_left_commute: "x \<sqinter> (y \<sqinter> z) = y \<sqinter> (x \<sqinter> z)"
   122   by (rule antisym) (auto intro: le_infI1 le_infI2)
   136   by (fact inf.left_commute)
   123 
   137 
   124 lemma inf_idem[simp]: "x \<sqinter> x = x"
   138 lemma inf_idem: "x \<sqinter> x = x"
   125   by (rule antisym) auto
   139   by (fact inf.idem)
   126 
   140 
   127 lemma inf_left_idem[simp]: "x \<sqinter> (x \<sqinter> y) = x \<sqinter> y"
   141 lemma inf_left_idem: "x \<sqinter> (x \<sqinter> y) = x \<sqinter> y"
   128   by (rule antisym) (auto intro: le_infI2)
   142   by (fact inf.left_idem)
   129 
   143 
   130 lemma inf_absorb1: "x \<sqsubseteq> y \<Longrightarrow> x \<sqinter> y = x"
   144 lemma inf_absorb1: "x \<sqsubseteq> y \<Longrightarrow> x \<sqinter> y = x"
   131   by (rule antisym) auto
   145   by (rule antisym) auto
   132 
   146 
   133 lemma inf_absorb2: "y \<sqsubseteq> x \<Longrightarrow> x \<sqinter> y = y"
   147 lemma inf_absorb2: "y \<sqsubseteq> x \<Longrightarrow> x \<sqinter> y = y"
   134   by (rule antisym) auto
   148   by (rule antisym) auto
   135 
   149  
   136 lemma inf_left_commute: "x \<sqinter> (y \<sqinter> z) = y \<sqinter> (x \<sqinter> z)"
       
   137   by (rule mk_left_commute [of inf]) (fact inf_assoc inf_commute)+
       
   138   
       
   139 lemmas inf_aci = inf_commute inf_assoc inf_left_commute inf_left_idem
   150 lemmas inf_aci = inf_commute inf_assoc inf_left_commute inf_left_idem
   140 
   151 
   141 end
   152 end
   142 
   153 
       
   154 sublocale upper_semilattice < sup!: semilattice sup
       
   155 proof
       
   156   fix a b c
       
   157   show "(a \<squnion> b) \<squnion> c = a \<squnion> (b \<squnion> c)"
       
   158     by (rule antisym) (auto intro: le_supI1 le_supI2)
       
   159   show "a \<squnion> b = b \<squnion> a"
       
   160     by (rule antisym) auto
       
   161   show "a \<squnion> a = a"
       
   162     by (rule antisym) auto
       
   163 qed
       
   164 
   143 context upper_semilattice
   165 context upper_semilattice
   144 begin
   166 begin
   145 
   167 
       
   168 lemma sup_assoc: "(x \<squnion> y) \<squnion> z = x \<squnion> (y \<squnion> z)"
       
   169   by (fact sup.assoc)
       
   170 
   146 lemma sup_commute: "(x \<squnion> y) = (y \<squnion> x)"
   171 lemma sup_commute: "(x \<squnion> y) = (y \<squnion> x)"
   147   by (rule antisym) auto
   172   by (fact sup.commute)
   148 
   173 
   149 lemma sup_assoc: "(x \<squnion> y) \<squnion> z = x \<squnion> (y \<squnion> z)"
   174 lemma sup_left_commute: "x \<squnion> (y \<squnion> z) = y \<squnion> (x \<squnion> z)"
   150   by (rule antisym) (auto intro: le_supI1 le_supI2)
   175   by (fact sup.left_commute)
   151 
   176 
   152 lemma sup_idem[simp]: "x \<squnion> x = x"
   177 lemma sup_idem: "x \<squnion> x = x"
   153   by (rule antisym) auto
   178   by (fact sup.idem)
   154 
   179 
   155 lemma sup_left_idem[simp]: "x \<squnion> (x \<squnion> y) = x \<squnion> y"
   180 lemma sup_left_idem: "x \<squnion> (x \<squnion> y) = x \<squnion> y"
   156   by (rule antisym) (auto intro: le_supI2)
   181   by (fact sup.left_idem)
   157 
   182 
   158 lemma sup_absorb1: "y \<sqsubseteq> x \<Longrightarrow> x \<squnion> y = x"
   183 lemma sup_absorb1: "y \<sqsubseteq> x \<Longrightarrow> x \<squnion> y = x"
   159   by (rule antisym) auto
   184   by (rule antisym) auto
   160 
   185 
   161 lemma sup_absorb2: "x \<sqsubseteq> y \<Longrightarrow> x \<squnion> y = y"
   186 lemma sup_absorb2: "x \<sqsubseteq> y \<Longrightarrow> x \<squnion> y = y"
   162   by (rule antisym) auto
   187   by (rule antisym) auto
   163 
       
   164 lemma sup_left_commute: "x \<squnion> (y \<squnion> z) = y \<squnion> (x \<squnion> z)"
       
   165   by (rule mk_left_commute [of sup]) (fact sup_assoc sup_commute)+
       
   166 
   188 
   167 lemmas sup_aci = sup_commute sup_assoc sup_left_commute sup_left_idem
   189 lemmas sup_aci = sup_commute sup_assoc sup_left_commute sup_left_idem
   168 
   190 
   169 end
   191 end
   170 
   192 
   512   by (rule ext)+ (auto intro: antisym)
   534   by (rule ext)+ (auto intro: antisym)
   513 
   535 
   514 lemmas le_maxI1 = min_max.sup_ge1
   536 lemmas le_maxI1 = min_max.sup_ge1
   515 lemmas le_maxI2 = min_max.sup_ge2
   537 lemmas le_maxI2 = min_max.sup_ge2
   516  
   538  
       
   539 lemmas min_ac = min_max.inf_assoc min_max.inf_commute
       
   540   min_max.inf.left_commute
       
   541 
   517 lemmas max_ac = min_max.sup_assoc min_max.sup_commute
   542 lemmas max_ac = min_max.sup_assoc min_max.sup_commute
   518   mk_left_commute [of max, OF min_max.sup_assoc min_max.sup_commute]
   543   min_max.sup.left_commute
   519 
   544 
   520 lemmas min_ac = min_max.inf_assoc min_max.inf_commute
       
   521   mk_left_commute [of min, OF min_max.inf_assoc min_max.inf_commute]
       
   522 
   545 
   523 
   546 
   524 subsection {* Bool as lattice *}
   547 subsection {* Bool as lattice *}
   525 
   548 
   526 instantiation bool :: boolean_algebra
   549 instantiation bool :: boolean_algebra