src/HOL/Data_Structures/Set2_Join.thy
author nipkow
Fri, 29 Jul 2022 08:45:51 +0200
changeset 75714 1635ee32e6d8
parent 73526 a3cc9fa1295d
child 79968 f1c29e366c09
permissions -rw-r--r--
prettified def
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
75714
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    67
fun join2 :: "('a*'b) tree \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    68
"join2 l \<langle>\<rangle> = l" |
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    69
"join2 l r = (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
    70
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    71
lemma set_join2[simp]: "set_tree (join2 l r) = set_tree l \<union> set_tree r"
75714
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    72
by(cases r)(simp_all add: split_min_set split: prod.split)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    73
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    74
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
    75
  \<Longrightarrow> bst (join2 l r)"
75714
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    76
by(cases r)(simp_all add: bst_join split_min_set split_min_bst split: prod.split)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    77
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    78
lemma inv_join2: "\<lbrakk> inv l; inv r \<rbrakk> \<Longrightarrow> inv (join2 l r)"
75714
1635ee32e6d8 prettified def
nipkow
parents: 73526
diff changeset
    79
by(cases r)(simp_all add: inv_join split_min_set split_min_inv split: prod.split)
67966
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
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    82
subsection "\<open>split\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    83
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    84
fun split :: "('a*'b)tree \<Rightarrow> 'a \<Rightarrow> ('a*'b)tree \<times> bool \<times> ('a*'b)tree" where
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    85
"split Leaf k = (Leaf, False, Leaf)" |
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
    86
"split (Node l (a, _) r) x =
70572
nipkow
parents: 69597
diff changeset
    87
  (case cmp x a of
nipkow
parents: 69597
diff changeset
    88
     LT \<Rightarrow> let (l1,b,l2) = split l x in (l1, b, join l2 a r) |
nipkow
parents: 69597
diff changeset
    89
     GT \<Rightarrow> let (r1,b,r2) = split r x in (join l a r1, b, r2) |
nipkow
parents: 69597
diff changeset
    90
     EQ \<Rightarrow> (l, True, r))"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    91
72883
nipkow
parents: 72269
diff changeset
    92
lemma split: "split t x = (l,b,r) \<Longrightarrow> bst t \<Longrightarrow>
68969
nipkow
parents: 68484
diff changeset
    93
  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
    94
  \<and> (b = (x \<in> set_tree t)) \<and> bst l \<and> bst r"
nipkow
parents: 72269
diff changeset
    95
