src/HOL/Quotient_Examples/FSet.thy
changeset 36646 8687bc6608d6
parent 36639 6243b49498ea
child 36675 806ea6e282e4
equal deleted inserted replaced
36645:30bd207ec222 36646:8687bc6608d6
   789 lemma finter_raw_empty:
   789 lemma finter_raw_empty:
   790   "finter_raw l [] = []"
   790   "finter_raw l [] = []"
   791   by (induct l) (simp_all add: not_memb_nil)
   791   by (induct l) (simp_all add: not_memb_nil)
   792 
   792 
   793 lemma set_cong:
   793 lemma set_cong:
   794   shows "(set x = set y) = (x \<approx> y)"
   794   shows "(x \<approx> y) = (set x = set y)"
   795   by auto
   795   by auto
   796 
   796 
   797 lemma inj_map_eq_iff:
   797 lemma inj_map_eq_iff:
   798   "inj f \<Longrightarrow> (map f l \<approx> map f m) = (l \<approx> m)"
   798   "inj f \<Longrightarrow> (map f l \<approx> map f m) = (l \<approx> m)"
   799   by (simp add: expand_set_eq[symmetric] inj_image_eq_iff)
   799   by (simp add: expand_set_eq[symmetric] inj_image_eq_iff)
   875     qed
   875     qed
   876     }
   876     }
   877   then show "l \<approx> r \<Longrightarrow> list_eq2 l r" by blast
   877   then show "l \<approx> r \<Longrightarrow> list_eq2 l r" by blast
   878 qed
   878 qed
   879 
   879 
       
   880 text {* Set *}
       
   881 
       
   882 lemma sub_list_set: "sub_list xs ys = (set xs \<subseteq> set ys)"
       
   883   by (metis rev_append set_append set_cong set_rev sub_list_append sub_list_append_left sub_list_def sub_list_not_eq subset_Un_eq)
       
   884 
       
   885 lemma sub_list_neq_set: "(sub_list xs ys \<and> \<not> list_eq xs ys) = (set xs \<subset> set ys)"
       
   886   by (auto simp add: sub_list_set)
       
   887 
       
   888 lemma fcard_raw_set: "fcard_raw xs = card (set xs)"
       
   889   by (induct xs) (auto simp add: insert_absorb memb_def card_insert_disjoint finite_set)
       
   890 
       
   891 lemma memb_set: "memb x xs = (x \<in> set xs)"
       
   892   by (simp only: memb_def)
       
   893 
       
   894 lemma filter_set: "set (filter P xs) = P \<inter> (set xs)"
       
   895   by (induct xs, simp)
       
   896      (metis Int_insert_right_if0 Int_insert_right_if1 List.set.simps(2) filter.simps(2) mem_def)
       
   897 
       
   898 lemma delete_raw_set: "set (delete_raw xs x) = set xs - {x}"
       
   899   by (induct xs) auto
       
   900 
       
   901 lemma inter_raw_set: "set (finter_raw xs ys) = set xs \<inter> set ys"
       
   902   by (induct xs) (simp_all add: memb_def)
       
   903 
   880 text {* Raw theorems of ffilter *}
   904 text {* Raw theorems of ffilter *}
   881 
   905 
   882 lemma sub_list_filter: "sub_list (filter P xs) (filter Q xs) = (\<forall> x. memb x xs \<longrightarrow> P x \<longrightarrow> Q x)"
   906 lemma sub_list_filter: "sub_list (filter P xs) (filter Q xs) = (\<forall> x. memb x xs \<longrightarrow> P x \<longrightarrow> Q x)"
   883 unfolding sub_list_def memb_def by auto
   907 unfolding sub_list_def memb_def by auto
   884 
   908 
   934 lemma none_fin_fempty:
   958 lemma none_fin_fempty:
   935   "(\<forall>x. x |\<notin>| S) = (S = {||})"
   959   "(\<forall>x. x |\<notin>| S) = (S = {||})"
   936   by (lifting none_memb_nil)
   960   by (lifting none_memb_nil)
   937 
   961 
   938 lemma fset_cong:
   962 lemma fset_cong:
   939   "(fset_to_set S = fset_to_set T) = (S = T)"
   963   "(S = T) = (fset_to_set S = fset_to_set T)"
   940   by (lifting set_cong)
   964   by (lifting set_cong)
   941 
   965 
   942 text {* fcard *}
   966 text {* fcard *}
   943 
   967 
   944 lemma fcard_fempty [simp]:
   968 lemma fcard_fempty [simp]:
  1044   "fmap f (finsert x S) = finsert (f x) (fmap f S)"
  1068   "fmap f (finsert x S) = finsert (f x) (fmap f S)"
  1045   by (lifting map.simps)
  1069   by (lifting map.simps)
  1046 
  1070 
  1047 lemma fmap_set_image:
  1071 lemma fmap_set_image:
  1048   "fset_to_set (fmap f S) = f ` (fset_to_set S)"
  1072   "fset_to_set (fmap f S) = f ` (fset_to_set S)"
  1049   by (induct S) (simp_all)
  1073   by (induct S) simp_all
  1050 
  1074 
  1051 lemma inj_fmap_eq_iff:
  1075 lemma inj_fmap_eq_iff:
  1052   "inj f \<Longrightarrow> (fmap f S = fmap f T) = (S = T)"
  1076   "inj f \<Longrightarrow> (fmap f S = fmap f T) = (S = T)"
  1053   by (lifting inj_map_eq_iff)
  1077   by (lifting inj_map_eq_iff)
  1054 
  1078 
  1056   by (lifting map_append)
  1080   by (lifting map_append)
  1057 
  1081 
  1058 lemma fin_funion:
  1082 lemma fin_funion:
  1059   "x |\<in>| S |\<union>| T \<longleftrightarrow> x |\<in>| S \<or> x |\<in>| T"
  1083   "x |\<in>| S |\<union>| T \<longleftrightarrow> x |\<in>| S \<or> x |\<in>| T"
  1060   by (lifting memb_append)
  1084   by (lifting memb_append)
       
  1085 
       
  1086 text {* to_set *}
       
  1087 
       
  1088 lemma fin_set: "(x |\<in>| xs) = (x \<in> fset_to_set xs)"
       
  1089   by (lifting memb_set)
       
  1090 
       
  1091 lemma fnotin_set: "(x |\<notin>| xs) = (x \<notin> fset_to_set xs)"
       
  1092   by (simp add: fin_set)
       
  1093 
       
  1094 lemma fcard_set: "fcard xs = card (fset_to_set xs)"
       
  1095   by (lifting fcard_raw_set)
       
  1096 
       
  1097 lemma fsubseteq_set: "(xs |\<subseteq>| ys) = (fset_to_set xs \<subseteq> fset_to_set ys)"
       
  1098   by (lifting sub_list_set)
       
  1099 
       
  1100 lemma fsubset_set: "(xs |\<subset>| ys) = (fset_to_set xs \<subset> fset_to_set ys)"
       
  1101   unfolding less_fset by (lifting sub_list_neq_set)
       
  1102 
       
  1103 lemma ffilter_set: "fset_to_set (ffilter P xs) = P \<inter> fset_to_set xs"
       
  1104   by (lifting filter_set)
       
  1105 
       
  1106 lemma fdelete_set: "fset_to_set (fdelete xs x) = fset_to_set xs - {x}"
       
  1107   by (lifting delete_raw_set)
       
  1108 
       
  1109 lemma inter_set: "fset_to_set (xs |\<inter>| ys) = fset_to_set xs \<inter> fset_to_set ys"
       
  1110   by (lifting inter_raw_set)
       
  1111 
       
  1112 lemma union_set: "fset_to_set (xs |\<union>| ys) = fset_to_set xs \<union> fset_to_set ys"
       
  1113   by (lifting set_append)
       
  1114 
       
  1115 lemmas fset_to_set_trans =
       
  1116   fin_set fnotin_set fcard_set fsubseteq_set fsubset_set
       
  1117   inter_set union_set ffilter_set fset_to_set_simps
       
  1118   fset_cong fdelete_set fmap_set_image
  1061 
  1119 
  1062 text {* ffold *}
  1120 text {* ffold *}
  1063 
  1121 
  1064 lemma ffold_nil: "ffold f z {||} = z"
  1122 lemma ffold_nil: "ffold f z {||} = z"
  1065   by (lifting ffold_raw.simps(1)[where 'a="'b" and 'b="'a"])
  1123   by (lifting ffold_raw.simps(1)[where 'a="'b" and 'b="'a"])
  1168 by (lifting list_eq_filter)
  1226 by (lifting list_eq_filter)
  1169 
  1227 
  1170 lemma subset_ffilter: "(\<And>x. x |\<in>| xs \<Longrightarrow> P x \<Longrightarrow> Q x) \<Longrightarrow> (x |\<in>| xs & \<not> P x & Q x) \<Longrightarrow> ffilter P xs < ffilter Q xs"
  1228 lemma subset_ffilter: "(\<And>x. x |\<in>| xs \<Longrightarrow> P x \<Longrightarrow> Q x) \<Longrightarrow> (x |\<in>| xs & \<not> P x & Q x) \<Longrightarrow> ffilter P xs < ffilter Q xs"
  1171 unfolding less_fset by (auto simp add: subseteq_filter eq_ffilter)
  1229 unfolding less_fset by (auto simp add: subseteq_filter eq_ffilter)
  1172 
  1230 
  1173 
       
  1174 section {* lemmas transferred from Finite_Set theory *}
  1231 section {* lemmas transferred from Finite_Set theory *}
  1175 
  1232 
  1176 text {* finiteness for finite sets holds *}
  1233 text {* finiteness for finite sets holds *}
  1177 lemma finite_fset: "finite (fset_to_set S)"
  1234 lemma finite_fset: "finite (fset_to_set S)"
  1178 by (induct S) auto
  1235   by (induct S) auto
  1179 
  1236 
  1180 text {* @{thm subset_empty} transferred is: *}
  1237 lemma fset_choice: "\<forall>x. x |\<in>| A \<longrightarrow> (\<exists>y. P x y) \<Longrightarrow> \<exists>f. \<forall>x. x |\<in>| A \<longrightarrow> P x (f x)"
       
  1238   unfolding fset_to_set_trans
       
  1239   by (rule finite_set_choice[simplified Ball_def, OF finite_fset])
       
  1240 
  1181 lemma fsubseteq_fnil: "xs |\<subseteq>| {||} = (xs = {||})"
  1241 lemma fsubseteq_fnil: "xs |\<subseteq>| {||} = (xs = {||})"
  1182 by (cases xs) (auto simp add: fsubset_finsert not_fin_fnil)
  1242   unfolding fset_to_set_trans
  1183 
  1243   by (rule subset_empty)
  1184 text {* @{thm not_psubset_empty} transferred is: *}
  1244 
  1185 lemma not_fsubset_fnil: "\<not> xs |\<subset>| {||}"
  1245 lemma not_fsubset_fnil: "\<not> xs |\<subset>| {||}"
  1186 unfolding less_fset by (auto simp add: fsubseteq_fnil)
  1246   unfolding fset_to_set_trans
  1187 
  1247   by (rule not_psubset_empty)
  1188 text {* @{thm card_mono} transferred is: *}
  1248 
  1189 lemma fcard_mono: "xs |\<subseteq>| ys \<Longrightarrow> fcard xs \<le> fcard ys"
  1249 lemma fcard_mono: "xs |\<subseteq>| ys \<Longrightarrow> fcard xs \<le> fcard ys"
  1190 proof (induct xs arbitrary: ys)
  1250   unfolding fset_to_set_trans
  1191   case fempty
  1251   by (rule card_mono[OF finite_fset])
  1192   thus ?case by simp
  1252 
  1193 next
       
  1194   case (finsert x xs ys)
       
  1195   from finsert(1,3) have "xs |\<subseteq>| fdelete ys x"
       
  1196     by (auto simp add: fsubset_fin fin_fdelete)
       
  1197   from finsert(2) this have hyp: "fcard xs \<le> fcard (fdelete ys x)" by simp
       
  1198   from finsert(3) have "x |\<in>| ys" by (auto simp add: fsubset_fin)
       
  1199   from this have ys_is: "ys = finsert x (fdelete ys x)"
       
  1200     unfolding expand_fset_eq by (auto simp add: fin_fdelete)
       
  1201   from finsert(1) hyp have "fcard (finsert x xs) \<le> fcard (finsert x (fdelete ys x))"
       
  1202     by (auto simp add: fin_fdelete_ident)
       
  1203   from ys_is this show ?case by auto
       
  1204 qed
       
  1205 
       
  1206 text {* @{thm card_seteq} transferred is: *}
       
  1207 lemma fcard_fseteq: "xs |\<subseteq>| ys \<Longrightarrow> fcard ys \<le> fcard xs \<Longrightarrow> xs = ys"
  1253 lemma fcard_fseteq: "xs |\<subseteq>| ys \<Longrightarrow> fcard ys \<le> fcard xs \<Longrightarrow> xs = ys"
  1208 proof (induct xs arbitrary: ys)
  1254   unfolding fset_to_set_trans
  1209   case fempty
  1255   by (rule card_seteq[OF finite_fset])
  1210   thus ?case by (simp add: fcard_0)
  1256 
  1211 next
       
  1212   case (finsert x xs ys)
       
  1213   from finsert have subset: "xs |\<subseteq>| fdelete ys x"
       
  1214     by (auto simp add: fsubset_fin fin_fdelete)
       
  1215   from finsert have x: "x |\<in>| ys"
       
  1216     by (auto simp add: fsubset_fin fin_fdelete)
       
  1217   from finsert(1,4) this have "fcard (fdelete ys x) \<le> fcard xs"
       
  1218     by (auto simp add: fcard_delete)
       
  1219   from finsert(2) this subset have hyp: "xs = fdelete ys x" by auto
       
  1220   from finsert have "x |\<in>| ys"
       
  1221     by (auto simp add: fsubset_fin fin_fdelete)
       
  1222   from this hyp show ?case
       
  1223     unfolding expand_fset_eq by (auto simp add: fin_fdelete)
       
  1224 qed
       
  1225 
       
  1226 text {* @{thm psubset_card_mono} transferred is: *}
       
  1227 lemma psubset_fcard_mono: "xs |\<subset>| ys \<Longrightarrow> fcard xs < fcard ys"
  1257 lemma psubset_fcard_mono: "xs |\<subset>| ys \<Longrightarrow> fcard xs < fcard ys"
  1228 unfolding less_fset linorder_not_le[symmetric]
  1258   unfolding fset_to_set_trans
  1229 by (auto simp add: fcard_fseteq)
  1259   by (rule psubset_card_mono[OF finite_fset])
  1230 
  1260 
       
  1261 lemma fcard_funion_finter: "fcard xs + fcard ys = fcard (xs |\<union>| ys) + fcard (xs |\<inter>| ys)"
       
  1262   unfolding fset_to_set_trans
       
  1263   by (rule card_Un_Int[OF finite_fset finite_fset])
       
  1264 
       
  1265 lemma fcard_funion_disjoint: "xs |\<inter>| ys = {||} \<Longrightarrow> fcard (xs |\<union>| ys) = fcard xs + fcard ys"
       
  1266   unfolding fset_to_set_trans
       
  1267   by (rule card_Un_disjoint[OF finite_fset finite_fset])
       
  1268 
       
  1269 lemma fcard_delete1_less: "x |\<in>| xs \<Longrightarrow> fcard (fdelete xs x) < fcard xs"
       
  1270   unfolding fset_to_set_trans
       
  1271   by (rule card_Diff1_less[OF finite_fset])
       
  1272 
       
  1273 lemma fcard_delete2_less: "x |\<in>| xs \<Longrightarrow> y |\<in>| xs \<Longrightarrow> fcard (fdelete (fdelete xs x) y) < fcard xs"
       
  1274   unfolding fset_to_set_trans
       
  1275   by (rule card_Diff2_less[OF finite_fset])
       
  1276 
       
  1277 lemma fcard_delete1_le: "fcard (fdelete xs x) <= fcard xs"
       
  1278   unfolding fset_to_set_trans
       
  1279   by (rule card_Diff1_le[OF finite_fset])
       
  1280 
       
  1281 lemma fcard_psubset: "ys |\<subseteq>| xs \<Longrightarrow> fcard ys < fcard xs \<Longrightarrow> ys |\<subset>| xs"
       
  1282   unfolding fset_to_set_trans
       
  1283   by (rule card_psubset[OF finite_fset])
       
  1284 
       
  1285 lemma fcard_fmap_le: "fcard (fmap f xs) \<le> fcard xs"
       
  1286   unfolding fset_to_set_trans
       
  1287   by (rule card_image_le[OF finite_fset])
  1231 
  1288 
  1232 ML {*
  1289 ML {*
  1233 fun dest_fsetT (Type (@{type_name fset}, [T])) = T
  1290 fun dest_fsetT (Type (@{type_name fset}, [T])) = T
  1234   | dest_fsetT T = raise TYPE ("dest_fsetT: fset type expected", [T], []);
  1291   | dest_fsetT T = raise TYPE ("dest_fsetT: fset type expected", [T], []);
  1235 *}
  1292 *}