src/HOL/Library/RBT_Set.thy
author paulson <lp15@cam.ac.uk>
Sun, 03 Aug 2025 20:34:24 +0100
changeset 82913 7c870287f04f
parent 82902 99a720d3ed8f
permissions -rw-r--r--
New lemmas about improper integrals and other things
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     1
(*  Title:      HOL/Library/RBT_Set.thy
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     2
    Author:     Ondrej Kuncar
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     3
*)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     4
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
     5
section \<open>Implementation of sets using RBT trees\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     6
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     7
theory RBT_Set
51115
7dbd6832a689 consolidation of library theories on product orders
haftmann
parents: 50996
diff changeset
     8
imports RBT Product_Lexorder
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
     9
begin
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    10
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    11
(*
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    12
  Users should be aware that by including this file all code equations
58301
de95aeedf49e fixed situation in 'primrec' whereby the original value of a constructor argument of nested type was not translated correctly to a 'map fst'
blanchet
parents: 57816
diff changeset
    13
  outside of List.thy using 'a list as an implementation of sets cannot be
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    14
  used for code generation. If such equations are not needed, they can be
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    15
  deleted from the code generator. Otherwise, a user has to provide their 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    16
  own equations using RBT trees. 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    17
*)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    18
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    19
section \<open>Definition of code datatype constructors\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    20
61076
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 60679
diff changeset
    21
definition Set :: "('a::linorder, unit) rbt \<Rightarrow> 'a set" 
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    22
  where "Set t = {x . RBT.lookup t x = Some ()}"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    23
61076
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 60679
diff changeset
    24
definition Coset :: "('a::linorder, unit) rbt \<Rightarrow> 'a set" 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    25
  where [simp]: "Coset t = - Set t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    26
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    27
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    28
section \<open>Lemmas\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    29
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    30
subsection \<open>Auxiliary lemmas\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    31
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    32
lemma [simp]: "x \<noteq> Some () \<longleftrightarrow> x = None"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    33
by (auto simp: not_Some_eq[THEN iffD1])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    34
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    35
lemma Set_set_keys: "Set x = dom (RBT.lookup x)" 
49928
e3f0a92de280 tuned proofs
kuncar
parents: 49758
diff changeset
    36
by (auto simp: Set_def)
e3f0a92de280 tuned proofs
kuncar
parents: 49758
diff changeset
    37
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    38
lemma finite_Set [simp, intro!]: "finite (Set x)"
49928
e3f0a92de280 tuned proofs
kuncar
parents: 49758
diff changeset
    39
by (simp add: Set_set_keys)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    40
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    41
lemma set_keys: "Set t = set(RBT.keys t)"
49928
e3f0a92de280 tuned proofs
kuncar
parents: 49758
diff changeset
    42
by (simp add: Set_set_keys lookup_keys)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    43
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    44
subsection \<open>fold and filter\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    45
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    46
lemma finite_fold_rbt_fold_eq:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    47
  assumes "comp_fun_commute f" 
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    48
  shows "Finite_Set.fold f A (set (RBT.entries t)) = RBT.fold (curry f) t A"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    49
proof -
73832
9db620f007fa More general fold function for maps
nipkow
parents: 73707
diff changeset
    50
  interpret comp_fun_commute: comp_fun_commute f
9db620f007fa More general fold function for maps
nipkow
parents: 73707
diff changeset
    51
    by (fact assms)
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    52
  have *: "remdups (RBT.entries t) = RBT.entries t"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    53
    using distinct_entries distinct_map by (auto intro: distinct_remdups_id)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    54
  show ?thesis using assms by (auto simp: fold_def_alt comp_fun_commute.fold_set_fold_remdups *)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    55
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    56
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    57
definition fold_keys :: "('a :: linorder \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, _) rbt \<Rightarrow> 'b \<Rightarrow> 'b" 
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    58
  where [code_unfold]:"fold_keys f t A = RBT.fold (\<lambda>k _ t. f k t) t A"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    59
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    60
lemma fold_keys_def_alt:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    61
  "fold_keys f t s = List.fold f (RBT.keys t) s"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    62
