| author | wenzelm | 
| Tue, 25 Mar 2025 15:50:41 +0100 | |
| changeset 82403 | 6e80327eb30a | 
| parent 80398 | 4953d52e04d2 | 
| permissions | -rw-r--r-- | 
| 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 | 3 | section "Join-Based Implementation of Sets" | 
| 67966 
f13796496e82
Added binary set operations with join-based implementation
 nipkow parents: diff
changeset | 4 | |
| 68261 | 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 | 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 | 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 | 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 | 22 | locale Set2_Join = | 
| 70755 
3fb16bed5d6c
replaced new type ('a,'b) tree by old type ('a*'b) tree.
 nipkow parents: 
70582diff
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: 
70582diff
changeset | 24 | fixes inv :: "('a*'b) tree \<Rightarrow> bool"
 | 
| 68261 | 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: 
70582diff
changeset | 26 | assumes bst_join: "bst (Node l (a, b) r) \<Longrightarrow> bst (join l a r)" | 
| 68261 | 27 | assumes inv_Leaf: "inv \<langle>\<rangle>" | 
| 68969 | 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: 
70582diff
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 | 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: 
70582diff
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: 
70582diff
changeset | 37 | "split_min (Node l (a, _) r) = | 
| 68969 | 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 | 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: 
70582diff
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 | 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: 
70582diff
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 | 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: 
70582diff
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: 
79968diff
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: 
79968diff
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: 
79968diff
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: 
79968diff
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: 
79968diff
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 | 83 | fun split :: "'a \<Rightarrow> ('a*'b)tree \<Rightarrow> ('a*'b)tree \<times> bool \<times> ('a*'b)tree" where
 | 
| 84 | "split x Leaf = (Leaf, False, Leaf)" | | |
| 85 | "split x (Node l (a, _) r) = | |
| 70572 | 86 | (case cmp x a of | 
| 79968 | 87 | LT \<Rightarrow> let (l1,b,l2) = split x l in (l1, b, join l2 a r) | | 
| 88 | GT \<Rightarrow> let (r1,b,r2) = split x r in (join l a r1, b, r2) | | |
| 70572 | 89 | EQ \<Rightarrow> (l, True, r))" | 
| 67966 
f13796496e82
Added binary set operations with join-based implementation
 nipkow parents: diff
changeset | 90 | |
| 79968 | 91 | lemma split: "split x t = (l,b,r) \<Longrightarrow> bst t \<Longrightarrow> | 
| 68969 | 92 |   set_tree l = {a \<in> set_tree t. a < x} \<and> set_tree r = {a \<in> set_tree t. x < a}
 | 
| 72883 | 93 | \<and> (b = (x \<in> set_tree t)) \<and> bst l \<and> bst r" | 
| 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: 
72883diff
changeset | 97 | case (Node y a b z l c r) | 
| 79968 | 98 | consider (LT) l1 xin l2 where "(l1,xin,l2) = split x y" | 
| 99 | and "split x \<langle>y, (a, b), z\<rangle> = (l1, xin, join l2 a z)" and "cmp x a = LT" | |
| 100 | | (GT) r1 xin r2 where "(r1,xin,r2) = split x z" | |
| 101 | and "split x \<langle>y, (a, b), z\<rangle> = (join y a r1, xin, r2)" and "cmp x a = GT" | |
| 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: 
72883diff
changeset | 103 | by (force split: cmp_val.splits prod.splits if_splits) | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 104 | |
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 105 | thus ?case | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 106 | proof cases | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 107 | case (LT l1 xin l2) | 
| 79968 | 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: 
72883diff
changeset | 109 | show ?thesis by (force intro!: bst_join) | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 110 | next | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 111 | case (GT r1 xin r2) | 
| 79968 | 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: 
72883diff
changeset | 113 | show ?thesis by (force intro!: bst_join) | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 114 | next | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 115 | case EQ | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
changeset | 116 | with Node.prems show ?thesis by auto | 
| 
a3cc9fa1295d
new automatic order prover: stateless, complete, verified
 nipkow parents: 
72883diff
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 | 120 | lemma split_inv: "split x t = (l,b,r) \<Longrightarrow> inv t \<Longrightarrow> inv l \<and> inv r" | 
| 72883 | 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: 
70582diff
changeset | 133 | definition insert :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
 | 
| 79968 | 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 | 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: 
70582diff
changeset | 148 | definition delete :: "'a \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where
 | 
| 79968 | 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 | 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: 
70582diff
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: 
70582diff
changeset | 167 | case t1 of Node l1 (a, _) r1 \<Rightarrow> | 
| 79968 | 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 | 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: 
70582diff
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: 
70582diff
changeset | 203 | case t1 of Node l1 (a, _) r1 \<Rightarrow> | 
| 79968 | 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 | 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: 
70582diff
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 | 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 | 225 | have *: "a \<notin> ?L1 \<union> ?R1" using \<open>bst t1\<close> by (fastforce) | 
| 79968 | 226 | obtain l2 b r2 where sp: "split a t2 = (l2,b,r2)" using prod_cases3 by blast | 
| 72883 | 227 |       let ?L2 = "set_tree l2" let ?R2 = "set_tree r2" let ?A = "if b then {a} else {}"
 | 
| 72269 | 228 | have t2: "set_tree t2 = ?L2 \<union> ?R2 \<union> ?A" and | 
| 68969 | 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: 
70582diff
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: 
70582diff
changeset | 234 | using "1.IH"(2)[OF _ False _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp | 
| 72269 | 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 | 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 | 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 | 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: 
70582diff
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: 
70582diff
changeset | 268 | case t2 of Node l2 (a, _) r2 \<Rightarrow> | 
| 79968 | 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: 
70582diff
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 | 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 | 290 | obtain l1 b r1 where sp: "split a t1 = (l1,b,r1)" using prod_cases3 by blast | 
| 72883 | 291 |       let ?L1 = "set_tree l1" let ?R1 = "set_tree r1" let ?A = "if b then {a} else {}"
 | 
| 72269 | 292 | have t1: "set_tree t1 = ?L1 \<union> ?R1 \<union> ?A" and | 
| 68969 | 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: 
70582diff
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: 
70582diff
changeset | 298 | using "1.IH"(2)[OF False _ _ _ sp[symmetric]] "1.prems"(1,2) split[OF sp] by simp | 
| 68969 | 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 | 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 | 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 | 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 | 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 | 362 | interpretation unbal: Set2_Join | 
| 70755 
3fb16bed5d6c
replaced new type ('a,'b) tree by old type ('a*'b) tree.
 nipkow parents: 
70582diff
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 |