src/HOL/Data_Structures/Set2_Join.thy
author nipkow
Wed, 31 Jul 2024 10:36:28 +0200
changeset 80628 161286c9d426
parent 80398 4953d52e04d2
permissions -rw-r--r--
tuned names
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     2
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
     3
section "Join-Based Implementation of Sets"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     4
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
     5
theory Set2_Join
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     6
imports
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     7
  Isin2
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     8
begin
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
     9
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    10
text \<open>This theory implements the set operations \<open>insert\<close>, \<open>delete\<close>,
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    11
\<open>union\<close>, \<open>inter\<close>section and \<open>diff\<close>erence. The implementation is based on binary search trees.
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    12
All operations are reduced to a single operation \<open>join l x r\<close> that joins two BSTs \<open>l\<close> and \<open>r\<close>
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    13
and an element \<open>x\<close> such that \<open>l < x < r\<close>.
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    14
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68969
diff changeset
    15
The theory is based on theory \<^theory>\<open>HOL-Data_Structures.Tree2\<close> where nodes have an additional field.
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    16
This field is ignored here but it means that this theory can be instantiated
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68969
diff changeset
    17
with red-black trees (see theory \<^file>\<open>Set2_Join_RBT.thy\<close>) and other balanced trees.
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    18
This approach is very concrete and fixes the type of trees.
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68969
diff changeset
    19
Alternatively, one could assume some abstract type \<^typ>\<open>'t\<close> of trees with suitable decomposition
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    20
and recursion operators on it.\<close>
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    21
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
    22
locale Set2_Join =
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    23
fixes join :: "('a::linorder*'b) tree \<Rightarrow> 'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree"
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    24
fixes inv :: "('a*'b) tree \<Rightarrow> bool"
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
    25
assumes set_join: "set_tree (join l a r) = set_tree l \<union> {a} \<union> set_tree r"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    26
assumes bst_join: "bst (Node l (a, b) r) \<Longrightarrow> bst (join l a r)"
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
    27
assumes inv_Leaf: "inv \<langle>\<rangle>"
68969
nipkow
parents: 68484
diff changeset
    28
assumes inv_join: "\<lbrakk> inv l; inv r \<rbrakk> \<Longrightarrow> inv (join l a r)"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    29
assumes inv_Node: "\<lbrakk> inv (Node l (a,b) r) \<rbrakk> \<Longrightarrow> inv l \<and> inv r"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    30
begin
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    31
71846
nipkow
parents: 70755
diff changeset
    32
declare set_join [simp] Let_def[simp]
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    33
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    34
subsection "\<open>split_min\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    35
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    36
fun split_min :: "('a*'b) tree \<Rightarrow> 'a \<times> ('a*'b) tree" where
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    37
"split_min (Node l (a, _) r) =
68969
nipkow
parents: 68484
diff changeset
    38
  (if l = Leaf then (a,r) else let (m,l') = split_min l in (m, join l' a r))"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    39
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    40
lemma split_min_set:
70582
nipkow
parents: 70572
diff changeset
    41
  "\<lbrakk> split_min t = (m,t');  t \<noteq> Leaf \<rbrakk> \<Longrightarrow> m \<in> set_tree t \<and> set_tree t = {m} \<union> set_tree t'"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    42
