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. |