src/HOL/Library/List_Cset.thy
author bulwahn
Thu, 09 Jun 2011 08:31:41 +0200
changeset 43307 1a32a953cef1
parent 43241 93b1183e43e5
child 43971 892030194015
permissions -rw-r--r--
local simp rule in List_Cset
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43241
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     1
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     2
(* Author: Florian Haftmann, TU Muenchen *)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     3
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     4
header {* implementation of Cset.sets based on lists *}
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     5
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     6
theory List_Cset
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     7
imports Cset
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     8
begin
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
     9
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    10
declare mem_def [simp]
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    11
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    12
definition set :: "'a list \<Rightarrow> 'a Cset.set" where
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    13
  "set xs = Set (List.set xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    14
hide_const (open) set
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    15
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    16
lemma member_set [simp]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    17
  "member (List_Cset.set xs) = set xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    18
  by (simp add: set_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    19
hide_fact (open) member_set
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    20
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    21
definition coset :: "'a list \<Rightarrow> 'a Cset.set" where
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    22
  "coset xs = Set (- set xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    23
hide_const (open) coset
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    24
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    25
lemma member_coset [simp]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    26
  "member (List_Cset.coset xs) = - set xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    27
  by (simp add: coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    28
hide_fact (open) member_coset
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    29
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    30
code_datatype List_Cset.set List_Cset.coset
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    31
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    32
lemma member_code [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    33
  "member (List_Cset.set xs) = List.member xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    34
  "member (List_Cset.coset xs) = Not \<circ> List.member xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    35
  by (simp_all add: fun_eq_iff member_def fun_Compl_def bool_Compl_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    36
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    37
lemma member_image_UNIV [simp]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    38
  "member ` UNIV = UNIV"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    39
proof -
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    40
  have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a Cset.set. A = member B"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    41
  proof
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    42
    fix A :: "'a set"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    43
    show "A = member (Set A)" by simp
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    44
  qed
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    45
  then show ?thesis by (simp add: image_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    46
qed
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    47
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    48
definition (in term_syntax)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    49
  setify :: "'a\<Colon>typerep list \<times> (unit \<Rightarrow> Code_Evaluation.term)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    50
    \<Rightarrow> 'a Cset.set \<times> (unit \<Rightarrow> Code_Evaluation.term)" where
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    51
  [code_unfold]: "setify xs = Code_Evaluation.valtermify List_Cset.set {\<cdot>} xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    52
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    53
notation fcomp (infixl "\<circ>>" 60)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    54
notation scomp (infixl "\<circ>\<rightarrow>" 60)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    55
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    56
instantiation Cset.set :: (random) random
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    57
begin
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    58
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    59
definition
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    60
  "Quickcheck.random i = Quickcheck.random i \<circ>\<rightarrow> (\<lambda>xs. Pair (setify xs))"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    61
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    62
instance ..
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    63
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    64
end
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    65
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    66
no_notation fcomp (infixl "\<circ>>" 60)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    67
no_notation scomp (infixl "\<circ>\<rightarrow>" 60)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    68
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    69
subsection {* Basic operations *}
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    70
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    71
lemma is_empty_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    72
  "Cset.is_empty (List_Cset.set xs) \<longleftrightarrow> List.null xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    73
  by (simp add: is_empty_set null_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    74
hide_fact (open) is_empty_set
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    75
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    76
lemma empty_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    77
  "bot = List_Cset.set []"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    78
  by (simp add: set_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    79
hide_fact (open) empty_set
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    80
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    81
lemma UNIV_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    82
  "top = List_Cset.coset []"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    83
  by (simp add: coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    84
hide_fact (open) UNIV_set
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    85
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    86
lemma remove_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    87
  "Cset.remove x (List_Cset.set xs) = List_Cset.set (removeAll x xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    88
  "Cset.remove x (List_Cset.coset xs) = List_Cset.coset (List.insert x xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    89
by (simp_all add: set_def coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    90
  (metis List.set_insert More_Set.remove_def remove_set_compl)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    91
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    92
lemma insert_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    93
  "Cset.insert x (List_Cset.set xs) = List_Cset.set (List.insert x xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    94
  "Cset.insert x (List_Cset.coset xs) = List_Cset.coset (removeAll x xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    95
  by (simp_all add: set_def coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    96
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    97
lemma map_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    98
  "Cset.map f (List_Cset.set xs) = List_Cset.set (remdups (List.map f xs))"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
    99
  by (simp add: set_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   100
  
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   101
lemma filter_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   102
  "Cset.filter P (List_Cset.set xs) = List_Cset.set (List.filter P xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   103
  by (simp add: set_def project_set)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   104
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   105
lemma forall_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   106
  "Cset.forall P (List_Cset.set xs) \<longleftrightarrow> list_all P xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   107
  by (simp add: set_def list_all_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   108
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   109
lemma exists_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   110
  "Cset.exists P (List_Cset.set xs) \<longleftrightarrow> list_ex P xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   111
  by (simp add: set_def list_ex_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   112
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   113
lemma card_set [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   114
  "Cset.card (List_Cset.set xs) = length (remdups xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   115
proof -
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   116
  have "Finite_Set.card (set (remdups xs)) = length (remdups xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   117
    by (rule distinct_card) simp
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   118
  then show ?thesis by (simp add: set_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   119
qed
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   120
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   121
lemma compl_set [simp, code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   122
  "- List_Cset.set xs = List_Cset.coset xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   123
  by (simp add: set_def coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   124
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   125
lemma compl_coset [simp, code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   126
  "- List_Cset.coset xs = List_Cset.set xs"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   127
  by (simp add: set_def coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   128
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   129
context complete_lattice
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   130
begin
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   131
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   132
lemma Infimum_inf [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   133
  "Infimum (List_Cset.set As) = foldr inf As top"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   134
  "Infimum (List_Cset.coset []) = bot"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   135
  by (simp_all add: Inf_set_foldr Inf_UNIV)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   136
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   137
lemma Supremum_sup [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   138
  "Supremum (List_Cset.set As) = foldr sup As bot"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   139
  "Supremum (List_Cset.coset []) = top"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   140
  by (simp_all add: Sup_set_foldr Sup_UNIV)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   141
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   142
end
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   143
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   144
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   145
subsection {* Derived operations *}
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   146
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   147
lemma subset_eq_forall [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   148
  "A \<le> B \<longleftrightarrow> Cset.forall (member B) A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   149
  by (simp add: subset_eq)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   150
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   151
lemma subset_subset_eq [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   152
  "A < B \<longleftrightarrow> A \<le> B \<and> \<not> B \<le> (A :: 'a Cset.set)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   153
  by (fact less_le_not_le)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   154
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   155
instantiation Cset.set :: (type) equal
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   156
begin
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   157
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   158
definition [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   159
  "HOL.equal A B \<longleftrightarrow> A \<le> B \<and> B \<le> (A :: 'a Cset.set)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   160
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   161
instance proof
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   162
qed (simp add: equal_set_def set_eq [symmetric] Cset.set_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   163
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   164
end
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   165
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   166
lemma [code nbe]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   167
  "HOL.equal (A :: 'a Cset.set) A \<longleftrightarrow> True"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   168
  by (fact equal_refl)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   169
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   170
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   171
subsection {* Functorial operations *}
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   172
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   173
lemma inter_project [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   174
  "inf A (List_Cset.set xs) = List_Cset.set (List.filter (Cset.member A) xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   175
  "inf A (List_Cset.coset xs) = foldr Cset.remove xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   176
proof -
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   177
  show "inf A (List_Cset.set xs) = List_Cset.set (List.filter (member A) xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   178
    by (simp add: inter project_def set_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   179
  have *: "\<And>x::'a. Cset.remove = (\<lambda>x. Set \<circ> More_Set.remove x \<circ> member)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   180
    by (simp add: fun_eq_iff More_Set.remove_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   181
  have "member \<circ> fold (\<lambda>x. Set \<circ> More_Set.remove x \<circ> member) xs =
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   182
    fold More_Set.remove xs \<circ> member"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   183
    by (rule fold_commute) (simp add: fun_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   184
  then have "fold More_Set.remove xs (member A) = 
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   185
    member (fold (\<lambda>x. Set \<circ> More_Set.remove x \<circ> member) xs A)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   186
    by (simp add: fun_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   187
  then have "inf A (List_Cset.coset xs) = fold Cset.remove xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   188
    by (simp add: Diff_eq [symmetric] minus_set *)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   189
  moreover have "\<And>x y :: 'a. Cset.remove y \<circ> Cset.remove x = Cset.remove x \<circ> Cset.remove y"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   190
    by (auto simp add: More_Set.remove_def * intro: ext)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   191
  ultimately show "inf A (List_Cset.coset xs) = foldr Cset.remove xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   192
    by (simp add: foldr_fold)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   193
qed
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   194
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   195
lemma subtract_remove [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   196
  "A - List_Cset.set xs = foldr Cset.remove xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   197
  "A - List_Cset.coset xs = List_Cset.set (List.filter (member A) xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   198
  by (simp_all only: diff_eq compl_set compl_coset inter_project)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   199
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   200
lemma union_insert [code]:
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   201
  "sup (List_Cset.set xs) A = foldr Cset.insert xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   202
  "sup (List_Cset.coset xs) A = List_Cset.coset (List.filter (Not \<circ> member A) xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   203
proof -
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   204
  have *: "\<And>x::'a. Cset.insert = (\<lambda>x. Set \<circ> Set.insert x \<circ> member)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   205
    by (simp add: fun_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   206
  have "member \<circ> fold (\<lambda>x. Set \<circ> Set.insert x \<circ> member) xs =
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   207
    fold Set.insert xs \<circ> member"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   208
    by (rule fold_commute) (simp add: fun_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   209
  then have "fold Set.insert xs (member A) =
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   210
    member (fold (\<lambda>x. Set \<circ> Set.insert x \<circ> member) xs A)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   211
    by (simp add: fun_eq_iff)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   212
  then have "sup (List_Cset.set xs) A = fold Cset.insert xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   213
    by (simp add: union_set *)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   214
  moreover have "\<And>x y :: 'a. Cset.insert y \<circ> Cset.insert x = Cset.insert x \<circ> Cset.insert y"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   215
    by (auto simp add: * intro: ext)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   216
  ultimately show "sup (List_Cset.set xs) A = foldr Cset.insert xs A"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   217
    by (simp add: foldr_fold)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   218
  show "sup (List_Cset.coset xs) A = List_Cset.coset (List.filter (Not \<circ> member A) xs)"
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   219
    by (auto simp add: coset_def)
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   220
qed
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   221
43307
1a32a953cef1 local simp rule in List_Cset
bulwahn
parents: 43241
diff changeset
   222
declare mem_def[simp del]
1a32a953cef1 local simp rule in List_Cset
bulwahn
parents: 43241
diff changeset
   223
43241
93b1183e43e5 splitting Cset into Cset and List_Cset
bulwahn
parents:
diff changeset
   224
end