lemma is_empty_empty_simp [simp]: "is_empty empty" by (simp add: is_empty_empty)
lemma map_snd_alist_of: "map (the ∘ priority q) (values q) = map snd (alist_of q)" by (auto simp add: values_def priority_def)
lemma image_snd_alist_of: "the ` priority q ` set (values q) = snd ` set (alist_of q)" proof - from map_snd_alist_of [of q] have"set (map (the ∘ priority q) (values q)) = set (map snd (alist_of q))" by (simp only:) thenshow ?thesis by (simp add: image_comp) qed
lemma Min_snd_alist_of: assumes"¬ is_empty q" shows"Min (snd ` set (alist_of q)) = snd (hd (alist_of q))" proof - from assms obtain ps p where q: "map snd (alist_of q) = p # ps" by (cases "map snd (alist_of q)") auto thenhave"hd (map snd (alist_of q)) = p"by simp with assms have p: "snd (hd (alist_of q)) = p"by (auto simp add: hd_map) have"sorted (map snd (alist_of q))"by simp with q have"sorted (p # ps)"by simp thenhave"∀p'∈set ps. p' ≥ p"by (simp) thenhave"Min (set (p # ps)) = p"by (auto intro: Min_eqI) with p q have"Min (set (map snd (alist_of q))) = snd (hd (alist_of q))" by simp thenshow ?thesis by simp qed
lemma priority_fst: assumes"xp ∈ set (alist_of q)" shows"priority q (fst xp) = Some (snd xp)" using assms by (simp add: priority_def)
lemma priority_Min: assumes"¬ is_empty q" shows"priority q (min q) = Some (Min (the ` priority q ` set (values q)))" using assms by (auto simp add: min_def image_snd_alist_of Min_snd_alist_of priority_fst)
lemma priority_Min_priorities: assumes"¬ is_empty q" shows"priority q (min q) = Some (Min (set ∥q∥))" using assms by (simp add: priority_Min image_snd_alist_of priorities_def)
definition push :: "'a ==> 'b::linorder ==> ('a, 'b) pq ==> ('a, 'b) pq"where "push k p q = Abs_pq (if k ∉ set (values q) then insort_key snd (k, p) (alist_of q) else alist_of q)"
lemma Min_snd_hd: "q ≠ [] ==> sorted (map snd q) ==> Min (snd ` set q) = snd (hd q)" proof (induct q) case (Cons x xs) thenshow ?caseby (cases xs) (auto simp add: ord_class.min_def) qed simp
lemma hd_construct: assumes"¬ is_empty q" shows"hd (alist_of q) = (min q, the (priority q (min q)))" proof - from assms have"the (priority q (min q)) = snd (hd (alist_of q))" using Min_snd_hd [of "alist_of q"] by (auto simp add: priority_Min_priorities priorities_def) thenshow ?thesis by (simp add: min_def) qed
lemma not_in_first_image: "x ∉ fst ` s ==> (x, p) ∉ s" by (auto simp add: image_def)
lemma alist_of_push [simp, code abstract]: "alist_of (push k p q) = (if k ∉ set (values q) then insort_key snd (k, p) (alist_of q) else alist_of q)" using distinct_fst_alist_of [of q] by (auto simp add: distinct_map set_insort_key distinct_insort not_in_first_image
push_def values_def sorted_insort_key intro: alist_of_Abs_pq)
lemma push_values [simp]: "set |push k p q| = set |q| ∪ {k}" by (auto simp add: values_def set_insort_key)
lemma push_priorities [simp]: "k ∉ set |q| ==> set ∥push k p q∥ = set ∥q∥∪ {p}" "k ∈ set |q| ==> set ∥push k p q∥ = set ∥q∥" by (auto simp add: priorities_def set_insort_key)
lemma not_is_empty_push [simp]: "¬ is_empty (push k p q)" by (auto simp add: values_def is_empty_def)
lemma push_commute: assumes"a ≠ b"and"v ≠ w" shows"push w b (push v a q) = push v a (push w b q)" using assms by (auto intro!: alist_of_eqI insort_key_left_comm)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.