# HG changeset patch # User nipkow # Date 1523173593 -7200 # Node ID 08cc5ab18c84ee4726e67eb8293b445687389514 # Parent 9541f2c5ce8daa888c5eada4624b877de33d26d9 better name; added binary operations diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/AVL_Set.thy --- a/src/HOL/Data_Structures/AVL_Set.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/AVL_Set.thy Sun Apr 08 09:46:33 2018 +0200 @@ -7,8 +7,8 @@ theory AVL_Set imports - Cmp - Isin2 + Cmp + Isin2 "HOL-Number_Theory.Fib" begin diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Brother12_Set.thy --- a/src/HOL/Data_Structures/Brother12_Set.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/Brother12_Set.thy Sun Apr 08 09:46:33 2018 +0200 @@ -5,7 +5,7 @@ theory Brother12_Set imports Cmp - Set_by_Ordered + Set_Interfaces "HOL-Number_Theory.Fib" begin diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Isin2.thy --- a/src/HOL/Data_Structures/Isin2.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/Isin2.thy Sun Apr 08 09:46:33 2018 +0200 @@ -6,7 +6,7 @@ imports Tree2 Cmp - Set_by_Ordered + Set_Interfaces begin fun isin :: "('a::linorder,'b) tree \ 'a \ bool" where diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Set_Interfaces.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Data_Structures/Set_Interfaces.thy Sun Apr 08 09:46:33 2018 +0200 @@ -0,0 +1,86 @@ +(* Author: Tobias Nipkow *) + +section \Interfaces for Set ADT\ + +theory Set_Interfaces +imports List_Ins_Del +begin + +text \The basic set interface with traditional specification (based on \set\ and \bst\):\ + +locale Set = +fixes empty :: "'s" +fixes insert :: "'a \ 's \ 's" +fixes delete :: "'a \ 's \ 's" +fixes isin :: "'s \ 'a \ bool" +fixes set :: "'s \ 'a set" +fixes invar :: "'s \ bool" +assumes set_empty: "set empty = {}" +assumes set_isin: "invar s \ isin s x = (x \ set s)" +assumes set_insert: "invar s \ set(insert x s) = Set.insert x (set s)" +assumes set_delete: "invar s \ set(delete x s) = set s - {x}" +assumes invar_empty: "invar empty" +assumes invar_insert: "invar s \ invar(insert x s)" +assumes invar_delete: "invar s \ invar(delete x s)" + + +text \The basic set interface with \inorder\-based specification:\ + +locale Set_by_Ordered = +fixes empty :: "'t" +fixes insert :: "'a::linorder \ 't \ 't" +fixes delete :: "'a \ 't \ 't" +fixes isin :: "'t \ 'a \ bool" +fixes inorder :: "'t \ 'a list" +fixes inv :: "'t \ bool" +assumes empty: "inorder empty = []" +assumes isin: "inv t \ sorted(inorder t) \ + isin t x = (x \ set (inorder t))" +assumes insert: "inv t \ sorted(inorder t) \ + inorder(insert x t) = ins_list x (inorder t)" +assumes delete: "inv t \ sorted(inorder t) \ + inorder(delete x t) = del_list x (inorder t)" +assumes inv_empty: "inv empty" +assumes inv_insert: "inv t \ sorted(inorder t) \ inv(insert x t)" +assumes inv_delete: "inv t \ sorted(inorder t) \ inv(delete x t)" +begin + +text \It implements the traditional specification:\ + +sublocale Set + empty insert delete isin "set o inorder" "\t. inv t \ sorted(inorder t)" +proof(standard, goal_cases) + case 1 show ?case by (auto simp: empty) +next + case 2 thus ?case by(simp add: isin) +next + case 3 thus ?case by(simp add: insert set_ins_list) +next + case (4 s x) thus ?case + using delete[OF 4, of x] by (auto simp: distinct_if_sorted set_del_list_eq) +next + case 5 thus ?case by(simp add: empty inv_empty) +next + case 6 thus ?case by(simp add: insert inv_insert sorted_ins_list) +next + case 7 thus ?case by (auto simp: delete inv_delete sorted_del_list) +qed + +end + + +text \Set2 = Set with binary operations:\ + +locale Set2 = Set + where insert = insert for insert :: "'a \ 's \ 's" (*for typing purposes only*) + +fixes union :: "'s \ 's \ 's" +fixes inter :: "'s \ 's \ 's" +fixes diff :: "'s \ 's \ 's" +assumes set_union: "\ invar s1; invar s2 \ \ set(union s1 s2) = set s1 \ set s2" +assumes set_inter: "\ invar s1; invar s2 \ \ set(inter s1 s2) = set s1 \ set s2" +assumes set_diff: "\ invar s1; invar s2 \ \ set(diff s1 s2) = set s1 - set s2" +assumes invar_union: "\ invar s1; invar s2 \ \ invar(union s1 s2)" +assumes invar_inter: "\ invar s1; invar s2 \ \ invar(inter s1 s2)" +assumes invar_diff: "\ invar s1; invar s2 \ \ invar(diff s1 s2)" + +end diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Set_by_Ordered.thy --- a/src/HOL/Data_Structures/Set_by_Ordered.thy Sat Apr 07 22:09:57 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -(* Author: Tobias Nipkow *) - -section \Implementing Ordered Sets\ - -theory Set_by_Ordered -imports List_Ins_Del -begin - -locale Set = -fixes empty :: "'s" -fixes insert :: "'a \ 's \ 's" -fixes delete :: "'a \ 's \ 's" -fixes isin :: "'s \ 'a \ bool" -fixes set :: "'s \ 'a set" -fixes invar :: "'s \ bool" -assumes set_empty: "set empty = {}" -assumes set_isin: "invar s \ isin s x = (x \ set s)" -assumes set_insert: "invar s \ set(insert x s) = Set.insert x (set s)" -assumes set_delete: "invar s \ set(delete x s) = set s - {x}" -assumes invar_empty: "invar empty" -assumes invar_insert: "invar s \ invar(insert x s)" -assumes invar_delete: "invar s \ invar(delete x s)" - -locale Set_by_Ordered = -fixes empty :: "'t" -fixes insert :: "'a::linorder \ 't \ 't" -fixes delete :: "'a \ 't \ 't" -fixes isin :: "'t \ 'a \ bool" -fixes inorder :: "'t \ 'a list" -fixes inv :: "'t \ bool" -assumes empty: "inorder empty = []" -assumes isin: "inv t \ sorted(inorder t) \ - isin t x = (x \ set (inorder t))" -assumes insert: "inv t \ sorted(inorder t) \ - inorder(insert x t) = ins_list x (inorder t)" -assumes delete: "inv t \ sorted(inorder t) \ - inorder(delete x t) = del_list x (inorder t)" -assumes inv_empty: "inv empty" -assumes inv_insert: "inv t \ sorted(inorder t) \ inv(insert x t)" -assumes inv_delete: "inv t \ sorted(inorder t) \ inv(delete x t)" -begin - -sublocale Set - empty insert delete isin "set o inorder" "\t. inv t \ sorted(inorder t)" -proof(standard, goal_cases) - case 1 show ?case by (auto simp: empty) -next - case 2 thus ?case by(simp add: isin) -next - case 3 thus ?case by(simp add: insert set_ins_list) -next - case (4 s x) thus ?case - using delete[OF 4, of x] by (auto simp: distinct_if_sorted set_del_list_eq) -next - case 5 thus ?case by(simp add: empty inv_empty) -next - case 6 thus ?case by(simp add: insert inv_insert sorted_ins_list) -next - case 7 thus ?case by (auto simp: delete inv_delete sorted_del_list) -qed - -end - -end diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Tree234_Set.thy --- a/src/HOL/Data_Structures/Tree234_Set.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/Tree234_Set.thy Sun Apr 08 09:46:33 2018 +0200 @@ -6,7 +6,7 @@ imports Tree234 Cmp - "../Data_Structures/Set_by_Ordered" + "Set_Interfaces" begin subsection \Set operations on 2-3-4 trees\ diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Tree23_Set.thy --- a/src/HOL/Data_Structures/Tree23_Set.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/Tree23_Set.thy Sun Apr 08 09:46:33 2018 +0200 @@ -6,7 +6,7 @@ imports Tree23 Cmp - Set_by_Ordered + Set_Interfaces begin fun isin :: "'a::linorder tree23 \ 'a \ bool" where diff -r 9541f2c5ce8d -r 08cc5ab18c84 src/HOL/Data_Structures/Tree_Set.thy --- a/src/HOL/Data_Structures/Tree_Set.thy Sat Apr 07 22:09:57 2018 +0200 +++ b/src/HOL/Data_Structures/Tree_Set.thy Sun Apr 08 09:46:33 2018 +0200 @@ -6,7 +6,7 @@ imports "HOL-Library.Tree" Cmp - Set_by_Ordered + Set_Interfaces begin fun isin :: "'a::linorder tree \ 'a \ bool" where