src/HOL/Metis_Examples/Big_O.thy
changeset 45705 a25ff4283352
parent 45575 3a865fc42bbf
child 46364 abab10d1f4a3
equal deleted inserted replaced
45704:5e547b54a9e2 45705:a25ff4283352
   390 lemma bigo_mult6: "\<forall>x. f x ~= 0 \<Longrightarrow>
   390 lemma bigo_mult6: "\<forall>x. f x ~= 0 \<Longrightarrow>
   391     O(f * g) = (f\<Colon>'a => ('b\<Colon>{linordered_field,number_ring})) *o O(g)"
   391     O(f * g) = (f\<Colon>'a => ('b\<Colon>{linordered_field,number_ring})) *o O(g)"
   392 by (metis bigo_mult2 bigo_mult5 order_antisym)
   392 by (metis bigo_mult2 bigo_mult5 order_antisym)
   393 
   393 
   394 (*proof requires relaxing relevance: 2007-01-25*)
   394 (*proof requires relaxing relevance: 2007-01-25*)
   395   declare bigo_mult6 [simp]
   395 declare bigo_mult6 [simp]
       
   396 
   396 lemma bigo_mult7: "\<forall>x. f x ~= 0 \<Longrightarrow>
   397 lemma bigo_mult7: "\<forall>x. f x ~= 0 \<Longrightarrow>
   397     O(f * g) <= O(f\<Colon>'a => ('b\<Colon>{linordered_field,number_ring})) \<otimes> O(g)"
   398     O(f * g) <= O(f\<Colon>'a => ('b\<Colon>{linordered_field,number_ring})) \<otimes> O(g)"
   398 (* sledgehammer *)
   399 (* sledgehammer *)
   399   apply (subst bigo_mult6)
   400   apply (subst bigo_mult6)
   400   apply assumption
   401   apply assumption
   798   (* sledgehammer *)
   799   (* sledgehammer *)
   799   apply (case_tac "0 <= f x - k x")
   800   apply (case_tac "0 <= f x - k x")
   800   apply simp
   801   apply simp
   801   apply (subst abs_of_nonneg)
   802   apply (subst abs_of_nonneg)
   802   apply (drule_tac x = x in spec) back
   803   apply (drule_tac x = x in spec) back
   803   apply (metis diff_less_0_iff_less linorder_not_le not_leE uminus_add_conv_diff xt1(12) xt1(6))
   804   apply (metis diff_less_0_iff_less linorder_not_le not_leE xt1(12) xt1(6))
   804  apply (metis add_minus_cancel diff_le_eq le_diff_eq uminus_add_conv_diff)
   805  apply (metis add_minus_cancel diff_le_eq le_diff_eq uminus_add_conv_diff)
   805 apply (metis abs_ge_zero linorder_linear min_max.sup_absorb1 min_max.sup_commute)
   806 apply (metis abs_ge_zero linorder_linear min_max.sup_absorb1 min_max.sup_commute)
   806 done
   807 done
   807 
   808 
   808 lemma bigo_lesso4: "f <o g =o O(k\<Colon>'a=>'b\<Colon>{linordered_field,number_ring}) \<Longrightarrow>
   809 lemma bigo_lesso4:
   809     g =o h +o O(k) \<Longrightarrow> f <o h =o O(k)"
   810   "f <o g =o O(k\<Colon>'a=>'b\<Colon>{linordered_field,number_ring}) \<Longrightarrow>
   810   apply (unfold lesso_def)
   811    g =o h +o O(k) \<Longrightarrow> f <o h =o O(k)"
   811   apply (drule set_plus_imp_minus)
   812 apply (unfold lesso_def)
   812   apply (drule bigo_abs5) back
   813 apply (drule set_plus_imp_minus)
   813   apply (simp add: fun_diff_def)
   814 apply (drule bigo_abs5) back
   814   apply (drule bigo_useful_add)
   815 apply (simp add: fun_diff_def)
   815   apply assumption
   816 apply (drule bigo_useful_add, assumption)
   816   apply (erule bigo_lesseq2) back
   817 apply (erule bigo_lesseq2) back
   817   apply (rule allI)
   818 apply (rule allI)
   818   apply (auto simp add: func_plus fun_diff_def algebra_simps
   819 by (auto simp add: func_plus fun_diff_def algebra_simps
   819     split: split_max abs_split)
   820     split: split_max abs_split)
   820 done
   821 
   821 
   822 lemma bigo_lesso5: "f <o g =o O(h) \<Longrightarrow> \<exists>C. \<forall>x. f x <= g x + C * abs (h x)"
   822 lemma bigo_lesso5: "f <o g =o O(h) \<Longrightarrow> \<exists>C. \<forall>x. f x <= g x + C * abs(h x)"
   823 apply (simp only: lesso_def bigo_alt_def)
   823   apply (simp only: lesso_def bigo_alt_def)
   824 apply clarsimp
   824   apply clarsimp
   825 by (metis abs_if abs_mult add_commute diff_le_eq less_not_permute)
   825   apply (metis abs_if abs_mult add_commute diff_le_eq less_not_permute)
       
   826 done
       
   827 
   826 
   828 end
   827 end