author | nipkow |
Mon, 14 Aug 2017 22:06:26 +0200 | |
changeset 66419 | 8194ed7cf2cb |
child 66425 | 8756322dc5de |
permissions | -rw-r--r-- |
66419
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
1 |
(* Author: Tobias Nipkow, Peter Lammich *) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
2 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
3 |
section \<open>Priority Queue Interface\<close> |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
4 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
5 |
theory Priority_Queue |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
6 |
imports "~~/src/HOL/Library/Multiset" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
7 |
begin |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
8 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
9 |
(* FIXME abbreviation? mv *) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
10 |
definition Min_mset :: "'a::linorder multiset \<Rightarrow> 'a" where |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
11 |
"Min_mset = Min o set_mset" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
12 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
13 |
(* FIXME intros needed? *) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
14 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
15 |
lemma Min_mset_contained[simp, intro]: "m\<noteq>{#} \<Longrightarrow> Min_mset m \<in># m" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
16 |
by (simp add: Min_mset_def) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
17 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
18 |
lemma Min_mset_min[simp, intro]: "x\<in># m \<Longrightarrow> Min_mset m \<le> x" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
19 |
by (simp add: Min_mset_def) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
20 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
21 |
lemma Min_mset_alt: "m\<noteq>{#} \<Longrightarrow> (x=Min_mset m) \<longleftrightarrow> (x\<in>#m \<and> (\<forall>y\<in>#m. x\<le>y))" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
22 |
by (simp add: antisym) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
23 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
24 |
(* FIXME a bit special *) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
25 |
lemma eq_min_msetI[intro?]: |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
26 |
"m\<noteq>{#} \<Longrightarrow> (x\<in>#m \<and> (\<forall>y\<in>#m. x\<le>y)) \<Longrightarrow> x=Min_mset m" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
27 |
using Min_mset_alt by blast |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
28 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
29 |
lemma Min_mset_singleton[simp]: "Min_mset {#x#} = x" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
30 |
by (simp add: Min_mset_def) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
31 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
32 |
lemma Min_mset_insert[simp]: |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
33 |
"m\<noteq>{#} \<Longrightarrow> Min_mset (add_mset x m) = min x (Min_mset m)" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
34 |
by (simp add: Min_mset_def) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
35 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
36 |
text \<open>Priority queue interface:\<close> |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
37 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
38 |
locale Priority_Queue = |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
39 |
fixes empty :: "'q" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
40 |
and is_empty :: "'q \<Rightarrow> bool" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
41 |
and insert :: "'a::linorder \<Rightarrow> 'q \<Rightarrow> 'q" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
42 |
and get_min :: "'q \<Rightarrow> 'a" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
43 |
and del_min :: "'q \<Rightarrow> 'q" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
44 |
and invar :: "'q \<Rightarrow> bool" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
45 |
and mset :: "'q \<Rightarrow> 'a multiset" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
46 |
assumes mset_empty: "mset empty = {#}" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
47 |
and is_empty: "invar q \<Longrightarrow> is_empty q = (mset q = {#})" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
48 |
and mset_insert: "invar q \<Longrightarrow> mset (insert x q) = mset q + {#x#}" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
49 |
and mset_del_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
50 |
mset (del_min q) = mset q - {# get_min q #}" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
51 |
and mset_get_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> get_min q = Min_mset (mset q)" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
52 |
and invar_empty: "invar empty" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
53 |
and invar_insert: "invar q \<Longrightarrow> invar (insert x q)" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
54 |
and invar_del_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> invar (del_min q)" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
55 |
begin |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
56 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
57 |
(* FIXME why? *) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
58 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
59 |
lemma get_min_alt: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
60 |
get_min q \<in># mset q \<and> (\<forall>x\<in>#mset q. get_min q \<le> x)" |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
61 |
by (simp add: mset_get_min) |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
62 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
63 |
lemmas invar_simps[simp] = invar_empty invar_insert invar_del_min |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
64 |
lemmas mset_simps[simp] = mset_empty is_empty mset_insert mset_del_min mset_get_min |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
65 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
66 |
end |
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
67 |
|
8194ed7cf2cb
separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff
changeset
|
68 |
end |