src/HOL/Library/Set_Algebras.thy
changeset 47445 69e96e5500df
parent 47444 d21c95af2df7
child 47446 ed0795caec95
equal deleted inserted replaced
47444:d21c95af2df7 47445:69e96e5500df
    32 
    32 
    33 instance ..
    33 instance ..
    34 
    34 
    35 end
    35 end
    36 
    36 
    37 
       
    38 text {* Legacy syntax: *}
       
    39 
       
    40 abbreviation (input) set_plus :: "'a::plus set \<Rightarrow> 'a set \<Rightarrow> 'a set" (infixl "\<oplus>" 65) where
       
    41   "A \<oplus> B \<equiv> A + B"
       
    42 abbreviation (input) set_times :: "'a::times set \<Rightarrow> 'a set \<Rightarrow> 'a set" (infixl "\<otimes>" 70) where
       
    43   "A \<otimes> B \<equiv> A * B"
       
    44 
       
    45 instantiation set :: (zero) zero
    37 instantiation set :: (zero) zero
    46 begin
    38 begin
    47 
    39 
    48 definition
    40 definition
    49   set_zero[simp]: "0::('a::zero)set == {0}"
    41   set_zero[simp]: "0::('a::zero)set == {0}"
    93 by default (simp_all add: set_times_def)
    85 by default (simp_all add: set_times_def)
    94 
    86 
    95 instance set :: (comm_monoid_mult) comm_monoid_mult
    87 instance set :: (comm_monoid_mult) comm_monoid_mult
    96 by default (simp_all add: set_times_def)
    88 by default (simp_all add: set_times_def)
    97 
    89 
    98 lemma set_plus_intro [intro]: "a : C ==> b : D ==> a + b : C \<oplus> D"
    90 lemma set_plus_intro [intro]: "a : C ==> b : D ==> a + b : C + D"
    99   by (auto simp add: set_plus_def)
    91   by (auto simp add: set_plus_def)
   100 
    92 
   101 lemma set_plus_intro2 [intro]: "b : C ==> a + b : a +o C"
    93 lemma set_plus_intro2 [intro]: "b : C ==> a + b : a +o C"
   102   by (auto simp add: elt_set_plus_def)
    94   by (auto simp add: elt_set_plus_def)
   103 
    95 
   104 lemma set_plus_rearrange: "((a::'a::comm_monoid_add) +o C) \<oplus>
    96 lemma set_plus_rearrange: "((a::'a::comm_monoid_add) +o C) +
   105     (b +o D) = (a + b) +o (C \<oplus> D)"
    97     (b +o D) = (a + b) +o (C + D)"
   106   apply (auto simp add: elt_set_plus_def set_plus_def add_ac)
    98   apply (auto simp add: elt_set_plus_def set_plus_def add_ac)
   107    apply (rule_tac x = "ba + bb" in exI)
    99    apply (rule_tac x = "ba + bb" in exI)
   108   apply (auto simp add: add_ac)
   100   apply (auto simp add: add_ac)
   109   apply (rule_tac x = "aa + a" in exI)
   101   apply (rule_tac x = "aa + a" in exI)
   110   apply (auto simp add: add_ac)
   102   apply (auto simp add: add_ac)
   112 
   104 
   113 lemma set_plus_rearrange2: "(a::'a::semigroup_add) +o (b +o C) =
   105 lemma set_plus_rearrange2: "(a::'a::semigroup_add) +o (b +o C) =
   114     (a + b) +o C"
   106     (a + b) +o C"
   115   by (auto simp add: elt_set_plus_def add_assoc)
   107   by (auto simp add: elt_set_plus_def add_assoc)
   116 
   108 
   117 lemma set_plus_rearrange3: "((a::'a::semigroup_add) +o B) \<oplus> C =
   109 lemma set_plus_rearrange3: "((a::'a::semigroup_add) +o B) + C =
   118     a +o (B \<oplus> C)"
   110     a +o (B + C)"
   119   apply (auto simp add: elt_set_plus_def set_plus_def)
   111   apply (auto simp add: elt_set_plus_def set_plus_def)
   120    apply (blast intro: add_ac)
   112    apply (blast intro: add_ac)
   121   apply (rule_tac x = "a + aa" in exI)
   113   apply (rule_tac x = "a + aa" in exI)
   122   apply (rule conjI)
   114   apply (rule conjI)
   123    apply (rule_tac x = "aa" in bexI)
   115    apply (rule_tac x = "aa" in bexI)
   124     apply auto
   116     apply auto
   125   apply (rule_tac x = "ba" in bexI)
   117   apply (rule_tac x = "ba" in bexI)
   126    apply (auto simp add: add_ac)
   118    apply (auto simp add: add_ac)
   127   done
   119   done
   128 
   120 
   129 theorem set_plus_rearrange4: "C \<oplus> ((a::'a::comm_monoid_add) +o D) =
   121 theorem set_plus_rearrange4: "C + ((a::'a::comm_monoid_add) +o D) =
   130     a +o (C \<oplus> D)"
   122     a +o (C + D)"
   131   apply (auto simp add: elt_set_plus_def set_plus_def add_ac)
   123   apply (auto simp add: elt_set_plus_def set_plus_def add_ac)
   132    apply (rule_tac x = "aa + ba" in exI)
   124    apply (rule_tac x = "aa + ba" in exI)
   133    apply (auto simp add: add_ac)
   125    apply (auto simp add: add_ac)
   134   done
   126   done
   135 
   127 
   138 
   130 
   139 lemma set_plus_mono [intro!]: "C <= D ==> a +o C <= a +o D"
   131 lemma set_plus_mono [intro!]: "C <= D ==> a +o C <= a +o D"
   140   by (auto simp add: elt_set_plus_def)
   132   by (auto simp add: elt_set_plus_def)
   141 
   133 
   142 lemma set_plus_mono2 [intro]: "(C::('a::plus) set) <= D ==> E <= F ==>
   134 lemma set_plus_mono2 [intro]: "(C::('a::plus) set) <= D ==> E <= F ==>
   143     C \<oplus> E <= D \<oplus> F"
   135     C + E <= D + F"
   144   by (auto simp add: set_plus_def)
   136   by (auto simp add: set_plus_def)
   145 
   137 
   146 lemma set_plus_mono3 [intro]: "a : C ==> a +o D <= C \<oplus> D"
   138 lemma set_plus_mono3 [intro]: "a : C ==> a +o D <= C + D"
   147   by (auto simp add: elt_set_plus_def set_plus_def)
   139   by (auto simp add: elt_set_plus_def set_plus_def)
   148 
   140 
   149 lemma set_plus_mono4 [intro]: "(a::'a::comm_monoid_add) : C ==>
   141 lemma set_plus_mono4 [intro]: "(a::'a::comm_monoid_add) : C ==>
   150     a +o D <= D \<oplus> C"
   142     a +o D <= D + C"
   151   by (auto simp add: elt_set_plus_def set_plus_def add_ac)
   143   by (auto simp add: elt_set_plus_def set_plus_def add_ac)
   152 
   144 
   153 lemma set_plus_mono5: "a:C ==> B <= D ==> a +o B <= C \<oplus> D"
   145 lemma set_plus_mono5: "a:C ==> B <= D ==> a +o B <= C + D"
   154   apply (subgoal_tac "a +o B <= a +o D")
   146   apply (subgoal_tac "a +o B <= a +o D")
   155    apply (erule order_trans)
   147    apply (erule order_trans)
   156    apply (erule set_plus_mono3)
   148    apply (erule set_plus_mono3)
   157   apply (erule set_plus_mono)
   149   apply (erule set_plus_mono)
   158   done
   150   done
   161     ==> x : a +o D"
   153     ==> x : a +o D"
   162   apply (frule set_plus_mono)
   154   apply (frule set_plus_mono)
   163   apply auto
   155   apply auto
   164   done
   156   done
   165 
   157 
   166 lemma set_plus_mono2_b: "C <= D ==> E <= F ==> x : C \<oplus> E ==>
   158 lemma set_plus_mono2_b: "C <= D ==> E <= F ==> x : C + E ==>
   167     x : D \<oplus> F"
   159     x : D + F"
   168   apply (frule set_plus_mono2)
   160   apply (frule set_plus_mono2)
   169    prefer 2
   161    prefer 2
   170    apply force
   162    apply force
   171   apply assumption
   163   apply assumption
   172   done
   164   done
   173 
   165 
   174 lemma set_plus_mono3_b: "a : C ==> x : a +o D ==> x : C \<oplus> D"
   166 lemma set_plus_mono3_b: "a : C ==> x : a +o D ==> x : C + D"
   175   apply (frule set_plus_mono3)
   167   apply (frule set_plus_mono3)
   176   apply auto
   168   apply auto
   177   done
   169   done
   178 
   170 
   179 lemma set_plus_mono4_b: "(a::'a::comm_monoid_add) : C ==>
   171 lemma set_plus_mono4_b: "(a::'a::comm_monoid_add) : C ==>
   180     x : a +o D ==> x : D \<oplus> C"
   172     x : a +o D ==> x : D + C"
   181   apply (frule set_plus_mono4)
   173   apply (frule set_plus_mono4)
   182   apply auto
   174   apply auto
   183   done
   175   done
   184 
   176 
   185 lemma set_zero_plus [simp]: "(0::'a::comm_monoid_add) +o C = C"
   177 lemma set_zero_plus [simp]: "(0::'a::comm_monoid_add) +o C = C"
   186   by (auto simp add: elt_set_plus_def)
   178   by (auto simp add: elt_set_plus_def)
   187 
   179 
   188 lemma set_zero_plus2: "(0::'a::comm_monoid_add) : A ==> B <= A \<oplus> B"
   180 lemma set_zero_plus2: "(0::'a::comm_monoid_add) : A ==> B <= A + B"
   189   apply (auto simp add: set_plus_def)
   181   apply (auto simp add: set_plus_def)
   190   apply (rule_tac x = 0 in bexI)
   182   apply (rule_tac x = 0 in bexI)
   191    apply (rule_tac x = x in bexI)
   183    apply (rule_tac x = x in bexI)
   192     apply (auto simp add: add_ac)
   184     apply (auto simp add: add_ac)
   193   done
   185   done
   204 
   196 
   205 lemma set_minus_plus: "((a::'a::ab_group_add) - b : C) = (a : b +o C)"
   197 lemma set_minus_plus: "((a::'a::ab_group_add) - b : C) = (a : b +o C)"
   206   by (rule iffI, rule set_minus_imp_plus, assumption, rule set_plus_imp_minus,
   198   by (rule iffI, rule set_minus_imp_plus, assumption, rule set_plus_imp_minus,
   207     assumption)
   199     assumption)
   208 
   200 
   209 lemma set_times_intro [intro]: "a : C ==> b : D ==> a * b : C \<otimes> D"
   201 lemma set_times_intro [intro]: "a : C ==> b : D ==> a * b : C * D"
   210   by (auto simp add: set_times_def)
   202   by (auto simp add: set_times_def)
   211 
   203 
   212 lemma set_times_intro2 [intro!]: "b : C ==> a * b : a *o C"
   204 lemma set_times_intro2 [intro!]: "b : C ==> a * b : a *o C"
   213   by (auto simp add: elt_set_times_def)
   205   by (auto simp add: elt_set_times_def)
   214 
   206 
   215 lemma set_times_rearrange: "((a::'a::comm_monoid_mult) *o C) \<otimes>
   207 lemma set_times_rearrange: "((a::'a::comm_monoid_mult) *o C) *
   216     (b *o D) = (a * b) *o (C \<otimes> D)"
   208     (b *o D) = (a * b) *o (C * D)"
   217   apply (auto simp add: elt_set_times_def set_times_def)
   209   apply (auto simp add: elt_set_times_def set_times_def)
   218    apply (rule_tac x = "ba * bb" in exI)
   210    apply (rule_tac x = "ba * bb" in exI)
   219    apply (auto simp add: mult_ac)
   211    apply (auto simp add: mult_ac)
   220   apply (rule_tac x = "aa * a" in exI)
   212   apply (rule_tac x = "aa * a" in exI)
   221   apply (auto simp add: mult_ac)
   213   apply (auto simp add: mult_ac)
   223 
   215 
   224 lemma set_times_rearrange2: "(a::'a::semigroup_mult) *o (b *o C) =
   216 lemma set_times_rearrange2: "(a::'a::semigroup_mult) *o (b *o C) =
   225     (a * b) *o C"
   217     (a * b) *o C"
   226   by (auto simp add: elt_set_times_def mult_assoc)
   218   by (auto simp add: elt_set_times_def mult_assoc)
   227 
   219 
   228 lemma set_times_rearrange3: "((a::'a::semigroup_mult) *o B) \<otimes> C =
   220 lemma set_times_rearrange3: "((a::'a::semigroup_mult) *o B) * C =
   229     a *o (B \<otimes> C)"
   221     a *o (B * C)"
   230   apply (auto simp add: elt_set_times_def set_times_def)
   222   apply (auto simp add: elt_set_times_def set_times_def)
   231    apply (blast intro: mult_ac)
   223    apply (blast intro: mult_ac)
   232   apply (rule_tac x = "a * aa" in exI)
   224   apply (rule_tac x = "a * aa" in exI)
   233   apply (rule conjI)
   225   apply (rule conjI)
   234    apply (rule_tac x = "aa" in bexI)
   226    apply (rule_tac x = "aa" in bexI)
   235     apply auto
   227     apply auto
   236   apply (rule_tac x = "ba" in bexI)
   228   apply (rule_tac x = "ba" in bexI)
   237    apply (auto simp add: mult_ac)
   229    apply (auto simp add: mult_ac)
   238   done
   230   done
   239 
   231 
   240 theorem set_times_rearrange4: "C \<otimes> ((a::'a::comm_monoid_mult) *o D) =
   232 theorem set_times_rearrange4: "C * ((a::'a::comm_monoid_mult) *o D) =
   241     a *o (C \<otimes> D)"
   233     a *o (C * D)"
   242   apply (auto simp add: elt_set_times_def set_times_def
   234   apply (auto simp add: elt_set_times_def set_times_def
   243     mult_ac)
   235     mult_ac)
   244    apply (rule_tac x = "aa * ba" in exI)
   236    apply (rule_tac x = "aa * ba" in exI)
   245    apply (auto simp add: mult_ac)
   237    apply (auto simp add: mult_ac)
   246   done
   238   done
   250 
   242 
   251 lemma set_times_mono [intro]: "C <= D ==> a *o C <= a *o D"
   243 lemma set_times_mono [intro]: "C <= D ==> a *o C <= a *o D"
   252   by (auto simp add: elt_set_times_def)
   244   by (auto simp add: elt_set_times_def)
   253 
   245 
   254 lemma set_times_mono2 [intro]: "(C::('a::times) set) <= D ==> E <= F ==>
   246 lemma set_times_mono2 [intro]: "(C::('a::times) set) <= D ==> E <= F ==>
   255     C \<otimes> E <= D \<otimes> F"
   247     C * E <= D * F"
   256   by (auto simp add: set_times_def)
   248   by (auto simp add: set_times_def)
   257 
   249 
   258 lemma set_times_mono3 [intro]: "a : C ==> a *o D <= C \<otimes> D"
   250 lemma set_times_mono3 [intro]: "a : C ==> a *o D <= C * D"
   259   by (auto simp add: elt_set_times_def set_times_def)
   251   by (auto simp add: elt_set_times_def set_times_def)
   260 
   252 
   261 lemma set_times_mono4 [intro]: "(a::'a::comm_monoid_mult) : C ==>
   253 lemma set_times_mono4 [intro]: "(a::'a::comm_monoid_mult) : C ==>
   262     a *o D <= D \<otimes> C"
   254     a *o D <= D * C"
   263   by (auto simp add: elt_set_times_def set_times_def mult_ac)
   255   by (auto simp add: elt_set_times_def set_times_def mult_ac)
   264 
   256 
   265 lemma set_times_mono5: "a:C ==> B <= D ==> a *o B <= C \<otimes> D"
   257 lemma set_times_mono5: "a:C ==> B <= D ==> a *o B <= C * D"
   266   apply (subgoal_tac "a *o B <= a *o D")
   258   apply (subgoal_tac "a *o B <= a *o D")
   267    apply (erule order_trans)
   259    apply (erule order_trans)
   268    apply (erule set_times_mono3)
   260    apply (erule set_times_mono3)
   269   apply (erule set_times_mono)
   261   apply (erule set_times_mono)
   270   done
   262   done
   273     ==> x : a *o D"
   265     ==> x : a *o D"
   274   apply (frule set_times_mono)
   266   apply (frule set_times_mono)
   275   apply auto
   267   apply auto
   276   done
   268   done
   277 
   269 
   278 lemma set_times_mono2_b: "C <= D ==> E <= F ==> x : C \<otimes> E ==>
   270 lemma set_times_mono2_b: "C <= D ==> E <= F ==> x : C * E ==>
   279     x : D \<otimes> F"
   271     x : D * F"
   280   apply (frule set_times_mono2)
   272   apply (frule set_times_mono2)
   281    prefer 2
   273    prefer 2
   282    apply force
   274    apply force
   283   apply assumption
   275   apply assumption
   284   done
   276   done
   285 
   277 
   286 lemma set_times_mono3_b: "a : C ==> x : a *o D ==> x : C \<otimes> D"
   278 lemma set_times_mono3_b: "a : C ==> x : a *o D ==> x : C * D"
   287   apply (frule set_times_mono3)
   279   apply (frule set_times_mono3)
   288   apply auto
   280   apply auto
   289   done
   281   done
   290 
   282 
   291 lemma set_times_mono4_b: "(a::'a::comm_monoid_mult) : C ==>
   283 lemma set_times_mono4_b: "(a::'a::comm_monoid_mult) : C ==>
   292     x : a *o D ==> x : D \<otimes> C"
   284     x : a *o D ==> x : D * C"
   293   apply (frule set_times_mono4)
   285   apply (frule set_times_mono4)
   294   apply auto
   286   apply auto
   295   done
   287   done
   296 
   288 
   297 lemma set_one_times [simp]: "(1::'a::comm_monoid_mult) *o C = C"
   289 lemma set_one_times [simp]: "(1::'a::comm_monoid_mult) *o C = C"
   299 
   291 
   300 lemma set_times_plus_distrib: "(a::'a::semiring) *o (b +o C)=
   292 lemma set_times_plus_distrib: "(a::'a::semiring) *o (b +o C)=
   301     (a * b) +o (a *o C)"
   293     (a * b) +o (a *o C)"
   302   by (auto simp add: elt_set_plus_def elt_set_times_def ring_distribs)
   294   by (auto simp add: elt_set_plus_def elt_set_times_def ring_distribs)
   303 
   295 
   304 lemma set_times_plus_distrib2: "(a::'a::semiring) *o (B \<oplus> C) =
   296 lemma set_times_plus_distrib2: "(a::'a::semiring) *o (B + C) =
   305     (a *o B) \<oplus> (a *o C)"
   297     (a *o B) + (a *o C)"
   306   apply (auto simp add: set_plus_def elt_set_times_def ring_distribs)
   298   apply (auto simp add: set_plus_def elt_set_times_def ring_distribs)
   307    apply blast
   299    apply blast
   308   apply (rule_tac x = "b + bb" in exI)
   300   apply (rule_tac x = "b + bb" in exI)
   309   apply (auto simp add: ring_distribs)
   301   apply (auto simp add: ring_distribs)
   310   done
   302   done
   311 
   303 
   312 lemma set_times_plus_distrib3: "((a::'a::semiring) +o C) \<otimes> D <=
   304 lemma set_times_plus_distrib3: "((a::'a::semiring) +o C) * D <=
   313     a *o D \<oplus> C \<otimes> D"
   305     a *o D + C * D"
   314   apply (auto simp add:
   306   apply (auto simp add:
   315     elt_set_plus_def elt_set_times_def set_times_def
   307     elt_set_plus_def elt_set_times_def set_times_def
   316     set_plus_def ring_distribs)
   308     set_plus_def ring_distribs)
   317   apply auto
   309   apply auto
   318   done
   310   done
   328 lemma set_neg_intro2: "(a::'a::ring_1) : C ==>
   320 lemma set_neg_intro2: "(a::'a::ring_1) : C ==>
   329     - a : (- 1) *o C"
   321     - a : (- 1) *o C"
   330   by (auto simp add: elt_set_times_def)
   322   by (auto simp add: elt_set_times_def)
   331 
   323 
   332 lemma set_plus_image:
   324 lemma set_plus_image:
   333   fixes S T :: "'n::semigroup_add set" shows "S \<oplus> T = (\<lambda>(x, y). x + y) ` (S \<times> T)"
   325   fixes S T :: "'n::semigroup_add set" shows "S + T = (\<lambda>(x, y). x + y) ` (S \<times> T)"
   334   unfolding set_plus_def by (fastforce simp: image_iff)
   326   unfolding set_plus_def by (fastforce simp: image_iff)
   335 
   327 
   336 lemma set_setsum_alt:
   328 lemma set_setsum_alt:
   337   assumes fin: "finite I"
   329   assumes fin: "finite I"
   338   shows "setsum S I = {setsum s I |s. \<forall>i\<in>I. s i \<in> S i}"
   330   shows "setsum S I = {setsum s I |s. \<forall>i\<in>I. s i \<in> S i}"
   339     (is "_ = ?setsum I")
   331     (is "_ = ?setsum I")
   340 using fin proof induct
   332 using fin proof induct
   341   case (insert x F)
   333   case (insert x F)
   342   have "setsum S (insert x F) = S x \<oplus> ?setsum F"
   334   have "setsum S (insert x F) = S x + ?setsum F"
   343     using insert.hyps by auto
   335     using insert.hyps by auto
   344   also have "...= {s x + setsum s F |s. \<forall> i\<in>insert x F. s i \<in> S i}"
   336   also have "...= {s x + setsum s F |s. \<forall> i\<in>insert x F. s i \<in> S i}"
   345     unfolding set_plus_def
   337     unfolding set_plus_def
   346   proof safe
   338   proof safe
   347     fix y s assume "y \<in> S x" "\<forall>i\<in>F. s i \<in> S i"
   339     fix y s assume "y \<in> S x" "\<forall>i\<in>F. s i \<in> S i"
   353     using insert.hyps by auto
   345     using insert.hyps by auto
   354 qed auto
   346 qed auto
   355 
   347 
   356 lemma setsum_set_cond_linear:
   348 lemma setsum_set_cond_linear:
   357   fixes f :: "('a::comm_monoid_add) set \<Rightarrow> ('b::comm_monoid_add) set"
   349   fixes f :: "('a::comm_monoid_add) set \<Rightarrow> ('b::comm_monoid_add) set"
   358   assumes [intro!]: "\<And>A B. P A  \<Longrightarrow> P B  \<Longrightarrow> P (A \<oplus> B)" "P {0}"
   350   assumes [intro!]: "\<And>A B. P A  \<Longrightarrow> P B  \<Longrightarrow> P (A + B)" "P {0}"
   359     and f: "\<And>A B. P A  \<Longrightarrow> P B \<Longrightarrow> f (A \<oplus> B) = f A \<oplus> f B" "f {0} = {0}"
   351     and f: "\<And>A B. P A  \<Longrightarrow> P B \<Longrightarrow> f (A + B) = f A + f B" "f {0} = {0}"
   360   assumes all: "\<And>i. i \<in> I \<Longrightarrow> P (S i)"
   352   assumes all: "\<And>i. i \<in> I \<Longrightarrow> P (S i)"
   361   shows "f (setsum S I) = setsum (f \<circ> S) I"
   353   shows "f (setsum S I) = setsum (f \<circ> S) I"
   362 proof cases
   354 proof cases
   363   assume "finite I" from this all show ?thesis
   355   assume "finite I" from this all show ?thesis
   364   proof induct
   356   proof induct
   370   qed (auto intro!: f)
   362   qed (auto intro!: f)
   371 qed (auto intro!: f)
   363 qed (auto intro!: f)
   372 
   364 
   373 lemma setsum_set_linear:
   365 lemma setsum_set_linear:
   374   fixes f :: "('a::comm_monoid_add) set => ('b::comm_monoid_add) set"
   366   fixes f :: "('a::comm_monoid_add) set => ('b::comm_monoid_add) set"
   375   assumes "\<And>A B. f(A) \<oplus> f(B) = f(A \<oplus> B)" "f {0} = {0}"
   367   assumes "\<And>A B. f(A) + f(B) = f(A + B)" "f {0} = {0}"
   376   shows "f (setsum S I) = setsum (f \<circ> S) I"
   368   shows "f (setsum S I) = setsum (f \<circ> S) I"
   377   using setsum_set_cond_linear[of "\<lambda>x. True" f I S] assms by auto
   369   using setsum_set_cond_linear[of "\<lambda>x. True" f I S] assms by auto
   378 
   370 
   379 end
   371 end