src/HOL/Data_Structures/Priority_Queue.thy
author wenzelm
Fri, 18 Aug 2017 20:47:47 +0200
changeset 66453 cc19f7ca2ed6
parent 66425 8756322dc5de
child 66565 ff561d9cb661
permissions -rw-r--r--
session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
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
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66425
diff changeset
     6
imports "HOL-Library.Multiset"
66419
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
text \<open>Priority queue interface:\<close>
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    10
    
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    11
locale Priority_Queue =
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    12
fixes empty :: "'q"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    13
and is_empty :: "'q \<Rightarrow> bool"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    14
and insert :: "'a::linorder \<Rightarrow> 'q \<Rightarrow> 'q"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    15
and get_min :: "'q \<Rightarrow> 'a"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    16
and del_min :: "'q \<Rightarrow> 'q"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    17
and invar :: "'q \<Rightarrow> bool"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    18
and mset :: "'q \<Rightarrow> 'a multiset"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    19
assumes mset_empty: "mset empty = {#}"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    20
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
    21
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
    22
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
    23
    mset (del_min q) = mset q - {# get_min q #}"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    24
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
    25
and invar_empty: "invar empty"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    26
and invar_insert: "invar q \<Longrightarrow> invar (insert x q)"
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    27
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
    28
begin
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    29
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    30
(* FIXME why? *)
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 get_min_alt: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> 
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    33
  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
    34
  by (simp add: mset_get_min)
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
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
    37
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
    38
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    39
end
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    40
8194ed7cf2cb separate file for priority queue interface; extended Leftist_Heap.
nipkow
parents:
diff changeset
    41
end