lemma fold_split_conv_map_fst: "fold (λ(x, y). f x) xs = fold f (map fst xs)" by(simp add: fold_map o_def split_def)
lemma foldr_split_conv_map_fst: "foldr (λ(x, y). f x) xs = foldr f (map fst xs)" by(simp add: foldr_map o_def split_def fun_eq_iff)
lemma set_foldr_Cons: "set (foldr (λx xs. if P x xs then x # xs else xs) as []) ⊆ set as" by(induct as) auto
lemma distinct_fst_foldr_Cons: "distinct (map f as) ==> distinct (map f (foldr (λx xs. if P x xs then x # xs else xs) as []))" proof(induct as) case (Cons a as) with set_foldr_Cons[of P as] show ?caseby auto qed simp
lemma filter_conv_foldr: "filter P xs = foldr (λx xs. if P x then x # xs else xs) xs []" by(induct xs) simp_all
lemma map_of_map_Pair_key: "map_of (map (λk. (k, f k)) xs) x = (if x ∈ set xs then Some (f x) else None)" by(induct xs) simp_all
lemma neq_Empty_conv: "t ≠ rbt.Empty ⟷ (∃c l k v r. t = Branch c l k v r)" by(cases t) simp_all
lemma is_rbt_fold_rbt_insert: "is_rbt t ==> is_rbt (fold (λk. rbt_insert k (f k)) xs t)" by(induct xs rule: rev_induct) simp_all
lemma rbt_lookup_fold_rbt_insert: "is_rbt t ==> rbt_lookup (fold (λk. rbt_insert k (f k)) xs t) = rbt_lookup t ++ map_of (map (λk. (k, f k)) xs)" by(induct xs arbitrary: t)(auto simp add: rbt_lookup_rbt_insert map_add_def fun_eq_iff map_of_map_Pair_key split: option.splits)
end
definition fold_rev :: "('a ==> 'b ==> 'c ==> 'c) ==> ('a, 'b) rbt ==> 'c ==> 'c" where"fold_rev f t = List.foldr (λ(k, v). f k v) (RBT_Impl.entries t)"
lemma fold_rev_simps [simp, code]: "fold_rev f RBT_Impl.Empty = id" "fold_rev f (Branch c l k v r) = fold_rev f l o f k v o fold_rev f r" by(simp_all add: fold_rev_def fun_eq_iff)
context linorder begin
lemma sorted_fst_foldr_Cons: "sorted (map f as) ==> sorted (map f (foldr (λx xs. if P x xs then x # xs else xs) as []))" proof(induct as) case (Cons a as) with set_foldr_Cons[of P as] show ?caseby(auto) qed simp
end
subsection‹Type and operations›
type_synonym 'a set_rbt = "('a, unit) mapping_rbt"
lemma is_rbt_impl_of [simp, intro]: fixes t :: "'a set_rbt" shows"ord.is_rbt cless (RBT_Mapping2.impl_of t)" using ID_ccompare_neq_None impl_of [of t] by auto
lemma member_RBT: "ord.is_rbt cless t ==> member (Set_RBT t) (x :: 'a) ⟷ ord.rbt_lookup cless t x = Some ()" by(auto simp add: member_def Mapping_RBT_inverse rbt_comps)
lemma member_impl_of: "ord.rbt_lookup cless (RBT_Mapping2.impl_of t) (x :: 'a) = Some () ⟷ member t x" by transfer (auto simp: rbt_comps)
lemma member_insert [simp]: "member (insert x (t :: 'a set_rbt)) = (member t)(x := True)" by transfer (simp add: fun_eq_iff linorder.rbt_lookup_rbt_insert[OF set_linorder] ID_ccompare_neq_None)
lemma member_fold_insert [simp]: "member (List.fold insert xs (t :: 'a set_rbt)) = (λx. member t x ∨ x ∈ set xs)" by(induct xs arbitrary: t) auto
lemma member_bulkload [simp]: "member (bulkload xs) (x :: 'a) ⟷ x ∈ set xs" by transfer (auto simp add: linorder.rbt_lookup_rbt_bulkload[OF set_linorder] rbt_comps map_of_map_Pair_const split: if_split_asm)
lemma member_conv_keys: "member t = (λx :: 'a. x ∈ set (keys t))" by(transfer)(simp add: ID_ccompare_neq_None linorder.rbt_lookup_keys[OF set_linorder] ord.is_rbt_rbt_sorted)
lemma is_empty_empty [simp]: "is_empty t ⟷ t = empty" by transfer (simp split: rbt.split)
lemma RBT_lookup_empty [simp]: "ord.rbt_lookup cless (t :: ('a, unit) rbt) = Map.empty ⟷ t = RBT_Impl.Empty" proof - interpret linorder "cless_eq :: 'a ==> 'a ==> bool" cless by(rule set_linorder) show ?thesis by(cases t)(auto simp add: fun_eq_iff) qed
lemma member_empty_empty [simp]: "member t = (λ_. False) ⟷ (t :: 'a set_rbt) = empty" by transfer(simp add: ID_ccompare_neq_None fun_eq_iff RBT_lookup_empty[symmetric])
lemma member_union [simp]: "member (union (t1 :: 'a set_rbt) t2) = (λx. member t1 x ∨ member t2 x)" by(auto simp add: member_lookup fun_eq_iff lookup_join[OF ID_ccompare_neq_None] split: option.split)
lemma member_minus [simp]: "member (minus (t1 :: 'a set_rbt) t2) = (λx. member t1 x ∧¬ member t2 x)" by(transfer)(auto simp add: ID_ccompare_neq_None fun_eq_iff rbt_comps linorder.rbt_lookup_rbt_minus[OF set_linorder] ord.is_rbt_rbt_sorted)
lemma member_inter [simp]: "member (inter (t1 :: 'a set_rbt) t2) = (λx. member t1 x ∧ member t2 x)" by(auto simp add: member_lookup fun_eq_iff lookup_meet[OF ID_ccompare_neq_None] split: option.split)
lemma member_inter_list [simp]: "member (inter_list (t :: 'a set_rbt) xs) = (λx. member t x ∧ x ∈ set xs)" by transfer(auto simp add: ID_ccompare_neq_None fun_eq_iff linorder.rbt_lookup_fold_rbt_insert[OF set_linorder] ord.Empty_is_rbt map_of_map_Pair_key ord.rbt_lookup.simps rel_option_iff split: if_split_asm option.split_asm)
lemma member_filter [simp]: "member (filter P (t :: 'a set_rbt)) = (λx. member t x ∧ P x)" by(simp add: member_lookup fun_eq_iff lookup_filter[OF ID_ccompare_neq_None] split: option.split)
lemma distinct_keys [simp]: "distinct (keys (rbt :: 'a set_rbt))" by transfer(simp add: ID_ccompare_neq_None RBT_Impl.keys_def ord.is_rbt_rbt_sorted linorder.distinct_entries[OF set_linorder])
lemma all_conv_all_member: "all P t ⟷ (∀x :: 'a. member t x ⟶ P x)" by(simp add: member_lookup all_conv_all_lookup[OF ID_ccompare_neq_None])
lemma ex_conv_ex_member: "ex P t ⟷ (∃x :: 'a. member t x ∧ P x)" by(simp add: member_lookup ex_conv_ex_lookup[OF ID_ccompare_neq_None])
lemma finite_member: "finite (Collect (RBT_Set2.member (t :: 'a set_rbt)))" by transfer (simp add: rbt_comps linorder.finite_dom_rbt_lookup[OF set_linorder])
lemma member_Id_on: "member (Id_on t) = (λ(k :: 'a, k'). k = k' ∧ member t k)" by(simp add: member_lookup[abs_def] diag_lookup[OF ID_ccompare_neq_None] fun_eq_iff)
contextassumes ID_ccompare_neq_None': "ID CCOMPARE('b :: ccompare) ≠ None" begin
lemma sorted_RBT_Set_keys: "ID CCOMPARE('a :: ccompare) = Some c ==> linorder.sorted (le_of_comp c) (RBT_Set2.keys rbt)" by transfer(auto simp add: RBT_Set2.keys.rep_eq RBT_Impl.keys_def linorder.rbt_sorted_entries[OF ID_ccompare] ord.is_rbt_rbt_sorted)
contextassumes ID_ccompare_neq_None: "ID CCOMPARE('a :: {ccompare, lattice}) ≠ None" begin
lemma set_linorder2: "class.linorder (cless_eq :: 'a ==> 'a ==> bool) cless" using ID_ccompare_neq_None by(clarsimp)(rule ID_ccompare)
end
lemma set_keys_Mapping_RBT: "set (keys (Mapping_RBT t)) = set (RBT_Impl.keys t)" proof(cases t) case Empty thus ?thesis by(clarsimp simp add: Mapping_RBT_def keys.rep_eq is_ccompare_def Mapping_RBT'_inverse ord.is_rbt_def ord.rbt_sorted.simps) next case (Branch c l k v r) show ?thesis proof(cases "is_ccompare TYPE('a) ∧¬ ord.is_rbt cless (Branch c l k v r)") case False thus ?thesis using Branch by(auto simp add: Mapping_RBT_def keys.rep_eq is_ccompare_def Mapping_RBT'_inverse simp del: not_None_eq) next case True thus ?thesis using Branch by(clarsimp simp add: Mapping_RBT_def keys.rep_eq is_ccompare_def Mapping_RBT'_inverse RBT_ext.linorder.is_rbt_fold_rbt_insert_impl[OF ID_ccompare] linorder.rbt_insert_is_rbt[OF ID_ccompare] ord.Empty_is_rbt)(subst linorder.rbt_lookup_keys[OF ID_ccompare, symmetric], assumption, auto simp add: linorder.rbt_sorted_fold_insert[OF ID_ccompare] RBT_ext.linorder.rbt_lookup_fold_rbt_insert_impl[OF ID_ccompare] RBT_ext.linorder.rbt_lookup_rbt_insert'[OF ID_ccompare] linorder.rbt_insert_rbt_sorted[OF ID_ccompare] ord.is_rbt_rbt_sorted ord.Empty_is_rbt dom_map_of_conv_image_fst RBT_Impl.keys_def ord.rbt_lookup.simps) qed qed
hide_const (open) member empty insert remove bulkload union minus
keys fold fold_rev filter all ex product Id_on init
end
Messung V0.5 in Prozent
¤ 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.0.6Bemerkung:
¤
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.