src/HOL/Data_Structures/Priority_Queue.thy
author nipkow
Mon, 14 Aug 2017 22:06:26 +0200
changeset 66419 8194ed7cf2cb
child 66425 8756322dc5de
permissions -rw-r--r--
separate file for priority queue interface; extended Leftist_Heap.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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