definition is_empty :: "('a::linorder, 'b) rbt \ bool"where
[code]: "is_empty t = (case impl_of t of RBT_Impl.Empty \ True | _ \ False)"
(* TODO: Is deleting more efficient than re-building the tree?
(Probably more difficult to prove though *) definition filter :: "('a \ 'b \ bool) \ ('a::linorder, 'b) rbt \ ('a, 'b) rbt"where
[code]: "filter P t = fold (\k v t. if P k v then insert k v t else t) t empty"
subsection‹Abstract lookup properties›
lemma lookup_RBT: "is_rbt t \ lookup (RBT t) = rbt_lookup t" by (simp add: lookup_def RBT_inverse)
lemma lookup_impl_of: "rbt_lookup (impl_of t) = lookup t" by transfer (rule refl)
lemma entries_impl_of: "RBT_Impl.entries (impl_of t) = entries t" by transfer (rule refl)
lemma keys_impl_of: "RBT_Impl.keys (impl_of t) = keys t" by transfer (rule refl)
lemma lookup_keys: "dom (lookup t) = set (keys t)" by transfer (simp add: rbt_lookup_keys)
lemma non_empty_keys: "t \ empty \ keys t \ []" by transfer (simp add: non_empty_rbt_keys)
lemma keys_def_alt: "keys t = List.map fst (entries t)" by transfer (simp add: RBT_Impl.keys_def)
context begin
private lemma lookup_filter_aux: assumes"distinct (List.map fst xs)" shows"lookup (List.fold (\(k, v) t. if P k v then insert k v t else t) xs t) k =
(case map_of xs k of
None ==> lookup t k
| Some v ==>if P k v then Some v else lookup t k)" using assms by (induction xs arbitrary: t) (force split: option.splits)+
lemma lookup_filter: "lookup (filter P t) k =
(case lookup t k of None ==> None | Some v ==>if P k v then Some v else None)" unfolding filter_def using lookup_filter_aux[of "entries t" P empty k] by (simp add: fold_fold distinct_entries split: option.splits)
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.