src/HOL/Set.thy
changeset 45121 5e495ccf6e56
parent 44744 bdf8eb8f126b
child 45152 e877b76c72bd
equal deleted inserted replaced
45120:717bc892e4d7 45121:5e495ccf6e56
   481 lemma subset_eq [no_atp]: "A \<le> B = (\<forall>x\<in>A. x \<in> B)" by blast
   481 lemma subset_eq [no_atp]: "A \<le> B = (\<forall>x\<in>A. x \<in> B)" by blast
   482 
   482 
   483 lemma contra_subsetD [no_atp]: "A \<subseteq> B ==> c \<notin> B ==> c \<notin> A"
   483 lemma contra_subsetD [no_atp]: "A \<subseteq> B ==> c \<notin> B ==> c \<notin> A"
   484   by blast
   484   by blast
   485 
   485 
   486 lemma subset_refl [simp]: "A \<subseteq> A"
   486 lemma subset_refl: "A \<subseteq> A"
   487   by (fact order_refl)
   487   by (fact order_refl) (* already [iff] *)
   488 
   488 
   489 lemma subset_trans: "A \<subseteq> B ==> B \<subseteq> C ==> A \<subseteq> C"
   489 lemma subset_trans: "A \<subseteq> B ==> B \<subseteq> C ==> A \<subseteq> C"
   490   by (fact order_trans)
   490   by (fact order_trans)
   491 
   491 
   492 lemma set_rev_mp: "x:A ==> A \<subseteq> B ==> x:B"
   492 lemma set_rev_mp: "x:A ==> A \<subseteq> B ==> x:B"
   584 declare UNIV_I [intro]  -- {* unsafe makes it less likely to cause problems *}
   584 declare UNIV_I [intro]  -- {* unsafe makes it less likely to cause problems *}
   585 
   585 
   586 lemma UNIV_witness [intro?]: "EX x. x : UNIV"
   586 lemma UNIV_witness [intro?]: "EX x. x : UNIV"
   587   by simp
   587   by simp
   588 
   588 
   589 lemma subset_UNIV [simp]: "A \<subseteq> UNIV"
   589 lemma subset_UNIV: "A \<subseteq> UNIV"
   590   by (rule subsetI) (rule UNIV_I)
   590   by (fact top_greatest) (* already simp *)
   591 
   591 
   592 text {*
   592 text {*
   593   \medskip Eta-contracting these two rules (to remove @{text P})
   593   \medskip Eta-contracting these two rules (to remove @{text P})
   594   causes them to be ignored because of their interaction with
   594   causes them to be ignored because of their interaction with
   595   congruence rules.
   595   congruence rules.
  1072 lemma Collect_const [simp]: "{s. P} = (if P then UNIV else {})"
  1072 lemma Collect_const [simp]: "{s. P} = (if P then UNIV else {})"
  1073   -- {* supersedes @{text "Collect_False_empty"} *}
  1073   -- {* supersedes @{text "Collect_False_empty"} *}
  1074   by auto
  1074   by auto
  1075 
  1075 
  1076 lemma subset_empty [simp]: "(A \<subseteq> {}) = (A = {})"
  1076 lemma subset_empty [simp]: "(A \<subseteq> {}) = (A = {})"
  1077   by blast
  1077   by (fact bot_unique)
  1078 
  1078 
  1079 lemma not_psubset_empty [iff]: "\<not> (A < {})"
  1079 lemma not_psubset_empty [iff]: "\<not> (A < {})"
  1080   by (unfold less_le) blast
  1080   by (fact not_less_bot) (* FIXME: already simp *)
  1081 
  1081 
  1082 lemma Collect_empty_eq [simp]: "(Collect P = {}) = (\<forall>x. \<not> P x)"
  1082 lemma Collect_empty_eq [simp]: "(Collect P = {}) = (\<forall>x. \<not> P x)"
  1083 by blast
  1083 by blast
  1084 
  1084 
  1085 lemma empty_Collect_eq [simp]: "({} = Collect P) = (\<forall>x. \<not> P x)"
  1085 lemma empty_Collect_eq [simp]: "({} = Collect P) = (\<forall>x. \<not> P x)"
  1202 by (subst image_image, simp)
  1202 by (subst image_image, simp)
  1203 
  1203 
  1204 
  1204 
  1205 text {* \medskip @{text Int} *}
  1205 text {* \medskip @{text Int} *}
  1206 
  1206 
  1207 lemma Int_absorb [simp]: "A \<inter> A = A"
  1207 lemma Int_absorb: "A \<inter> A = A"
  1208   by (fact inf_idem)
  1208   by (fact inf_idem) (* already simp *)
  1209 
  1209 
  1210 lemma Int_left_absorb: "A \<inter> (A \<inter> B) = A \<inter> B"
  1210 lemma Int_left_absorb: "A \<inter> (A \<inter> B) = A \<inter> B"
  1211   by (fact inf_left_idem)
  1211   by (fact inf_left_idem)
  1212 
  1212 
  1213 lemma Int_commute: "A \<inter> B = B \<inter> A"
  1213 lemma Int_commute: "A \<inter> B = B \<inter> A"
  1226   by (fact inf_absorb2)
  1226   by (fact inf_absorb2)
  1227 
  1227 
  1228 lemma Int_absorb2: "A \<subseteq> B ==> A \<inter> B = A"
  1228 lemma Int_absorb2: "A \<subseteq> B ==> A \<inter> B = A"
  1229   by (fact inf_absorb1)
  1229   by (fact inf_absorb1)
  1230 
  1230 
  1231 lemma Int_empty_left [simp]: "{} \<inter> B = {}"
  1231 lemma Int_empty_left: "{} \<inter> B = {}"
  1232   by (fact inf_bot_left)
  1232   by (fact inf_bot_left) (* already simp *)
  1233 
  1233 
  1234 lemma Int_empty_right [simp]: "A \<inter> {} = {}"
  1234 lemma Int_empty_right: "A \<inter> {} = {}"
  1235   by (fact inf_bot_right)
  1235   by (fact inf_bot_right) (* already simp *)
  1236 
  1236 
  1237 lemma disjoint_eq_subset_Compl: "(A \<inter> B = {}) = (A \<subseteq> -B)"
  1237 lemma disjoint_eq_subset_Compl: "(A \<inter> B = {}) = (A \<subseteq> -B)"
  1238   by blast
  1238   by blast
  1239 
  1239 
  1240 lemma disjoint_iff_not_equal: "(A \<inter> B = {}) = (\<forall>x\<in>A. \<forall>y\<in>B. x \<noteq> y)"
  1240 lemma disjoint_iff_not_equal: "(A \<inter> B = {}) = (\<forall>x\<in>A. \<forall>y\<in>B. x \<noteq> y)"
  1241   by blast
  1241   by blast
  1242 
  1242 
  1243 lemma Int_UNIV_left [simp]: "UNIV \<inter> B = B"
  1243 lemma Int_UNIV_left: "UNIV \<inter> B = B"
  1244   by (fact inf_top_left)
  1244   by (fact inf_top_left) (* already simp *)
  1245 
  1245 
  1246 lemma Int_UNIV_right [simp]: "A \<inter> UNIV = A"
  1246 lemma Int_UNIV_right: "A \<inter> UNIV = A"
  1247   by (fact inf_top_right)
  1247   by (fact inf_top_right) (* already simp *)
  1248 
  1248 
  1249 lemma Int_Un_distrib: "A \<inter> (B \<union> C) = (A \<inter> B) \<union> (A \<inter> C)"
  1249 lemma Int_Un_distrib: "A \<inter> (B \<union> C) = (A \<inter> B) \<union> (A \<inter> C)"
  1250   by (fact inf_sup_distrib1)
  1250   by (fact inf_sup_distrib1)
  1251 
  1251 
  1252 lemma Int_Un_distrib2: "(B \<union> C) \<inter> A = (B \<inter> A) \<union> (C \<inter> A)"
  1252 lemma Int_Un_distrib2: "(B \<union> C) \<inter> A = (B \<inter> A) \<union> (C \<inter> A)"
  1253   by (fact inf_sup_distrib2)
  1253   by (fact inf_sup_distrib2)
  1254 
  1254 
  1255 lemma Int_UNIV [simp,no_atp]: "(A \<inter> B = UNIV) = (A = UNIV & B = UNIV)"
  1255 lemma Int_UNIV [simp,no_atp]: "(A \<inter> B = UNIV) = (A = UNIV & B = UNIV)"
  1256   by (fact inf_eq_top_iff)
  1256   by (fact inf_eq_top_iff) (* already simp *)
  1257 
  1257 
  1258 lemma Int_subset_iff [no_atp, simp]: "(C \<subseteq> A \<inter> B) = (C \<subseteq> A & C \<subseteq> B)"
  1258 lemma Int_subset_iff [no_atp, simp]: "(C \<subseteq> A \<inter> B) = (C \<subseteq> A & C \<subseteq> B)"
  1259   by (fact le_inf_iff)
  1259   by (fact le_inf_iff)
  1260 
  1260 
  1261 lemma Int_Collect: "(x \<in> A \<inter> {x. P x}) = (x \<in> A & P x)"
  1261 lemma Int_Collect: "(x \<in> A \<inter> {x. P x}) = (x \<in> A & P x)"
  1262   by blast
  1262   by blast
  1263 
  1263 
  1264 
  1264 
  1265 text {* \medskip @{text Un}. *}
  1265 text {* \medskip @{text Un}. *}
  1266 
  1266 
  1267 lemma Un_absorb [simp]: "A \<union> A = A"
  1267 lemma Un_absorb: "A \<union> A = A"
  1268   by (fact sup_idem)
  1268   by (fact sup_idem) (* already simp *)
  1269 
  1269 
  1270 lemma Un_left_absorb: "A \<union> (A \<union> B) = A \<union> B"
  1270 lemma Un_left_absorb: "A \<union> (A \<union> B) = A \<union> B"
  1271   by (fact sup_left_idem)
  1271   by (fact sup_left_idem)
  1272 
  1272 
  1273 lemma Un_commute: "A \<union> B = B \<union> A"
  1273 lemma Un_commute: "A \<union> B = B \<union> A"
  1286   by (fact sup_absorb2)
  1286   by (fact sup_absorb2)
  1287 
  1287 
  1288 lemma Un_absorb2: "B \<subseteq> A ==> A \<union> B = A"
  1288 lemma Un_absorb2: "B \<subseteq> A ==> A \<union> B = A"
  1289   by (fact sup_absorb1)
  1289   by (fact sup_absorb1)
  1290 
  1290 
  1291 lemma Un_empty_left [simp]: "{} \<union> B = B"
  1291 lemma Un_empty_left: "{} \<union> B = B"
  1292   by (fact sup_bot_left)
  1292   by (fact sup_bot_left) (* already simp *)
  1293 
  1293 
  1294 lemma Un_empty_right [simp]: "A \<union> {} = A"
  1294 lemma Un_empty_right: "A \<union> {} = A"
  1295   by (fact sup_bot_right)
  1295   by (fact sup_bot_right) (* already simp *)
  1296 
  1296 
  1297 lemma Un_UNIV_left [simp]: "UNIV \<union> B = UNIV"
  1297 lemma Un_UNIV_left: "UNIV \<union> B = UNIV"
  1298   by (fact sup_top_left)
  1298   by (fact sup_top_left) (* already simp *)
  1299 
  1299 
  1300 lemma Un_UNIV_right [simp]: "A \<union> UNIV = UNIV"
  1300 lemma Un_UNIV_right: "A \<union> UNIV = UNIV"
  1301   by (fact sup_top_right)
  1301   by (fact sup_top_right) (* already simp *)
  1302 
  1302 
  1303 lemma Un_insert_left [simp]: "(insert a B) \<union> C = insert a (B \<union> C)"
  1303 lemma Un_insert_left [simp]: "(insert a B) \<union> C = insert a (B \<union> C)"
  1304   by blast
  1304   by blast
  1305 
  1305 
  1306 lemma Un_insert_right [simp]: "A \<union> (insert a B) = insert a (A \<union> B)"
  1306 lemma Un_insert_right [simp]: "A \<union> (insert a B) = insert a (A \<union> B)"
  1342 
  1342 
  1343 lemma subset_Un_eq: "(A \<subseteq> B) = (A \<union> B = B)"
  1343 lemma subset_Un_eq: "(A \<subseteq> B) = (A \<union> B = B)"
  1344   by (fact le_iff_sup)
  1344   by (fact le_iff_sup)
  1345 
  1345 
  1346 lemma Un_empty [iff]: "(A \<union> B = {}) = (A = {} & B = {})"
  1346 lemma Un_empty [iff]: "(A \<union> B = {}) = (A = {} & B = {})"
  1347   by (fact sup_eq_bot_iff)
  1347   by (fact sup_eq_bot_iff) (* FIXME: already simp *)
  1348 
  1348 
  1349 lemma Un_subset_iff [no_atp, simp]: "(A \<union> B \<subseteq> C) = (A \<subseteq> C & B \<subseteq> C)"
  1349 lemma Un_subset_iff [no_atp, simp]: "(A \<union> B \<subseteq> C) = (A \<subseteq> C & B \<subseteq> C)"
  1350   by (fact le_sup_iff)
  1350   by (fact le_sup_iff)
  1351 
  1351 
  1352 lemma Un_Diff_Int: "(A - B) \<union> (A \<inter> B) = A"
  1352 lemma Un_Diff_Int: "(A - B) \<union> (A \<inter> B) = A"
  1368   by (fact sup_compl_top)
  1368   by (fact sup_compl_top)
  1369 
  1369 
  1370 lemma Compl_partition2: "-A \<union> A = UNIV"
  1370 lemma Compl_partition2: "-A \<union> A = UNIV"
  1371   by (fact compl_sup_top)
  1371   by (fact compl_sup_top)
  1372 
  1372 
  1373 lemma double_complement [simp]: "- (-A) = (A::'a set)"
  1373 lemma double_complement: "- (-A) = (A::'a set)"
  1374   by (fact double_compl)
  1374   by (fact double_compl) (* already simp *)
  1375 
  1375 
  1376 lemma Compl_Un [simp]: "-(A \<union> B) = (-A) \<inter> (-B)"
  1376 lemma Compl_Un: "-(A \<union> B) = (-A) \<inter> (-B)"
  1377   by (fact compl_sup)
  1377   by (fact compl_sup) (* already simp *)
  1378 
  1378 
  1379 lemma Compl_Int [simp]: "-(A \<inter> B) = (-A) \<union> (-B)"
  1379 lemma Compl_Int: "-(A \<inter> B) = (-A) \<union> (-B)"
  1380   by (fact compl_inf)
  1380   by (fact compl_inf) (* already simp *)
  1381 
  1381 
  1382 lemma subset_Compl_self_eq: "(A \<subseteq> -A) = (A = {})"
  1382 lemma subset_Compl_self_eq: "(A \<subseteq> -A) = (A = {})"
  1383   by blast
  1383   by blast
  1384 
  1384 
  1385 lemma Un_Int_assoc_eq: "((A \<inter> B) \<union> C = A \<inter> (B \<union> C)) = (C \<subseteq> A)"
  1385 lemma Un_Int_assoc_eq: "((A \<inter> B) \<union> C = A \<inter> (B \<union> C)) = (C \<subseteq> A)"
  1386   -- {* Halmos, Naive Set Theory, page 16. *}
  1386   -- {* Halmos, Naive Set Theory, page 16. *}
  1387   by blast
  1387   by blast
  1388 
  1388 
  1389 lemma Compl_UNIV_eq [simp]: "-UNIV = {}"
  1389 lemma Compl_UNIV_eq: "-UNIV = {}"
  1390   by (fact compl_top_eq)
  1390   by (fact compl_top_eq) (* already simp *)
  1391 
  1391 
  1392 lemma Compl_empty_eq [simp]: "-{} = UNIV"
  1392 lemma Compl_empty_eq: "-{} = UNIV"
  1393   by (fact compl_bot_eq)
  1393   by (fact compl_bot_eq) (* already simp *)
  1394 
  1394 
  1395 lemma Compl_subset_Compl_iff [iff]: "(-A \<subseteq> -B) = (B \<subseteq> A)"
  1395 lemma Compl_subset_Compl_iff [iff]: "(-A \<subseteq> -B) = (B \<subseteq> A)"
  1396   by (fact compl_le_compl_iff)
  1396   by (fact compl_le_compl_iff) (* FIXME: already simp *)
  1397 
  1397 
  1398 lemma Compl_eq_Compl_iff [iff]: "(-A = -B) = (A = (B::'a set))"
  1398 lemma Compl_eq_Compl_iff [iff]: "(-A = -B) = (A = (B::'a set))"
  1399   by (fact compl_eq_compl_iff)
  1399   by (fact compl_eq_compl_iff) (* FIXME: already simp *)
  1400 
  1400 
  1401 lemma Compl_insert: "- insert x A = (-A) - {x}"
  1401 lemma Compl_insert: "- insert x A = (-A) - {x}"
  1402   by blast
  1402   by blast
  1403 
  1403 
  1404 text {* \medskip Bounded quantifiers.
  1404 text {* \medskip Bounded quantifiers.