equal
deleted
inserted
replaced
23 mset (del_min q) = mset q - {# get_min q #}" |
23 mset (del_min q) = mset q - {# get_min q #}" |
24 and mset_get_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> get_min q = Min_mset (mset q)" |
24 and mset_get_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> get_min q = Min_mset (mset q)" |
25 and invar_empty: "invar empty" |
25 and invar_empty: "invar empty" |
26 and invar_insert: "invar q \<Longrightarrow> invar (insert x q)" |
26 and invar_insert: "invar q \<Longrightarrow> invar (insert x q)" |
27 and invar_del_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> invar (del_min q)" |
27 and invar_del_min: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> invar (del_min q)" |
28 begin |
|
29 |
28 |
30 (* FIXME why? *) |
29 text \<open>Extend locale with \<open>merge\<close>. Need to enforce that \<open>'q\<close> is the same in both locales.\<close> |
31 |
30 |
32 lemma get_min_alt: "invar q \<Longrightarrow> mset q \<noteq> {#} \<Longrightarrow> |
31 locale Priority_Queue_Merge = Priority_Queue where empty = empty for empty :: 'q + |
33 get_min q \<in># mset q \<and> (\<forall>x\<in>#mset q. get_min q \<le> x)" |
32 fixes merge :: "'q \<Rightarrow> 'q \<Rightarrow> 'q" |
34 by (simp add: mset_get_min) |
33 assumes mset_merge: "\<lbrakk> invar q1; invar q2 \<rbrakk> \<Longrightarrow> mset (merge q1 q2) = mset q1 + mset q2" |
35 |
34 and invar_merge: "\<lbrakk> invar q1; invar q2 \<rbrakk> \<Longrightarrow> invar (merge q1 q2)" |
36 lemmas invar_simps[simp] = invar_empty invar_insert invar_del_min |
|
37 lemmas mset_simps[simp] = mset_empty is_empty mset_insert mset_del_min mset_get_min |
|
38 |
35 |
39 end |
36 end |
40 |
|
41 end |
|