proof(induction t arbitrary: l b r rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    96
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
    97
next
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
    98
  case (Node y a b z l c r)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
    99
  consider (LT) l1 xin l2 where "(l1,xin,l2) = split y x" 
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   100
    and "split \<langle>y, (a, b), z\<rangle> x = (l1, xin, join l2 a z)" and "cmp x a = LT"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   101
  | (GT) r1 xin r2 where "(r1,xin,r2) = split z x" 
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   102
    and "split \<langle>y, (a, b), z\<rangle> x = (join y a r1, xin, r2)" and "cmp x a = GT"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   103
  | (EQ) "split \<langle>y, (a, b), z\<rangle> x = (y, True, z)" and "cmp x a = EQ"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   104
    by (force split: cmp_val.splits prod.splits if_splits)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   105
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   106
  thus ?case 
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   107
  proof cases
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   108
    case (LT l1 xin l2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   109
    with Node.IH(1)[OF \<open>(l1,xin,l2) = split y x\<close>[symmetric]] Node.prems
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   110
    show ?thesis by (force intro!: bst_join)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   111
  next
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   112
    case (GT r1 xin r2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   113
    with Node.IH(2)[OF \<open>(r1,xin,r2) = split z x\<close>[symmetric]] Node.prems
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   114
    show ?thesis by (force intro!: bst_join)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   115
  next
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   116
    case EQ
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   117
    with Node.prems show ?thesis by auto
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 72883
diff changeset
   118
  qed
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   119
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   120
72883
nipkow
parents: 72269
diff changeset
   121
lemma split_inv: "split t x = (l,b,r) \<Longrightarrow> inv t \<Longrightarrow> inv l \<and> inv r"
nipkow
parents: 72269
diff changeset
   122
proof(induction t arbitrary: l b r rule: tree2_induct)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   123
  case Leaf thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   124
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   125
  case Node
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   126
  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
   127
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   128
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   129
declare split.simps[simp del]
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
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   132
subsection "\<open>insert\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   133
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   134
definition insert :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
68969
nipkow
parents: 68484
diff changeset
   135
"insert x t = (let (l,_,r) = split t x in join l x r)"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   136
70582
nipkow
parents: 70572
diff changeset
   137
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
   138
by(auto simp add: insert_def split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   139
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   140
lemma bst_insert: "bst t \<Longrightarrow> bst (insert x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   141
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
   142
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   143
lemma inv_insert: "inv t \<Longrightarrow> inv (insert x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   144
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
   145
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   146
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   147
subsection "\<open>delete\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   148
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   149
definition delete :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
68969
nipkow
parents: 68484
diff changeset
   150
"delete x t = (let (l,_,r) = split t x in join2 l r)"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   151
68969
nipkow
parents: 68484
diff changeset
   152
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
   153
by(auto simp: delete_def split split: prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   154
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   155
lemma bst_delete: "bst t \<Longrightarrow> bst (delete x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   156
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
   157
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   158
lemma inv_delete: "inv t \<Longrightarrow> inv (delete x t)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   159
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
   160
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   161
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   162
subsection "\<open>union\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   163
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   164
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
   165
"union t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   166
  (if t1 = Leaf then t2 else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   167
   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
   168
   case t1 of Node l1 (a, _) r1 \<Rightarrow>
68969
nipkow
parents: 68484
diff changeset
   169
   let (l2,_ ,r2) = split t2 a;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   170
       l' = union l1 l2; r' = union r1 r2
68969
nipkow
parents: 68484
diff changeset
   171
   in join l' a r')"
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   172
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   173
declare union.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   174
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   175
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
   176
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   177
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   178
  then show ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   179
    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
   180
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   181
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   182
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
   183
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   184
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   185
  thus ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   186
    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
   187
        split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   188
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   189
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   190
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
   191
proof(induction t1 t2 rule: union.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   192
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   193
  thus ?case
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   194
    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
   195
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   196
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   197
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   198
subsection "\<open>inter\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   199
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   200
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
   201
"inter t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   202
  (if t1 = Leaf then Leaf else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   203
   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
   204
   case t1 of Node l1 (a, _) r1 \<Rightarrow>
72883
nipkow
parents: 72269
diff changeset
   205
   let (l2,b,r2) = split t2 a;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   206
       l' = inter l1 l2; r' = inter r1 r2
72883
nipkow
parents: 72269
diff changeset
   207
   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
   208
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   209
declare inter.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   210
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   211
lemma set_tree_inter:
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   212
  "\<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
   213
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   214
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   215
  show ?case
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   216
  proof (cases t1 rule: tree2_cases)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   217
    case Leaf thus ?thesis by (simp add: inter.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   218
  next
68969
nipkow
parents: 68484
diff changeset
   219
    case [simp]: (Node l1 a _ r1)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   220
    show ?thesis
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   221
    proof (cases "t2 = Leaf")
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   222
      case True thus ?thesis by (simp add: inter.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   223
    next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   224
      case False
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   225
      let ?L1 = "set_tree l1" let ?R1 = "set_tree r1"
68969
nipkow
parents: 68484
diff changeset
   226
      have *: "a \<notin> ?L1 \<union> ?R1" using \<open>bst t1\<close> by (fastforce)
72883
nipkow
parents: 72269
diff changeset
   227
      obtain l2 b r2 where sp: "split t2 a = (l2,b,r2)" using prod_cases3 by blast
nipkow
parents: 72269
diff changeset
   228
      let ?L2 = "set_tree l2" let ?R2 = "set_tree r2" let ?A = "if b then {a} else {}"
72269
nipkow
parents: 71846
diff changeset
   229
      have t2: "set_tree t2 = ?L2 \<union> ?R2 \<union> ?A" and
68969
nipkow
parents: 68484
diff changeset
   230
           **: "?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
   231
        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
   232
      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
   233
        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
   234
      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
   235
        using "1.IH"(2)[OF _ False _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
72269
nipkow
parents: 71846
diff changeset
   236
      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
   237
        by(simp add: t2)
72269
nipkow
parents: 71846
diff changeset
   238
      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
   239
        using * ** by auto
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   240
      also have "\<dots> = set_tree (inter t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   241
      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
   242
      finally show ?thesis by simp
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
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   246
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   247
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
   248
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   249
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   250
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   251
    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
   252
        intro!: bst_join bst_join2 split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   253
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   254
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   255
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
   256
proof(induction t1 t2 rule: inter.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   257
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   258
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   259
    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
   260
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   261
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   262
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   263
subsection "\<open>diff\<close>"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   264
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   265
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
   266
"diff t1 t2 =
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   267
  (if t1 = Leaf then Leaf else
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   268
   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
   269
   case t2 of Node l2 (a, _) r2 \<Rightarrow>
68969
nipkow
parents: 68484
diff changeset
   270
   let (l1,_,r1) = split t1 a;
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   271
       l' = diff l1 l2; r' = diff r1 r2
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   272
   in join2 l' r')"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   273
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   274
declare diff.simps [simp del]
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   275
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   276
lemma set_tree_diff:
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   277
  "\<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
   278
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   279
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   280
  show ?case
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   281
  proof (cases t2 rule: tree2_cases)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   282
    case Leaf thus ?thesis by (simp add: diff.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   283
  next
68969
nipkow
parents: 68484
diff changeset
   284
    case [simp]: (Node l2 a _ r2)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   285
    show ?thesis
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   286
    proof (cases "t1 = Leaf")
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   287
      case True thus ?thesis by (simp add: diff.simps)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   288
    next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   289
      case False
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   290
      let ?L2 = "set_tree l2" let ?R2 = "set_tree r2"
72883
nipkow
parents: 72269
diff changeset
   291
      obtain l1 b r1 where sp: "split t1 a = (l1,b,r1)" using prod_cases3 by blast
nipkow
parents: 72269
diff changeset
   292
      let ?L1 = "set_tree l1" let ?R1 = "set_tree r1" let ?A = "if b then {a} else {}"
72269
nipkow
parents: 71846
diff changeset
   293
      have t1: "set_tree t1 = ?L1 \<union> ?R1 \<union> ?A" and
68969
nipkow
parents: 68484
diff changeset
   294
           **: "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
   295
        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
   296
      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
   297
        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
   298
      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
   299
        using "1.IH"(2)[OF False _ _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp
68969
nipkow
parents: 68484
diff changeset
   300
      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
   301
        by(simp add: t1)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   302
      also have "\<dots> = (?L1 - ?L2) \<union> (?R1 - ?R2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   303
        using ** by auto
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   304
      also have "\<dots> = set_tree (diff t1 t2)"
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   305
      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
   306
      finally show ?thesis by simp
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
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   310
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   311
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
   312
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   313
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   314
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   315
    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
   316
        intro!: bst_join bst_join2 split: tree.split prod.split)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   317
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   318
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   319
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
   320
proof(induction t1 t2 rule: diff.induct)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   321
  case (1 t1 t2)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   322
  thus ?case
71846
nipkow
parents: 70755
diff changeset
   323
    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
   324
        split!: tree.split prod.split dest: inv_Node)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   325
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   326
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68969
diff changeset
   327
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
   328
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   329
sublocale Set2
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   330
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
   331
and union = union and inter = inter and diff = diff
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   332
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
   333
proof (standard, goal_cases)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   334
  case 1 show ?case by (simp)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   335
next
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 67966
diff changeset
   336
  case 2 thus ?case by(simp add: isin_set_tree)
67966
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   337
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   338
  case 3 thus ?case by (simp add: set_tree_insert)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   339
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   340
  case 4 thus ?case by (simp add: set_tree_delete)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   341
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   342
  case 5 thus ?case by (simp add: inv_Leaf)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   343
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   344
  case 6 thus ?case by (simp add: bst_insert inv_insert)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   345
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   346
  case 7 thus ?case by (simp add: bst_delete inv_delete)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   347
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   348
  case 8 thus ?case by(simp add: set_tree_union)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   349
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   350
  case 9 thus ?case by(simp add: set_tree_inter)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   351
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   352
  case 10 thus ?case by(simp add: set_tree_diff)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   353
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   354
  case 11 thus ?case by (simp add: bst_union inv_union)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   355
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   356
  case 12 thus ?case by (simp add: bst_inter inv_inter)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   357
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   358
  case 13 thus ?case by (simp add: bst_diff inv_diff)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   359
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   360
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   361
end
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   362
68261
035c78bb0a66 reorganization, everything based on Tree2 now
nipkow
parents: 67967
diff changeset
   363
interpretation unbal: Set2_Join
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70582
diff changeset
   364
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
   365
proof (standard, goal_cases)
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   366
  case 1 show ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   367
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   368
  case 2 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   369
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   370
  case 3 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   371
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   372
  case 4 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   373
next
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   374
  case 5 thus ?case by simp
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   375
qed
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   376
f13796496e82 Added binary set operations with join-based implementation
nipkow
parents:
diff changeset
   377
end