src/HOL/Data_Structures/Priority_Queue.thy
changeset 66565 ff561d9cb661
parent 66453 cc19f7ca2ed6
child 68020 6aade817bee5
equal deleted inserted replaced
66562:ad0cefe1e9a9 66565:ff561d9cb661
    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