proof(induction t arbitrary: t' rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    43
  case Node thus ?case by(auto split: prod.splits if_splits dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    44
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    45
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    46
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    47
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    48
lemma split_min_bst:
68969
nipkow
parents: 68484
diff changeset
    49
  "\<lbrakk> split_min t = (m,t');  bst t;  t \<noteq> Leaf \<rbrakk> \<Longrightarrow>  bst t' \<and> (\<forall>x \<in> set_tree t'. m < x)"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    50
proof(induction t arbitrary: t' rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    51
  case Node thus ?case by(fastforce simp: split_min_set bst_join split: prod.splits if_splits)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    52
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    53
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    54
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    55
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    56
lemma split_min_inv:
68969
nipkow
parents: 68484
diff changeset
    57
  "\<lbrakk> split_min t = (m,t');  inv t;  t \<noteq> Leaf \<rbrakk> \<Longrightarrow>  inv t'"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    58
proof(induction t arbitrary: t' rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    59
  case Node thus ?case by(auto simp: inv_join split: prod.splits if_splits dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    60
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    61
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    62
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    63
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    64
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    65
subsection "\<open>join2\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    66
80398
4953d52e04d2 tuned def: patter matching needs more beautification
nipkow
parents: 79968
diff changeset
    67
definition join2 :: "('a*'b) tree \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
4953d52e04d2 tuned def: patter matching needs more beautification
nipkow
parents: 79968
diff changeset
    68
"join2 l r = (if r = Leaf then l else let (m,r') = split_min r in join l m r')"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    69
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    70
lemma set_join2[simp]: "set_tree (join2 l r) = set_tree l \<union> set_tree r"
80398
4953d52e04d2 tuned def: patter matching needs more beautification
nipkow
parents: 79968
diff changeset
    71
by(cases r)(simp_all add: split_min_set join2_def split: prod.split)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    72
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    73
lemma bst_join2: "\<lbrakk> bst l; bst r; \<forall>x \<in> set_tree l. \<forall>y \<in> set_tree r. x < y \<rbrakk>
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    74
  \<Longrightarrow> bst (join2 l r)"
80398
4953d52e04d2 tuned def: patter matching needs more beautification
nipkow
parents: 79968
diff changeset
    75
by(cases r)(simp_all add: bst_join split_min_set split_min_bst join2_def split: prod.split)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    76
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    77
lemma inv_join2: "\<lbrakk> inv l; inv r \<rbrakk> \<Longrightarrow> inv (join2 l r)"
80398
4953d52e04d2 tuned def: patter matching needs more beautification
nipkow
parents: 79968
diff changeset
    78
by(cases r)(simp_all add: inv_join split_min_set split_min_inv join2_def split: prod.split)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    79
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    80
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    81
subsection "\<open>split\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    82
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    83
fun split :: "'a \<Rightarrow> ('a*'b)tree \<Rightarrow> ('a*'b)tree \<times> bool \<times> ('a*'b)tree" where
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    84
"split x Leaf = (Leaf, False, Leaf)" |
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    85
"split x (Node l (a, _) r) =
70572
nipkow
parents: 69597
diff changeset
    86
  (case cmp x a of
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    87
     LT \<Rightarrow> let (l1,b,l2) = split x l in (l1, b, join l2 a r) |
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    88
     GT \<Rightarrow> let (r1,b,r2) = split x r in (join l a r1, b, r2) |
70572
nipkow
parents: 69597
diff changeset
    89
     EQ \<Rightarrow> (l, True, r))"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    90
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    91
lemma split: "split x t = (l,b,r) \<Longrightarrow> bst t \<Longrightarrow>
68969
nipkow
parents: 68484
diff changeset
    92
  set_tree l = {a \<in> set_tree t. a < x} \<and> set_tree r = {a \<in> set_tree t. x < a}
72883
nipkow
parents: 72269
diff changeset
    93
  \<and> (b = (x \<in> set_tree t)) \<and> bst l \<and> bst r"
nipkow
parents: 72269
diff changeset
    94
proof(induction t arbitrary: l b r rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    95
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    96
next
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
    97
  case (Node y a b z l c r)
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    98
  consider (LT) l1 xin l2 where "(l1,xin,l2) = split x y" 
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
    99
    and "split x \<langle>y, (a, b), z\<rangle> = (l1, xin, join l2 a z)" and "cmp x a = LT"
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   100
  | (GT) r1 xin r2 where "(r1,xin,r2) = split x z" 
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   101
    and "split x \<langle>y, (a, b), z\<rangle> = (join y a r1, xin, r2)" and "cmp x a = GT"
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   102
  | (EQ) "split x \<langle>y, (a, b), z\<rangle> = (y, True, z)" and "cmp x a = EQ"
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   103
    by (force split: cmp_val.splits prod.splits if_splits)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   104
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   105
  thus ?case 
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   106
  proof cases
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   107
    case (LT l1 xin l2)
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   108
    with Node.IH(1)[OF \<open>(l1,xin,l2) = split x y\<close>[symmetric]] Node.prems
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   109
    show ?thesis by (force intro!: bst_join)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   110
  next
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   111
    case (GT r1 xin r2)
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   112
    with Node.IH(2)[OF \<open>(r1,xin,r2) = split x z\<close>[symmetric]] Node.prems
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   113
    show ?thesis by (force intro!: bst_join)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   114
  next
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   115
    case EQ
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   116
    with Node.prems show ?thesis by auto
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   117
  qed
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   118
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   119
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   120
lemma split_inv: "split x t = (l,b,r) \<Longrightarrow> inv t \<Longrightarrow> inv l \<and> inv r"
72883
nipkow
parents: 72269
diff changeset
   121
proof(induction t arbitrary: l b r rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   122
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   123
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   124
  case Node
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   125
  thus ?case by(force simp: inv_join split!: prod.splits if_splits dest!: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   126
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   127
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   128
declare split.simps[simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   129
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   130
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   131
subsection "\<open>insert\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   132
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   133
definition insert :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   134
"insert x t = (let (l,_,r) = split x t in join l x r)"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   135
70582
nipkow
parents: 70572
diff changeset
   136
lemma set_tree_insert: "bst t \<Longrightarrow> set_tree (insert x t) = {x} \<union> set_tree t"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   137
by(auto simp add: insert_def split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   138
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   139
lemma bst_insert: "bst t \<Longrightarrow> bst (insert x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   140
by(auto simp add: insert_def bst_join dest: split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   141
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   142
lemma inv_insert: "inv t \<Longrightarrow> inv (insert x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   143
by(force simp: insert_def inv_join dest: split_inv split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   144
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   145
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   146
subsection "\<open>delete\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   147
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   148
definition delete :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   149
"delete x t = (let (l,_,r) = split x t in join2 l r)"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   150
68969
nipkow
parents: 68484
diff changeset
   151
lemma set_tree_delete: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   152
by(auto simp: delete_def split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   153
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   154
lemma bst_delete: "bst t \<Longrightarrow> bst (delete x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   155
by(force simp add: delete_def intro: bst_join2 dest: split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   156
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   157
lemma inv_delete: "inv t \<Longrightarrow> inv (delete x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   158
by(force simp: delete_def inv_join2 dest: split_inv split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   159
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   160
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   161
subsection "\<open>union\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   162
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   163
fun union :: "('a*'b)tree \<Rightarrow> ('a*'b)tree \<Rightarrow> ('a*'b)tree" where
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   164
"union t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   165
  (if t1 = Leaf then t2 else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   166
   if t2 = Leaf then t1 else
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   167
   case t1 of Node l1 (a, _) r1 \<Rightarrow>
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   168
   let (l2,_ ,r2) = split a t2;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   169
       l' = union l1 l2; r' = union r1 r2
68969
nipkow
parents: 68484
diff changeset
   170
   in join l' a r')"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   171
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   172
declare union.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   173
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   174
lemma set_tree_union: "bst t2 \<Longrightarrow> set_tree (union t1 t2) = set_tree t1 \<union> set_tree t2"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   175
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   176
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   177
  then show ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   178
    by (auto simp: union.simps[of t1 t2] split split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   179
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   180
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   181
lemma bst_union: "\<lbrakk> bst t1; bst t2 \<rbrakk> \<Longrightarrow> bst (union t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   182
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   183
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   184
  thus ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   185
    by(fastforce simp: union.simps[of t1 t2] set_tree_union split intro!: bst_join 
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   186
        split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   187
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   188
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   189
lemma inv_union: "\<lbrakk> inv t1; inv t2 \<rbrakk> \<Longrightarrow> inv (union t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   190
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   191
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   192
  thus ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   193
    by(auto simp:union.simps[of t1 t2] inv_join split_inv
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   194
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   195
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   196
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   197
subsection "\<open>inter\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   198
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   199
fun inter :: "('a*'b)tree \<Rightarrow> ('a*'b)tree \<Rightarrow> ('a*'b)tree" where
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   200
"inter t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   201
  (if t1 = Leaf then Leaf else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   202
   if t2 = Leaf then Leaf else
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   203
   case t1 of Node l1 (a, _) r1 \<Rightarrow>
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   204
   let (l2,b,r2) = split a t2;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   205
       l' = inter l1 l2; r' = inter r1 r2
72883
nipkow
parents: 72269
diff changeset
   206
   in if b then join l' a r' else join2 l' r')"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   207
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   208
declare inter.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   209
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   210
lemma set_tree_inter:
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   211
  "\<lbrakk> bst t1; bst t2 \<rbrakk> \<Longrightarrow> set_tree (inter t1 t2) = set_tree t1 \<inter> set_tree t2"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   212
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   213
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   214
  show ?case
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   215
  proof (cases t1 rule: tree2_cases)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   216
    case Leaf thus ?thesis by (simp add: inter.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   217
  next
68969
nipkow
parents: 68484
diff changeset
   218
    case [simp]: (Node l1 a _ r1)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   219
    show ?thesis
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   220
    proof (cases "t2 = Leaf")
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   221
      case True thus ?thesis by (simp add: inter.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   222
    next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   223
      case False
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   224
      let ?L1 = "set_tree l1" let ?R1 = "set_tree r1"
68969
nipkow
parents: 68484
diff changeset
   225
      have *: "a \<notin> ?L1 \<union> ?R1" using \<open>bst t1\<close> by (fastforce)
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   226
      obtain l2 b r2 where sp: "split a t2 = (l2,b,r2)" using prod_cases3 by blast
72883
nipkow
parents: 72269
diff changeset
   227
      let ?L2 = "set_tree l2" let ?R2 = "set_tree r2" let ?A = "if b then {a} else {}"
72269
nipkow
parents: 71846
diff changeset
   228
      have t2: "set_tree t2 = ?L2 \<union> ?R2 \<union> ?A" and
68969
nipkow
parents: 68484
diff changeset
   229
           **: "?L2 \<inter> ?R2 = {}" "a \<notin> ?L2 \<union> ?R2" "?L1 \<inter> ?R2 = {}" "?L2 \<inter> ?R1 = {}"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   230
        using split[OF sp] \<open>bst t1\<close> \<open>bst t2\<close> by (force, force, force, force, force)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   231
      have IHl: "set_tree (inter l1 l2) = set_tree l1 \<inter> set_tree l2"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   232
        using "1.IH"(1)[OF _ False _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   233
      have IHr: "set_tree (inter r1 r2) = set_tree r1 \<inter> set_tree r2"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   234
        using "1.IH"(2)[OF _ False _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
72269
nipkow
parents: 71846
diff changeset
   235
      have "set_tree t1 \<inter> set_tree t2 = (?L1 \<union> ?R1 \<union> {a}) \<inter> (?L2 \<union> ?R2 \<union> ?A)"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   236
        by(simp add: t2)
72269
nipkow
parents: 71846
diff changeset
   237
      also have "\<dots> = (?L1 \<inter> ?L2) \<union> (?R1 \<inter> ?R2) \<union> ?A"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   238
        using * ** by auto
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   239
      also have "\<dots> = set_tree (inter t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   240
      using IHl IHr sp inter.simps[of t1 t2] False by(simp)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   241
      finally show ?thesis by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   242
    qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   243
  qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   244
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   245
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   246
lemma bst_inter: "\<lbrakk> bst t1; bst t2 \<rbrakk> \<Longrightarrow> bst (inter t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   247
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   248
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   249
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   250
    by(fastforce simp: inter.simps[of t1 t2] set_tree_inter split
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   251
        intro!: bst_join bst_join2 split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   252
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   253
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   254
lemma inv_inter: "\<lbrakk> inv t1; inv t2 \<rbrakk> \<Longrightarrow> inv (inter t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   255
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   256
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   257
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   258
    by(auto simp: inter.simps[of t1 t2] inv_join inv_join2 split_inv
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   259
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   260
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   261
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   262
subsection "\<open>diff\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   263
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   264
fun diff :: "('a*'b)tree \<Rightarrow> ('a*'b)tree \<Rightarrow> ('a*'b)tree" where
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   265
"diff t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   266
  (if t1 = Leaf then Leaf else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   267
   if t2 = Leaf then t1 else
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   268
   case t2 of Node l2 (a, _) r2 \<Rightarrow>
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   269
   let (l1,_,r1) = split a t1;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   270
       l' = diff l1 l2; r' = diff r1 r2
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   271
   in join2 l' r')"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   272
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   273
declare diff.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   274
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   275
lemma set_tree_diff:
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   276
  "\<lbrakk> bst t1; bst t2 \<rbrakk> \<Longrightarrow> set_tree (diff t1 t2) = set_tree t1 - set_tree t2"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   277
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   278
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   279
  show ?case
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   280
  proof (cases t2 rule: tree2_cases)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   281
    case Leaf thus ?thesis by (simp add: diff.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   282
  next
68969
nipkow
parents: 68484
diff changeset
   283
    case [simp]: (Node l2 a _ r2)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   284
    show ?thesis
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   285
    proof (cases "t1 = Leaf")
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   286
      case True thus ?thesis by (simp add: diff.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   287
    next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   288
      case False
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   289
      let ?L2 = "set_tree l2" let ?R2 = "set_tree r2"
79968
f1c29e366c09 tuned parameter order
nipkow
parents: 75714
diff changeset
   290
      obtain l1 b r1 where sp: "split a t1 = (l1,b,r1)" using prod_cases3 by blast
72883
nipkow
parents: 72269
diff changeset
   291
      let ?L1 = "set_tree l1" let ?R1 = "set_tree r1" let ?A = "if b then {a} else {}"
72269
nipkow
parents: 71846
diff changeset
   292
      have t1: "set_tree t1 = ?L1 \<union> ?R1 \<union> ?A" and
68969
nipkow
parents: 68484
diff changeset
   293
           **: "a \<notin> ?L1 \<union> ?R1" "?L1 \<inter> ?R2 = {}" "?L2 \<inter> ?R1 = {}"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   294
        using split[OF sp] \<open>bst t1\<close> \<open>bst t2\<close> by (force, force, force, force)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   295
      have IHl: "set_tree (diff l1 l2) = set_tree l1 - set_tree l2"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   296
        using "1.IH"(1)[OF False _ _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   297
      have IHr: "set_tree (diff r1 r2) = set_tree r1 - set_tree r2"
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   298
        using "1.IH"(2)[OF False _ _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
68969
nipkow
parents: 68484
diff changeset
   299
      have "set_tree t1 - set_tree t2 = (?L1 \<union> ?R1) - (?L2 \<union> ?R2  \<union> {a})"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   300
        by(simp add: t1)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   301
      also have "\<dots> = (?L1 - ?L2) \<union> (?R1 - ?R2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   302
        using ** by auto
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   303
      also have "\<dots> = set_tree (diff t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   304
      using IHl IHr sp diff.simps[of t1 t2] False by(simp)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   305
      finally show ?thesis by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   306
    qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   307
  qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   308
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   309
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   310
lemma bst_diff: "\<lbrakk> bst t1; bst t2 \<rbrakk> \<Longrightarrow> bst (diff t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   311
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   312
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   313
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   314
    by(fastforce simp: diff.simps[of t1 t2] set_tree_diff split
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   315
        intro!: bst_join bst_join2 split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   316
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   317
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   318
lemma inv_diff: "\<lbrakk> inv t1; inv t2 \<rbrakk> \<Longrightarrow> inv (diff t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   319
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   320
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   321
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   322
    by(auto simp: diff.simps[of t1 t2] inv_join inv_join2 split_inv
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   323
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   324
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   325
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68969
diff changeset
   326
text \<open>Locale \<^locale>\<open>Set2_Join\<close> implements locale \<^locale>\<open>Set2\<close>:\<close>
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   327
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   328
sublocale Set2
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   329
where empty = Leaf and insert = insert and delete = delete and isin = isin
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   330
and union = union and inter = inter and diff = diff
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   331
and set = set_tree and invar = "\<lambda>t. inv t \<and> bst t"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   332
proof (standard, goal_cases)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   333
  case 1 show ?case by (simp)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   334
next
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 67966
diff changeset
   335
  case 2 thus ?case by(simp add: isin_set_tree)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   336
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   337
  case 3 thus ?case by (simp add: set_tree_insert)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   338
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   339
  case 4 thus ?case by (simp add: set_tree_delete)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   340
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   341
  case 5 thus ?case by (simp add: inv_Leaf)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   342
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   343
  case 6 thus ?case by (simp add: bst_insert inv_insert)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   344
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   345
  case 7 thus ?case by (simp add: bst_delete inv_delete)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   346
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   347
  case 8 thus ?case by(simp add: set_tree_union)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   348
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   349
  case 9 thus ?case by(simp add: set_tree_inter)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   350
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   351
  case 10 thus ?case by(simp add: set_tree_diff)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   352
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   353
  case 11 thus ?case by (simp add: bst_union inv_union)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   354
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   355
  case 12 thus ?case by (simp add: bst_inter inv_inter)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   356
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   357
  case 13 thus ?case by (simp add: bst_diff inv_diff)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   358
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   359
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   360
end
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   361
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
   362
interpretation unbal: Set2_Join
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   363
where join = "\<lambda>l x r. Node l (x, ()) r" and inv = "\<lambda>t. True"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   364
proof (standard, goal_cases)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   365
  case 1 show ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   366
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   367
  case 2 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   368
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   369
  case 3 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   370
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   371
  case 4 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   372
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   373
  case 5 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   374
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   375
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   376
end