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.