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 |
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 *} |