Theory List_Extra

theory List_Extra contributor ‹Balazs Toth› 
  imports Main
begin

definition set_list :: "'a set  'a list" where
  "set_list S  SOME xs. set xs = S  distinct xs"

lemma set_list_empty [simp]: "set_list {} = []"
  unfolding set_list_def
  by auto

lemma set_list_singleton [simp]: "set_list {x} = [x]"
proof (unfold set_list_def, rule some1_equality, intro ex_ex1I)

  show "xs y. set xs = {x}  distinct xs; set y = {x}  distinct y  xs = y"
    by (metis distinct_card replicate_eqI singleton_iff)
qed (auto simp: finite_distinct_list)

lemma set_list_set [simp]:
  assumes "finite S"
  shows "set (set_list S) = S"
  unfolding set_list_def
  by (rule someI2_ex[OF finite_distinct_list[OF assms]]) argo

lemma set_list_distinct [simp]:
  assumes "finite S"
  shows "distinct (set_list S)"
  unfolding set_list_def
  by (rule someI2_ex[OF finite_distinct_list[OF assms]]) argo

end