by (auto simp: fold_map o_def split_def fold_def_alt keys_def_alt fold_keys_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    63
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    64
lemma finite_fold_fold_keys:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    65
  assumes "comp_fun_commute f"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    66
  shows "Finite_Set.fold f A (Set t) = fold_keys f t A"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    67
using assms
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    68
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    69
  interpret comp_fun_commute f by fact
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    70
  have "set (RBT.keys t) = fst ` (set (RBT.entries t))" by (auto simp: fst_eq_Domain keys_entries)
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    71
  moreover have "inj_on fst (set (RBT.entries t))" using distinct_entries distinct_map by auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    72
  ultimately show ?thesis 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    73
    by (auto simp add: set_keys fold_keys_def curry_def fold_image finite_fold_rbt_fold_eq 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    74
      comp_comp_fun_commute)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    75
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    76
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    77
definition rbt_filter :: "('a :: linorder \<Rightarrow> bool) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> 'a set" where
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    78
  "rbt_filter P t = RBT.fold (\<lambda>k _ A'. if P k then Set.insert k A' else A') t {}"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    79
49758
718f10c8bbfc use Set.filter instead of Finite_Set.filter, which is removed then
kuncar
parents: 49757
diff changeset
    80
lemma Set_filter_rbt_filter:
718f10c8bbfc use Set.filter instead of Finite_Set.filter, which is removed then
kuncar
parents: 49757
diff changeset
    81
  "Set.filter P (Set t) = rbt_filter P t"
82664
e9f3b94eb6a0 more modern qualification of auxiliary operations
haftmann
parents: 79971
diff changeset
    82
  by (subst Set_filter_fold)
e9f3b94eb6a0 more modern qualification of auxiliary operations
haftmann
parents: 79971
diff changeset
    83
    (simp_all add: fold_keys_def rbt_filter_def finite_fold_fold_keys [OF comp_fun_commute_filter_fold])
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    84
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    85
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
    86
subsection \<open>foldi and Ball\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    87
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    88
lemma Ball_False: "RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t False = False"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    89
by (induction t) auto
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    90
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    91
lemma rbt_foldi_fold_conj: 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    92
  "RBT_Impl.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t val = RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t val"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    93
proof (induction t arbitrary: val) 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    94
  case (Branch c t1) then show ?case
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    95
    by (cases "RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t1 True") (simp_all add: Ball_False) 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    96
qed simp
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
    97
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    98
lemma foldi_fold_conj: "RBT.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t val = fold_keys (\<lambda>k s. s \<and> P k) t val"
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
    99
unfolding fold_keys_def including rbt.lifting by transfer (rule rbt_foldi_fold_conj)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   100
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   101
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
   102
subsection \<open>foldi and Bex\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   103
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   104
lemma Bex_True: "RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t True = True"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   105
by (induction t) auto
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   106
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   107
lemma rbt_foldi_fold_disj: 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   108
  "RBT_Impl.foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t val = RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t val"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   109
proof (induction t arbitrary: val) 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   110
  case (Branch c t1) then show ?case
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   111
    by (cases "RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t1 False") (simp_all add: Bex_True) 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   112
qed simp
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   113
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   114
lemma foldi_fold_disj: "RBT.foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t val = fold_keys (\<lambda>k s. s \<or> P k) t val"
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   115
unfolding fold_keys_def including rbt.lifting by transfer (rule rbt_foldi_fold_disj)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   116
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   117
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
   118
subsection \<open>folding over non empty trees and selecting the minimal and maximal element\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   119
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   120
subsubsection \<open>concrete\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   121
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   122
text \<open>The concrete part is here because it's probably not general enough to be moved to \<open>RBT_Impl\<close>\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   123
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   124
definition rbt_fold1_keys :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('a::linorder, 'b) RBT_Impl.rbt \<Rightarrow> 'a" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   125
  where "rbt_fold1_keys f t = List.fold f (tl(RBT_Impl.keys t)) (hd(RBT_Impl.keys t))"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   126
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   127
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   128
paragraph \<open>minimum\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   129
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   130
definition rbt_min :: "('a::linorder, unit) RBT_Impl.rbt \<Rightarrow> 'a" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   131
  where "rbt_min t = rbt_fold1_keys min t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   132
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   133
lemma key_le_right: "rbt_sorted (Branch c lt k v rt) \<Longrightarrow> (\<And>x. x \<in>set (RBT_Impl.keys rt) \<Longrightarrow> k \<le> x)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   134
by  (auto simp: rbt_greater_prop less_imp_le)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   135
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   136
lemma left_le_key: "rbt_sorted (Branch c lt k v rt) \<Longrightarrow> (\<And>x. x \<in>set (RBT_Impl.keys lt) \<Longrightarrow> x \<le> k)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   137
by (auto simp: rbt_less_prop less_imp_le)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   138
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   139
lemma fold_min_triv:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   140
  fixes k :: "_ :: linorder"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   141
  shows "(\<forall>x\<in>set xs. k \<le> x) \<Longrightarrow> List.fold min xs k = k" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   142
by (induct xs) (auto simp add: min_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   143
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   144
lemma rbt_min_simps:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   145
  "is_rbt (Branch c RBT_Impl.Empty k v rt) \<Longrightarrow> rbt_min (Branch c RBT_Impl.Empty k v rt) = k"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   146
by (auto intro: fold_min_triv dest: key_le_right is_rbt_rbt_sorted simp: rbt_fold1_keys_def rbt_min_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   147
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   148
fun rbt_min_opt where
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   149
  "rbt_min_opt (Branch c RBT_Impl.Empty k v rt) = k" |
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   150
  "rbt_min_opt (Branch c (Branch lc llc lk lv lrt) k v rt) = rbt_min_opt (Branch lc llc lk lv lrt)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   151
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   152
lemma rbt_min_opt_Branch:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   153
  "t1 \<noteq> rbt.Empty \<Longrightarrow> rbt_min_opt (Branch c t1 k () t2) = rbt_min_opt t1" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   154
by (cases t1) auto
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   155
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   156
lemma rbt_min_opt_induct [case_names empty left_empty left_non_empty]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   157
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   158
  assumes "P rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   159
  assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t1 = rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   160
  assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t1 \<noteq> rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   161
  shows "P t"
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   162
  using assms
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   163
proof (induct t)
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   164
  case Empty
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   165
  then show ?case by simp
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   166
next
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   167
  case (Branch x1 t1 x3 x4 t2)
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   168
  then show ?case by (cases "t1 = rbt.Empty") simp_all
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   169
qed
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   170
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   171
lemma rbt_min_opt_in_set: 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   172
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   173
  assumes "t \<noteq> rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   174
  shows "rbt_min_opt t \<in> set (RBT_Impl.keys t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   175
using assms by (induction t rule: rbt_min_opt.induct) (auto)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   176
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   177
lemma rbt_min_opt_is_min:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   178
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   179
  assumes "rbt_sorted t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   180
  assumes "t \<noteq> rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   181
  shows "\<And>y. y \<in> set (RBT_Impl.keys t) \<Longrightarrow> y \<ge> rbt_min_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   182
using assms 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   183
proof (induction t rule: rbt_min_opt_induct)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   184
  case empty
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   185
  then show ?case by simp
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   186
next
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   187
  case left_empty
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   188
  then show ?case by (auto intro: key_le_right simp del: rbt_sorted.simps)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   189
next
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   190
  case (left_non_empty c t1 k v t2 y)
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   191
  then consider "y = k" | "y \<in> set (RBT_Impl.keys t1)" | "y \<in> set (RBT_Impl.keys t2)"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   192
    by auto
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   193
  then show ?case 
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   194
  proof cases
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   195
    case 1
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   196
    with left_non_empty show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   197
      by (auto simp add: rbt_min_opt_Branch intro: left_le_key rbt_min_opt_in_set)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   198
  next
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   199
    case 2
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   200
    with left_non_empty show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   201
      by (auto simp add: rbt_min_opt_Branch)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   202
  next 
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   203
    case y: 3
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   204
    have "rbt_min_opt t1 \<le> k"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   205
      using left_non_empty by (simp add: left_le_key rbt_min_opt_in_set)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   206
    moreover have "k \<le> y"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   207
      using left_non_empty y by (simp add: key_le_right)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   208
    ultimately show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   209
      using left_non_empty y by (simp add: rbt_min_opt_Branch)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   210
  qed
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   211
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   212
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   213
lemma rbt_min_eq_rbt_min_opt:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   214
  assumes "t \<noteq> RBT_Impl.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   215
  assumes "is_rbt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   216
  shows "rbt_min t = rbt_min_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   217
proof -
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   218
  from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   219
  with assms show ?thesis
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   220
    by (simp add: rbt_min_def rbt_fold1_keys_def rbt_min_opt_is_min
51540
eea5c4ca4a0e explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
haftmann
parents: 51489
diff changeset
   221
      Min.set_eq_fold [symmetric] Min_eqI rbt_min_opt_in_set)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   222
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   223
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   224
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   225
paragraph \<open>maximum\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   226
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   227
definition rbt_max :: "('a::linorder, unit) RBT_Impl.rbt \<Rightarrow> 'a" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   228
  where "rbt_max t = rbt_fold1_keys max t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   229
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   230
lemma fold_max_triv:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   231
  fixes k :: "_ :: linorder"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   232
  shows "(\<forall>x\<in>set xs. x \<le> k) \<Longrightarrow> List.fold max xs k = k" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   233
by (induct xs) (auto simp add: max_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   234
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   235
lemma fold_max_rev_eq:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   236
  fixes xs :: "('a :: linorder) list"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   237
  assumes "xs \<noteq> []"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   238
  shows "List.fold max (tl xs) (hd xs) = List.fold max (tl (rev xs)) (hd (rev xs))" 
51540
eea5c4ca4a0e explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
haftmann
parents: 51489
diff changeset
   239
  using assms by (simp add: Max.set_eq_fold [symmetric])
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   240
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   241
lemma rbt_max_simps:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   242
  assumes "is_rbt (Branch c lt k v RBT_Impl.Empty)" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   243
  shows "rbt_max (Branch c lt k v RBT_Impl.Empty) = k"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   244
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   245
  have "List.fold max (tl (rev(RBT_Impl.keys lt @ [k]))) (hd (rev(RBT_Impl.keys lt @ [k]))) = k"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   246
    using assms by (auto intro!: fold_max_triv dest!: left_le_key is_rbt_rbt_sorted)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   247
  then show ?thesis by (auto simp add: rbt_max_def rbt_fold1_keys_def fold_max_rev_eq)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   248
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   249
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   250
fun rbt_max_opt where
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   251
  "rbt_max_opt (Branch c lt k v RBT_Impl.Empty) = k" |
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   252
  "rbt_max_opt (Branch c lt k v (Branch rc rlc rk rv rrt)) = rbt_max_opt (Branch rc rlc rk rv rrt)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   253
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   254
lemma rbt_max_opt_Branch:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   255
  "t2 \<noteq> rbt.Empty \<Longrightarrow> rbt_max_opt (Branch c t1 k () t2) = rbt_max_opt t2" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   256
by (cases t2) auto
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   257
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   258
lemma rbt_max_opt_induct [case_names empty right_empty right_non_empty]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   259
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   260
  assumes "P rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   261
  assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t2 = rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   262
  assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t2 \<noteq> rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   263
  shows "P t"
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   264
  using assms
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   265
proof (induct t)
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   266
  case Empty
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   267
  then show ?case by simp
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   268
next
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   269
  case (Branch x1 t1 x3 x4 t2)
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   270
  then show ?case by (cases "t2 = rbt.Empty") simp_all
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   271
qed
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   272
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   273
lemma rbt_max_opt_in_set: 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   274
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   275
  assumes "t \<noteq> rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   276
  shows "rbt_max_opt t \<in> set (RBT_Impl.keys t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   277
using assms by (induction t rule: rbt_max_opt.induct) (auto)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   278
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   279
lemma rbt_max_opt_is_max:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   280
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   281
  assumes "rbt_sorted t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   282
  assumes "t \<noteq> rbt.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   283
  shows "\<And>y. y \<in> set (RBT_Impl.keys t) \<Longrightarrow> y \<le> rbt_max_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   284
using assms 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   285
proof (induction t rule: rbt_max_opt_induct)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   286
  case empty
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   287
  then show ?case by simp
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   288
next
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   289
  case right_empty
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   290
  then show ?case by (auto intro: left_le_key simp del: rbt_sorted.simps)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   291
next
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   292
  case (right_non_empty c t1 k v t2 y)
60580
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   293
  then consider "y = k" | "y \<in> set (RBT_Impl.keys t2)" | "y \<in> set (RBT_Impl.keys t1)"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   294
    by auto
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   295
  then show ?case 
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   296
  proof cases
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   297
    case 1
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   298
    with right_non_empty show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   299
      by (auto simp add: rbt_max_opt_Branch intro: key_le_right rbt_max_opt_in_set)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   300
  next
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   301
    case 2
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   302
    with right_non_empty show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   303
      by (auto simp add: rbt_max_opt_Branch)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   304
  next 
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   305
    case y: 3
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   306
    have "rbt_max_opt t2 \<ge> k"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   307
      using right_non_empty by (simp add: key_le_right rbt_max_opt_in_set)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   308
    moreover have "y \<le> k"
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   309
      using right_non_empty y by (simp add: left_le_key)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   310
    ultimately show ?thesis
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   311
      using right_non_empty by (simp add: rbt_max_opt_Branch)
7e741e22d7fc tuned proofs;
wenzelm
parents: 60500
diff changeset
   312
  qed
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   313
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   314
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   315
lemma rbt_max_eq_rbt_max_opt:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   316
  assumes "t \<noteq> RBT_Impl.Empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   317
  assumes "is_rbt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   318
  shows "rbt_max t = rbt_max_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   319
proof -
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   320
  from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   321
  with assms show ?thesis
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   322
    by (simp add: rbt_max_def rbt_fold1_keys_def rbt_max_opt_is_max
51540
eea5c4ca4a0e explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
haftmann
parents: 51489
diff changeset
   323
      Max.set_eq_fold [symmetric] Max_eqI rbt_max_opt_in_set)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   324
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   325
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   326
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   327
subsubsection \<open>abstract\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   328
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   329
context includes rbt.lifting begin
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   330
lift_definition fold1_keys :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('a::linorder, 'b) rbt \<Rightarrow> 'a"
55565
f663fc1e653b simplify proofs because of the stronger reflexivity prover
kuncar
parents: 54263
diff changeset
   331
  is rbt_fold1_keys .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   332
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   333
lemma fold1_keys_def_alt:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   334
  "fold1_keys f t = List.fold f (tl (RBT.keys t)) (hd (RBT.keys t))"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   335
  by transfer (simp add: rbt_fold1_keys_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   336
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   337
lemma finite_fold1_fold1_keys:
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   338
  assumes "semilattice f"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   339
  assumes "\<not> RBT.is_empty t"
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   340
  shows "semilattice_set.F f (Set t) = fold1_keys f t"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   341
proof -
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
   342
  from \<open>semilattice f\<close> interpret semilattice_set f by (rule semilattice_set.intro)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   343
  show ?thesis using assms 
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   344
    by (auto simp: fold1_keys_def_alt set_keys fold_def_alt non_empty_keys set_eq_fold [symmetric])
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   345
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   346
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   347
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   348
paragraph \<open>minimum\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   349
55565
f663fc1e653b simplify proofs because of the stronger reflexivity prover
kuncar
parents: 54263
diff changeset
   350
lift_definition r_min :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   351
55565
f663fc1e653b simplify proofs because of the stronger reflexivity prover
kuncar
parents: 54263
diff changeset
   352
lift_definition r_min_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min_opt .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   353
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   354
lemma r_min_alt_def: "r_min t = fold1_keys min t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   355
by transfer (simp add: rbt_min_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   356
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   357
lemma r_min_eq_r_min_opt:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   358
  assumes "\<not> (RBT.is_empty t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   359
  shows "r_min t = r_min_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   360
using assms unfolding is_empty_empty by transfer (auto intro: rbt_min_eq_rbt_min_opt)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   361
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   362
lemma fold_keys_min_top_eq:
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   363
  fixes t :: "('a::{linorder,bounded_lattice_top}, unit) rbt"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   364
  assumes "\<not> (RBT.is_empty t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   365
  shows "fold_keys min t top = fold1_keys min t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   366
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   367
  have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold min (RBT_Impl.keys t) top = 
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   368
      List.fold min (hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t)) top"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   369
    by (simp add: hd_Cons_tl[symmetric])
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   370
  have **: "List.fold min (x # xs) top = List.fold min xs x" for x :: 'a and xs
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   371
    by (simp add: inf_min[symmetric])
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   372
  show ?thesis
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   373
    using assms
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   374
    unfolding fold_keys_def_alt fold1_keys_def_alt is_empty_empty
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   375
    apply transfer 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   376
    apply (case_tac t) 
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   377
     apply simp 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   378
    apply (subst *)
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   379
     apply simp
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   380
    apply (subst **)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   381
    apply simp
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   382
    done
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   383
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   384
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   385
4a4c14b24800 prefer formal comments;
wenzelm
parents: 67399
diff changeset
   386
paragraph \<open>maximum\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   387
55565
f663fc1e653b simplify proofs because of the stronger reflexivity prover
kuncar
parents: 54263
diff changeset
   388
lift_definition r_max :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   389
55565
f663fc1e653b simplify proofs because of the stronger reflexivity prover
kuncar
parents: 54263
diff changeset
   390
lift_definition r_max_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max_opt .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   391
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   392
lemma r_max_alt_def: "r_max t = fold1_keys max t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   393
by transfer (simp add: rbt_max_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   394
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   395
lemma r_max_eq_r_max_opt:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   396
  assumes "\<not> (RBT.is_empty t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   397
  shows "r_max t = r_max_opt t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   398
using assms unfolding is_empty_empty by transfer (auto intro: rbt_max_eq_rbt_max_opt)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   399
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   400
lemma fold_keys_max_bot_eq:
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   401
  fixes t :: "('a::{linorder,bounded_lattice_bot}, unit) rbt"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   402
  assumes "\<not> (RBT.is_empty t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   403
  shows "fold_keys max t bot = fold1_keys max t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   404
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   405
  have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold max (RBT_Impl.keys t) bot = 
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   406
      List.fold max (hd(RBT_Impl.keys t) # tl(RBT_Impl.keys t)) bot"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   407
    by (simp add: hd_Cons_tl[symmetric])
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   408
  have **: "List.fold max (x # xs) bot = List.fold max xs x" for x :: 'a and xs
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   409
    by (simp add: sup_max[symmetric])
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   410
  show ?thesis
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   411
    using assms
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   412
    unfolding fold_keys_def_alt fold1_keys_def_alt is_empty_empty
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   413
    apply transfer 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   414
    apply (case_tac t) 
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   415
     apply simp 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   416
    apply (subst *)
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   417
     apply simp
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   418
    apply (subst **)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   419
    apply simp
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63194
diff changeset
   420
    done
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   421
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   422
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   423
end
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   424
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
   425
section \<open>Code equations\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   426
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   427
code_datatype Set Coset
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   428
57816
d8bbb97689d3 no need for 'set_simps' now that 'datatype_new' generates the desired 'set' property
blanchet
parents: 57514
diff changeset
   429
declare list.set[code] (* needed? *)
50996
51ad7b4ac096 restore code equations for List.set in RBT_Set; make Scala happy according to 7.1 in the code generator manual
kuncar
parents: 49948
diff changeset
   430
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   431
lemma empty_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   432
  "Set.empty = Set RBT.empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   433
by (auto simp: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   434
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   435
lemma UNIV_Coset [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   436
  "UNIV = Coset RBT.empty"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   437
by (auto simp: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   438
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   439
lemma is_empty_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   440
  "Set.is_empty (Set t) = RBT.is_empty t"
82664
e9f3b94eb6a0 more modern qualification of auxiliary operations
haftmann
parents: 79971
diff changeset
   441
  using non_empty_keys [of t] by (auto simp add: set_keys)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   442
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   443
lemma compl_code [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   444
  "- Set xs = Coset xs"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   445
  "- Coset xs = Set xs"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   446
by (simp_all add: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   447
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   448
lemma member_code [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   449
  "x \<in> (Set t) = (RBT.lookup t x = Some ())"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   450
  "x \<in> (Coset t) = (RBT.lookup t x = None)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   451
by (simp_all add: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   452
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   453
lemma insert_code [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   454
  "Set.insert x (Set t) = Set (RBT.insert x () t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   455
  "Set.insert x (Coset t) = Coset (RBT.delete x t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   456
by (auto simp: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   457
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   458
lemma remove_code [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   459
  "Set.remove x (Set t) = Set (RBT.delete x t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   460
  "Set.remove x (Coset t) = Coset (RBT.insert x () t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   461
by (auto simp: Set_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   462
82774
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   463
lemma inter_Set [code]:
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   464
  "A \<inter> Set t = rbt_filter (\<lambda>k. k \<in> A) t"
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   465
by (simp flip: Set_filter_rbt_filter add: inter_Set_filter)
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   466
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   467
lemma union_Set_Set [code]:
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   468
  "Set t1 \<union> Set t2 = Set (RBT.union t1 t2)"
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   469
by (auto simp add: lookup_union map_add_Some_iff Set_def)
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   470
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   471
lemma union_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   472
  "Set t \<union> A = fold_keys Set.insert t A"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   473
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   474
  interpret comp_fun_idem Set.insert
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   475
    by (fact comp_fun_idem_insert)
67682
00c436488398 tuned proofs -- prefer explicit names for facts from 'interpret';
wenzelm
parents: 67408
diff changeset
   476
  from finite_fold_fold_keys[OF comp_fun_commute_axioms]
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   477
  show ?thesis by (auto simp add: union_fold_insert)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   478
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   479
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   480
lemma minus_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   481
  "A - Set t = fold_keys Set.remove t A"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   482
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   483
  interpret comp_fun_idem Set.remove
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   484
    by (fact comp_fun_idem_remove)
67682
00c436488398 tuned proofs -- prefer explicit names for facts from 'interpret';
wenzelm
parents: 67408
diff changeset
   485
  from finite_fold_fold_keys[OF comp_fun_commute_axioms]
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   486
  show ?thesis by (auto simp add: minus_fold_remove)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   487
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   488
82774
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   489
lemma inter_Coset_Coset [code]:
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   490
  "Coset t1 \<inter> Coset t2 = Coset (RBT.union t1 t2)"
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   491
by (auto simp add: lookup_union map_add_Some_iff Set_def)
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   492
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   493
lemma inter_Coset [code]:
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   494
  "A \<inter> Coset t = fold_keys Set.remove t A"
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   495
by (simp add: Diff_eq [symmetric] minus_Set)
2865a6618cba append (rather than prepend) code equations: the order within a theory is maintained in the resulting code
haftmann
parents: 82773
diff changeset
   496
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   497
lemma union_Coset [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   498
  "Coset t \<union> A = - rbt_filter (\<lambda>k. k \<notin> A) t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   499
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   500
  have *: "\<And>A B. (-A \<union> B) = -(-B \<inter> A)" by blast
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   501
  show ?thesis by (simp del: boolean_algebra_class.compl_inf add: * inter_Set)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   502
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   503
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   504
lemma minus_Coset [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   505
  "A - Coset t = rbt_filter (\<lambda>k. k \<in> A) t"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   506
by (simp add: inter_Set[simplified Int_commute])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   507
49757
73ab6d4a9236 rename Set.project to Set.filter - more appropriate name
kuncar
parents: 48623
diff changeset
   508
lemma filter_Set [code]:
82664
e9f3b94eb6a0 more modern qualification of auxiliary operations
haftmann
parents: 79971
diff changeset
   509
  "Set.filter P (Set t) = rbt_filter P t"
e9f3b94eb6a0 more modern qualification of auxiliary operations
haftmann
parents: 79971
diff changeset
   510
  by (fact Set_filter_rbt_filter)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   511
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   512
lemma image_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   513
  "image f (Set t) = fold_keys (\<lambda>k A. Set.insert (f k) A) t {}"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   514
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   515
  have "comp_fun_commute (\<lambda>k. Set.insert (f k))"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   516
    by standard auto
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   517
  then show ?thesis
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   518
    by (auto simp add: image_fold_insert intro!: finite_fold_fold_keys)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   519
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   520
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   521
lemma Ball_Set [code]:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   522
  "Ball (Set t) P \<longleftrightarrow> RBT.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t True"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   523
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   524
  have "comp_fun_commute (\<lambda>k s. s \<and> P k)"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   525
    by standard auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   526
  then show ?thesis 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   527
    by (simp add: foldi_fold_conj[symmetric] Ball_fold finite_fold_fold_keys)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   528
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   529
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   530
lemma Bex_Set [code]:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   531
  "Bex (Set t) P \<longleftrightarrow> RBT.foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t False"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   532
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   533
  have "comp_fun_commute (\<lambda>k s. s \<or> P k)"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   534
    by standard auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   535
  then show ?thesis 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   536
    by (simp add: foldi_fold_disj[symmetric] Bex_fold finite_fold_fold_keys)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   537
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   538
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   539
lemma subset_code [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   540
  "Set t \<le> B \<longleftrightarrow> (\<forall>x\<in>Set t. x \<in> B)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   541
  "A \<le> Coset t \<longleftrightarrow> (\<forall>y\<in>Set t. y \<notin> A)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   542
by auto
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   543
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   544
lemma subset_Coset_empty_Set_empty [code]:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   545
  "Coset t1 \<le> Set t2 \<longleftrightarrow> (case (RBT.impl_of t1, RBT.impl_of t2) of 
67091
1393c2340eec more symbols;
wenzelm
parents: 66404
diff changeset
   546
    (rbt.Empty, rbt.Empty) \<Rightarrow> False |
1393c2340eec more symbols;
wenzelm
parents: 66404
diff changeset
   547
    (_, _) \<Rightarrow> Code.abort (STR ''non_empty_trees'') (\<lambda>_. Coset t1 \<le> Set t2))"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   548
proof -
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   549
  have *: "\<And>t. RBT.impl_of t = rbt.Empty \<Longrightarrow> t = RBT rbt.Empty"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   550
    by (subst(asm) RBT_inverse[symmetric]) (auto simp: impl_of_inject)
56519
c1048f5bbb45 more appropriate name (Lifting.invariant -> eq_onp)
kuncar
parents: 56218
diff changeset
   551
  have **: "eq_onp is_rbt rbt.Empty rbt.Empty" unfolding eq_onp_def by simp
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   552
  show ?thesis  
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   553
    by (auto simp: Set_def lookup.abs_eq[OF **] dest!: * split: rbt.split)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   554
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   555
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 58881
diff changeset
   556
text \<open>A frequent case -- avoid intermediate sets\<close>
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   557
lemma [code_unfold]:
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   558
  "Set t1 \<subseteq> Set t2 \<longleftrightarrow> RBT.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> k \<in> Set t2) t1 True"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   559
by (simp add: subset_code Ball_Set)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   560
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   561
lemma card_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   562
  "card (Set t) = fold_keys (\<lambda>_ n. n + 1) t 0"
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   563
  by (auto simp add: card.eq_fold intro: finite_fold_fold_keys comp_fun_commute_const)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   564
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63649
diff changeset
   565
lemma sum_Set [code]:
67091
1393c2340eec more symbols;
wenzelm
parents: 66404
diff changeset
   566
  "sum f (Set xs) = fold_keys (plus \<circ> f) xs 0"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   567
proof -
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67091
diff changeset
   568
  have "comp_fun_commute (\<lambda>x. (+) (f x))"
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   569
    by standard (auto simp: ac_simps)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   570
  then show ?thesis 
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63649
diff changeset
   571
    by (auto simp add: sum.eq_fold finite_fold_fold_keys o_def)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   572
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   573
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   574
lemma prod_Set [code]:
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   575
  "prod f (Set xs) = fold_keys (times \<circ> f) xs 1"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   576
proof -
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   577
  have "comp_fun_commute (\<lambda>x. (*) (f x))"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   578
    by standard (auto simp: ac_simps)
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   579
  then show ?thesis 
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   580
    by (auto simp add: prod.eq_fold finite_fold_fold_keys o_def)
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   581
qed
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   582
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   583
lemma the_elem_set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   584
  fixes t :: "('a :: linorder, unit) rbt"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   585
  shows "the_elem (Set t) = (case RBT.impl_of t of 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   586
    (Branch RBT_Impl.B RBT_Impl.Empty x () RBT_Impl.Empty) \<Rightarrow> x
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   587
    | _ \<Rightarrow> Code.abort (STR ''not_a_singleton_tree'') (\<lambda>_. the_elem (Set t)))"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   588
proof -
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   589
  {
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   590
    fix x :: "'a :: linorder"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   591
    let ?t = "Branch RBT_Impl.B RBT_Impl.Empty x () RBT_Impl.Empty" 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   592
    have *:"?t \<in> {t. is_rbt t}" unfolding is_rbt_def by auto
56519
c1048f5bbb45 more appropriate name (Lifting.invariant -> eq_onp)
kuncar
parents: 56218
diff changeset
   593
    then have **:"eq_onp is_rbt ?t ?t" unfolding eq_onp_def by auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   594
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   595
    have "RBT.impl_of t = ?t \<Longrightarrow> the_elem (Set t) = x" 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   596
      by (subst(asm) RBT_inverse[symmetric, OF *])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   597
        (auto simp: Set_def the_elem_def lookup.abs_eq[OF **] impl_of_inject)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   598
  }
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   599
  then show ?thesis
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   600
    by(auto split: rbt.split unit.split color.split)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   601
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   602
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   603
lemma Pow_Set [code]: "Pow (Set t) = fold_keys (\<lambda>x A. A \<union> Set.insert x ` A) t {{}}"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   604
  by (simp add: Pow_fold finite_fold_fold_keys[OF comp_fun_commute_Pow_fold])
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   605
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   606
lemma product_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   607
  "Product_Type.product (Set t1) (Set t2) = 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   608
    fold_keys (\<lambda>x A. fold_keys (\<lambda>y. Set.insert (x, y)) t2 A) t1 {}"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   609
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   610
  have *: "comp_fun_commute (\<lambda>y. Set.insert (x, y))" for x
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   611
    by standard auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   612
  show ?thesis using finite_fold_fold_keys[OF comp_fun_commute_product_fold, of "Set t2" "{}" "t1"]  
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   613
    by (simp add: product_fold Product_Type.product_def finite_fold_fold_keys[OF *])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   614
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   615
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   616
lemma Id_on_Set [code]: "Id_on (Set t) =  fold_keys (\<lambda>x. Set.insert (x, x)) t {}"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   617
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   618
  have "comp_fun_commute (\<lambda>x. Set.insert (x, x))"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   619
    by standard auto
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   620
  then show ?thesis
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   621
    by (auto simp add: Id_on_fold intro!: finite_fold_fold_keys)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   622
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   624
lemma Image_Set [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   625
  "(Set t) `` S = fold_keys (\<lambda>(x,y) A. if x \<in> S then Set.insert y A else A) t {}"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   626
by (auto simp add: Image_fold finite_fold_fold_keys[OF comp_fun_commute_Image_fold])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   627
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   628
lemma trancl_set_ntrancl [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   629
  "trancl (Set t) = ntrancl (card (Set t) - 1) (Set t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   630
by (simp add: finite_trancl_ntranl)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   631
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   632
lemma relcomp_Set[code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   633
  "(Set t1) O (Set t2) = fold_keys 
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   634
    (\<lambda>(x,y) A. fold_keys (\<lambda>(w,z) A'. if y = w then Set.insert (x,z) A' else A') t2 A) t1 {}"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   635
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   636
  interpret comp_fun_idem Set.insert
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   637
    by (fact comp_fun_idem_insert)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   638
  have *: "\<And>x y. comp_fun_commute (\<lambda>(w, z) A'. if y = w then Set.insert (x, z) A' else A')"
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   639
    by standard (auto simp add: fun_eq_iff)
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   640
  show ?thesis
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   641
    using finite_fold_fold_keys[OF comp_fun_commute_relcomp_fold, of "Set t2" "{}" t1]
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   642
    by (simp add: relcomp_fold finite_fold_fold_keys[OF *])
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   643
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   644
79971
033f90dc441d redefined wf as an abbreviation for "wf_on UNIV"
desharna
parents: 73968
diff changeset
   645
lemma wf_set: "wf (Set t) = acyclic (Set t)"
033f90dc441d redefined wf as an abbreviation for "wf_on UNIV"
desharna
parents: 73968
diff changeset
   646
  by (simp add: wf_iff_acyclic_if_finite)
033f90dc441d redefined wf as an abbreviation for "wf_on UNIV"
desharna
parents: 73968
diff changeset
   647
033f90dc441d redefined wf as an abbreviation for "wf_on UNIV"
desharna
parents: 73968
diff changeset
   648
lemma wf_code_set[code]: "wf_code (Set t) = acyclic (Set t)"
033f90dc441d redefined wf as an abbreviation for "wf_on UNIV"
desharna
parents: 73968
diff changeset
   649
  unfolding wf_code_def using wf_set .
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   650
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   651
lemma Min_fin_set_fold [code]:
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   652
  "Min (Set t) = 
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   653
  (if RBT.is_empty t
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   654
   then Code.abort (STR ''not_non_empty_tree'') (\<lambda>_. Min (Set t))
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   655
   else r_min_opt t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   656
proof -
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   657
  have *: "semilattice (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" ..
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   658
  with finite_fold1_fold1_keys [OF *, folded Min_def]
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   659
  show ?thesis
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   660
    by (simp add: r_min_alt_def r_min_eq_r_min_opt [symmetric])  
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   661
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   662
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   663
lemma Inf_fin_set_fold [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   664
  "Inf_fin (Set t) = Min (Set t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   665
by (simp add: inf_min Inf_fin_def Min_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   666
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   667
lemma Inf_Set_fold:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   668
  fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   669
  shows "Inf (Set t) = (if RBT.is_empty t then top else r_min_opt t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   670
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   671
  have "comp_fun_commute (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   672
    by standard (simp add: fun_eq_iff ac_simps)
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   673
  then have "t \<noteq> RBT.empty \<Longrightarrow> Finite_Set.fold min top (Set t) = fold1_keys min t"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   674
    by (simp add: finite_fold_fold_keys fold_keys_min_top_eq)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   675
  then show ?thesis 
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   676
    by (auto simp add: Inf_fold_inf inf_min empty_Set[symmetric]
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   677
      r_min_eq_r_min_opt[symmetric] r_min_alt_def)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   678
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   679
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   680
lemma Max_fin_set_fold [code]:
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   681
  "Max (Set t) = 
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   682
  (if RBT.is_empty t
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   683
   then Code.abort (STR ''not_non_empty_tree'') (\<lambda>_. Max (Set t))
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   684
   else r_max_opt t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   685
proof -
51489
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   686
  have *: "semilattice (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" ..
f738e6dbd844 fundamental revision of big operators on sets
haftmann
parents: 51115
diff changeset
   687
  with finite_fold1_fold1_keys [OF *, folded Max_def]
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   688
  show ?thesis
53745
788730ab7da4 prefer Code.abort over code_abort
Andreas Lochbihler
parents: 51540
diff changeset
   689
    by (simp add: r_max_alt_def r_max_eq_r_max_opt [symmetric])  
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   690
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   691
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   692
lemma Sup_fin_set_fold [code]:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   693
  "Sup_fin (Set t) = Max (Set t)"
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   694
by (simp add: sup_max Sup_fin_def Max_def)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   695
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   696
lemma Sup_Set_fold:
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   697
  fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   698
  shows "Sup (Set t) = (if RBT.is_empty t then bot else r_max_opt t)"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   699
proof -
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   700
  have "comp_fun_commute (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)"
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   701
    by standard (simp add: fun_eq_iff ac_simps)
56019
682bba24e474 hide implementation details
kuncar
parents: 55584
diff changeset
   702
  then have "t \<noteq> RBT.empty \<Longrightarrow> Finite_Set.fold max bot (Set t) = fold1_keys max t"
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   703
    by (simp add: finite_fold_fold_keys fold_keys_max_bot_eq)
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   704
  then show ?thesis 
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   705
    by (auto simp add: Sup_fold_sup sup_max empty_Set[symmetric]
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   706
      r_max_eq_r_max_opt[symmetric] r_max_alt_def)
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   707
qed
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   708
66404
7eb451adbda6 code generation for Gcd and Lcm when sets are implemented by red-black trees
haftmann
parents: 66148
diff changeset
   709
context
7eb451adbda6 code generation for Gcd and Lcm when sets are implemented by red-black trees
haftmann
parents: 66148
diff changeset
   710
begin
7eb451adbda6 code generation for Gcd and Lcm when sets are implemented by red-black trees
haftmann
parents: 66148
diff changeset
   711
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   712
qualified definition Inf' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   713
  where [code_abbrev]: "Inf' = Inf"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   714
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   715
lemma Inf'_Set_fold [code]:
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   716
  "Inf' (Set t) = (if RBT.is_empty t then top else r_min_opt t)"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   717
  by (simp add: Inf'_def Inf_Set_fold)
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   718
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   719
qualified definition Sup' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   720
  where [code_abbrev]: "Sup' = Sup"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   721
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   722
lemma Sup'_Set_fold [code]:
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   723
  "Sup' (Set t) = (if RBT.is_empty t then bot else r_max_opt t)"
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   724
  by (simp add: Sup'_def Sup_Set_fold)
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   725
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   726
end
73968
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   727
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   728
lemma [code]:
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   729
  "Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) = fold_keys gcd t (0::'a::{semiring_gcd, linorder})"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   730
proof -
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   731
  have "comp_fun_commute (gcd :: 'a \<Rightarrow> _)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   732
    by standard (simp add: fun_eq_iff ac_simps)
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   733
  with finite_fold_fold_keys [of _ 0 t]
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   734
  have "Finite_Set.fold gcd 0 (Set t) = fold_keys gcd t 0"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   735
    by blast
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   736
  then show ?thesis
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   737
    by (simp add: Gcd_fin.eq_fold)
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   738
qed
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   739
73968
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   740
lemma [code]:
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   741
  "Gcd (Set t) = (Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) :: nat)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   742
  by simp
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   743
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   744
lemma [code]:
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   745
  "Gcd (Set t) = (Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) :: int)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   746
  by simp
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   747
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   748
lemma [code]:
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   749
  "Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) = fold_keys lcm t (1::'a::{semiring_gcd, linorder})"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   750
proof -
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   751
  have "comp_fun_commute (lcm :: 'a \<Rightarrow> _)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   752
    by standard (simp add: fun_eq_iff ac_simps)
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   753
  with finite_fold_fold_keys [of _ 1 t]
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   754
  have "Finite_Set.fold lcm 1 (Set t) = fold_keys lcm t 1"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   755
    by blast
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   756
  then show ?thesis
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   757
    by (simp add: Lcm_fin.eq_fold)
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   758
qed
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   759
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   760
lemma [code]:
73968
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   761
  "Lcm (Set t) = (Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) :: nat)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   762
  by simp
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   763
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   764
lemma [code]:
73968
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   765
  "Lcm (Set t) = (Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) :: int)"
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   766
  by simp
0274d442b7ea proper local context
haftmann
parents: 73832
diff changeset
   767
82688
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   768
lemma sorted_list_set [code]: "sorted_list_of_set (Set t) = RBT.keys t"
60679
ade12ef2773c tuned proofs;
wenzelm
parents: 60580
diff changeset
   769
  by (auto simp add: set_keys intro: sorted_distinct_set_unique) 
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   770
82688
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   771
lemma Least_code [code]:
82824
7ddae44464d4 moved to more appropriate theory
haftmann
parents: 82774
diff changeset
   772
  \<open>Lattices_Big.Least (Set t) = (if RBT.is_empty t then Lattices_Big.Least_abort {} else Min (Set t))\<close>
7ddae44464d4 moved to more appropriate theory
haftmann
parents: 82774
diff changeset
   773
  apply (auto simp add: Lattices_Big.Least_abort_def simp flip: empty_Set)
82688
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   774
  apply (subst Least_Min)
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   775
  using is_empty_Set
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   776
    apply auto
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   777
  done
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   778
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   779
lemma Greatest_code [code]:
82824
7ddae44464d4 moved to more appropriate theory
haftmann
parents: 82774
diff changeset
   780
  \<open>Lattices_Big.Greatest (Set t) = (if RBT.is_empty t then Lattices_Big.Greatest_abort {} else Max (Set t))\<close>
7ddae44464d4 moved to more appropriate theory
haftmann
parents: 82774
diff changeset
   781
  apply (auto simp add: Lattices_Big.Greatest_abort_def simp flip: empty_Set)
82688
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   782
  apply (subst Greatest_Max)
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   783
  using is_empty_Set
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   784
    apply auto
b391142bd2d2 prefer already existing operation to calculate minimum
haftmann
parents: 82669
diff changeset
   785
  done
53955
436649a2ed62 added Bleast code eqns for RBT
nipkow
parents: 53745
diff changeset
   786
82886
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   787
lemma [code]:
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   788
  \<open>Option.these A = the ` Set.filter (Not \<circ> Option.is_none) A\<close>
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   789
  by (fact Option.these_eq)
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   790
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   791
lemma [code]:
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   792
  \<open>Option.image_filter f A = Option.these (image f A)\<close>
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   793
  by (fact Option.image_filter_eq)
8d1e295aab70 clarified name and status of auxiliary operation
haftmann
parents: 82824
diff changeset
   794
82902
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   795
lemma [code]:
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   796
  \<open>Set.can_select P A = is_singleton (Set.filter P A)\<close>
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   797
  by (fact Set.can_select_iff_is_singleton)
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   798
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   799
declare [[code drop:
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   800
  \<open>Inf :: _ \<Rightarrow> 'a set\<close>
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   801
  \<open>Sup :: _ \<Rightarrow> 'a set\<close>
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   802
  \<open>Inf :: _ \<Rightarrow> 'a Predicate.pred\<close>
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   803
  \<open>Sup :: _ \<Rightarrow> 'a Predicate.pred\<close>
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   804
  pred_of_set
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   805
  Wellfounded.acc
99a720d3ed8f clarified code setup
haftmann
parents: 82886
diff changeset
   806
]]
82773
4ec8e654112f scope pending code equations to theories
haftmann
parents: 82688
diff changeset
   807
48623
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   808
hide_const (open) RBT_Set.Set RBT_Set.Coset
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   809
bea613f2543d implementation of sets by RBT trees for the code generator
kuncar
parents:
diff changeset
   810
end