lemma bigo_plus_subset [intro]: "O(f + g) <= O(f) + O(g)" apply (rule subsetI) apply (auto simp add: bigo_def bigo_pos_const func_plus set_plus_def) apply (subst bigo_pos_const [symmetric])+ apply (rule_tac x = "\n. if \g n\ <= \f n\ then x n else 0" in exI) apply (rule conjI) apply (rule_tac x = "c + c"in exI) apply clarsimp apply (subgoal_tac "c * \f xa + g xa\ <= (c + c) * \f xa\") apply (metis mult_2 order_trans) apply (subgoal_tac "c * \f xa + g xa\ <= c * (\f xa\ + \g xa\)") apply (erule order_trans) apply (simp add: ring_distribs) apply (rule mult_left_mono) apply (simp add: abs_triangle_ineq) apply (simp add: order_less_le) apply (rule_tac x = "\n. if \f n\ < \g n\ then x n else 0" in exI) apply (rule conjI) apply (rule_tac x = "c + c"in exI) apply auto apply (subgoal_tac "c * \f xa + g xa\ <= (c + c) * \g xa\") apply (metis order_trans mult_2) apply (subgoal_tac "c * \f xa + g xa\ <= c * (\f xa\ + \g xa\)") apply (erule order_trans) apply (simp add: ring_distribs) by (metis abs_triangle_ineq mult_le_cancel_left_pos)
lemma bigo_plus_subset2 [intro]: "A <= O(f) \ B <= O(f) \ A + B <= O(f)" by (metis bigo_plus_idemp set_plus_mono2)
lemma bigo_plus_eq: "\x. 0 <= f x \ \x. 0 <= g x \ O(f + g) = O(f) + O(g)" apply (rule equalityI) apply (rule bigo_plus_subset) apply (simp add: bigo_alt_def set_plus_def func_plus) apply clarify (* sledgehammer *) apply (rule_tac x = "max c ca"in exI)
apply (rule conjI) apply (metis less_max_iff_disj) apply clarify apply (drule_tac x = "xa"in spec)+ apply (subgoal_tac "0 <= f xa + g xa") apply (simp add: ring_distribs) apply (subgoal_tac "\a xa + b xa\ <= \a xa\ + \b xa\") apply (subgoal_tac "\a xa\ + \b xa\ <= max c ca * f xa + max c ca * g xa") apply (metis order_trans) defer 1 apply (metis abs_triangle_ineq) apply (metis add_nonneg_nonneg) apply (rule add_mono) apply (metis max.cobounded2 linorder_linear max.absorb1 mult_right_mono xt1(6)) by (metis max.cobounded2 linorder_not_le mult_le_cancel_right order_trans)
lemma bigo_bounded_alt: "\x. 0 \ f x \ \x. f x \ c * g x \ f \ O(g)" apply (auto simp add: bigo_def) (* Version 1: one-line proof *) by (metis abs_le_D1 linorder_class.not_less order_less_le Orderings.xt1(12) abs_mult)
lemma"\x. 0 \ f x \ \x. f x \ c * g x \ f \ O(g)" apply (auto simp add: bigo_def) (* Version 2: structured proof *) proof - assume"\x. f x \ c * g x" thus"\c. \x. f x \ c * \g x\" by (metis abs_mult abs_ge_self order_trans) qed
lemma bigo_bounded: "\x. 0 \ f x \ \x. f x \ g x \ f \ O(g)" apply (erule bigo_bounded_alt [of f 1 g]) by (metis mult_1)
lemma bigo_bounded2: "\x. lb x \ f x \ \x. f x \ lb x + g x \ f \ lb +o O(g)" apply (rule set_minus_imp_plus) apply (rule bigo_bounded) apply (metis add_le_cancel_left diff_add_cancel diff_self minus_apply
algebra_simps) by (metis add_le_cancel_left diff_add_cancel func_plus le_fun_def
algebra_simps)
lemma bigo_abs: "(\x. \f x\) =o O(f)" apply (unfold bigo_def) apply auto by (metis mult_1 order_refl)
lemma bigo_abs2: "f =o O(\x. \f x\)" apply (unfold bigo_def) apply auto by (metis mult_1 order_refl)
lemma bigo_abs3: "O(f) = O(\x. \f x\)" proof - have F1: "\v u. u \ O(v) \ O(u) \ O(v)" by (metis bigo_elt_subset) have F2: "\u. (\R. \u R\) \ O(u)" by (metis bigo_abs) have"\u. u \ O(\R. \u R\)" by (metis bigo_abs2) thus"O(f) = O(\x. \f x\)" using F1 F2 by auto qed
lemma bigo_sum_main: "\x. \y \ A x. 0 \ h x y \ \<exists>c. \<forall>x. \<forall>y \<in> A x. \<bar>f x y\<bar> <= c * (h x y) \<Longrightarrow>
(\<lambda>x. \<Sum>y \<in> A x. f x y) =o O(\<lambda>x. \<Sum>y \<in> A x. h x y)" apply (auto simp add: bigo_def) apply (rule_tac x = "\c\" in exI) apply (subst abs_of_nonneg) backback apply (rule sum_nonneg) apply force apply (subst sum_distrib_left) apply (rule allI) apply (rule order_trans) apply (rule sum_abs) apply (rule sum_mono) by (metis abs_ge_self abs_mult_pos order_trans)
lemma bigo_sum1: "\x y. 0 <= h x y \ \<exists>c. \<forall>x y. \<bar>f x y\<bar> <= c * (h x y) \<Longrightarrow>
(\<lambda>x. \<Sum>y \<in> A x. f x y) =o O(\<lambda>x. \<Sum>y \<in> A x. h x y)" by (metis (no_types) bigo_sum_main)
lemma bigo_sum2: "\y. 0 <= h y \ \<exists>c. \<forall>y. \<bar>f y\<bar> <= c * (h y) \<Longrightarrow>
(\<lambda>x. \<Sum>y \<in> A x. f y) =o O(\<lambda>x. \<Sum>y \<in> A x. h y)" apply (rule bigo_sum1) by metis+
lemma bigo_sum3: "f =o O(h) \
(\<lambda>x. \<Sum>y \<in> A x. (l x y) * f(k x y)) =o
O(\<lambda>x. \<Sum>y \<in> A x. \<bar>l x y * h(k x y)\<bar>)" apply (rule bigo_sum1) apply (rule allI)+ apply (rule abs_ge_zero) apply (unfold bigo_def) apply (auto simp add: abs_mult) by (metis abs_ge_zero mult.left_commute mult_left_mono)
lemma bigo_sum4: "f =o g +o O(h) \
(\<lambda>x. \<Sum>y \<in> A x. l x y * f(k x y)) =o
(\<lambda>x. \<Sum>y \<in> A x. l x y * g(k x y)) +o
O(\<lambda>x. \<Sum>y \<in> A x. \<bar>l x y * h(k x y)\<bar>)" apply (rule set_minus_imp_plus) apply (subst fun_diff_def) apply (subst sum_subtractf [symmetric]) apply (subst right_diff_distrib [symmetric]) apply (rule bigo_sum3) by (metis (lifting, no_types) fun_diff_def set_plus_imp_minus ext)
lemma bigo_sum5: "f =o O(h) \ \x y. 0 <= l x y \ \<forall>x. 0 <= h x \<Longrightarrow>
(\<lambda>x. \<Sum>y \<in> A x. (l x y) * f(k x y)) =o
O(\<lambda>x. \<Sum>y \<in> A x. (l x y) * h(k x y))" apply (subgoal_tac "(\x. \y \ A x. (l x y) * h(k x y)) =
(\<lambda>x. \<Sum>y \<in> A x. \<bar>(l x y) * h(k x y)\<bar>)") apply (erule ssubst) apply (erule bigo_sum3) apply (rule ext) apply (rule sum.cong) apply (rule refl) by (metis abs_of_nonneg zero_le_mult_iff)
lemma bigo_sum6: "f =o g +o O(h) \ \x y. 0 <= l x y \ \<forall>x. 0 <= h x \<Longrightarrow>
(\<lambda>x. \<Sum>y \<in> A x. (l x y) * f(k x y)) =o
(\<lambda>x. \<Sum>y \<in> A x. (l x y) * g(k x y)) +o
O(\<lambda>x. \<Sum>y \<in> A x. (l x y) * h(k x y))" apply (rule set_minus_imp_plus) apply (subst fun_diff_def) apply (subst sum_subtractf [symmetric]) apply (subst right_diff_distrib [symmetric]) apply (rule bigo_sum5) apply (subst fun_diff_def [symmetric]) apply (drule set_plus_imp_minus) apply auto done
subsection \<open>Misc useful stuff\<close>
lemma bigo_useful_intro: "A <= O(f) \ B <= O(f) \
A + B <= O(f)" apply (subst bigo_plus_idemp [symmetric]) apply (rule set_plus_mono2) apply assumption+ done
lemma bigo_useful_add: "f =o O(h) \ g =o O(h) \ f + g =o O(h)" apply (subst bigo_plus_idemp [symmetric]) apply (rule set_plus_intro) apply assumption+ done
lemma bigo_useful_const_mult: "(c::'a::linordered_field) ~= 0 \
(\<lambda>x. c) * f =o O(h) \<Longrightarrow> f =o O(h)" apply (rule subsetD) apply (subgoal_tac "(\x. 1 / c) *o O(h) <= O(h)") apply assumption apply (rule bigo_const_mult6) apply (subgoal_tac "f = (\x. 1 / c) * ((\x. c) * f)") apply (erule ssubst) apply (erule set_times_intro2) apply (simp add: func_times) done
lemma bigo_fix: "(\x. f ((x::nat) + 1)) =o O(\x. h(x + 1)) \ f 0 = 0 \
f =o O(h)" apply (simp add: bigo_alt_def) by (metis abs_ge_zero abs_mult abs_of_pos abs_zero not0_implies_Suc)
lemma bigo_lesseq2: "f =o O(h) \ \x. \g x\ <= f x \
g =o O(h)" apply (erule bigo_lesseq1) apply (blast intro: abs_ge_self order_trans) done
lemma bigo_lesseq3: "f =o O(h) \ \x. 0 <= g x \ \x. g x <= f x \
g =o O(h)" apply (erule bigo_lesseq2) apply (rule allI) apply (subst abs_of_nonneg) apply (erule spec)+ done
lemma bigo_lesseq4: "f =o O(h) \ \<forall>x. 0 <= g x \<Longrightarrow> \<forall>x. g x <= \<bar>f x\<bar> \<Longrightarrow>
g =o O(h)" apply (erule bigo_lesseq1) apply (rule allI) apply (subst abs_of_nonneg) apply (erule spec)+ done
lemma bigo_lesso1: "\x. f x <= g x \ f apply (unfold lesso_def) apply (subgoal_tac "(\x. max (f x - g x) 0) = 0") apply (metis bigo_zero) by (metis (lifting, no_types) func_zero le_fun_def le_iff_diff_le_0
max.absorb2 order_eq_iff)
lemma bigo_lesso2: "f =o g +o O(h) \ \<forall>x. 0 <= k x \<Longrightarrow> \<forall>x. k x <= f x \<Longrightarrow>
k <o g =o O(h)" apply (unfold lesso_def) apply (rule bigo_lesseq4) apply (erule set_plus_imp_minus) apply (rule allI) apply (rule max.cobounded2) apply (rule allI) apply (subst fun_diff_def) apply (erule thin_rl) (* sledgehammer *) apply (case_tac "0 <= k x - g x") apply (metis (lifting) abs_le_D1 linorder_linear min_diff_distrib_left
min.absorb1 min.absorb2 max.absorb1) by (metis abs_ge_zero le_cases max.absorb2)
lemma bigo_lesso3: "f =o g +o O(h) \ \<forall>x. 0 <= k x \<Longrightarrow> \<forall>x. g x <= k x \<Longrightarrow>
f <o k =o O(h)" apply (unfold lesso_def) apply (rule bigo_lesseq4) apply (erule set_plus_imp_minus) apply (rule allI) apply (rule max.cobounded2) apply (rule allI) apply (subst fun_diff_def) apply (erule thin_rl) (* sledgehammer *) apply (case_tac "0 <= f x - k x") apply simp apply (subst abs_of_nonneg) apply (drule_tac x = x in spec) back apply (metis diff_less_0_iff_less linorder_not_le not_le_imp_less xt1(12) xt1(6)) apply (metis add_minus_cancel diff_le_eq le_diff_eq uminus_add_conv_diff) by (metis abs_ge_zero linorder_linear max.absorb1 max.commute)
lemma bigo_lesso4: "f 'b::{linordered_field}) \
g =o h +o O(k) \<Longrightarrow> f <o h =o O(k)" apply (unfold lesso_def) apply (drule set_plus_imp_minus) apply (drule bigo_abs5) back apply (simp add: fun_diff_def) apply (drule bigo_useful_add, assumption) apply (erule bigo_lesseq2) back apply (rule allI) by (auto simp add: func_plus fun_diff_def algebra_simps
split: split_max abs_split)
lemma bigo_lesso5: "f \C. \x. f x <= g x + C * \h x\" apply (simp only: lesso_def bigo_alt_def) apply clarsimp by (metis add.commute diff_le_eq)
end
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
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 ist noch experimentell.