src/HOL/Library/Function_Growth.thy
changeset 63060 293ede07b775
parent 63040 eb4ddd18d635
child 63540 f8652d0534fa
equal deleted inserted replaced
63059:3f577308551e 63060:293ede07b775
   161   assumes "f \<prec> g"
   161   assumes "f \<prec> g"
   162   obtains n c where "c > 0" and "\<And>m. m > n \<Longrightarrow> f m \<le> c * g m"
   162   obtains n c where "c > 0" and "\<And>m. m > n \<Longrightarrow> f m \<le> c * g m"
   163     and "\<And>c n. c > 0 \<Longrightarrow> \<exists>m>n. c * f m < g m"
   163     and "\<And>c n. c > 0 \<Longrightarrow> \<exists>m>n. c * f m < g m"
   164 proof -
   164 proof -
   165   from assms have "f \<lesssim> g" and "\<not> g \<lesssim> f" by (simp_all add: less_fun_def)
   165   from assms have "f \<lesssim> g" and "\<not> g \<lesssim> f" by (simp_all add: less_fun_def)
   166   from \<open>f \<lesssim> g\<close> obtain n c where *:"c > 0" "\<And>m. m > n \<Longrightarrow> f m \<le> c * g m"
   166   from \<open>f \<lesssim> g\<close> obtain n c where *:"c > 0" "m > n \<Longrightarrow> f m \<le> c * g m" for m
   167     by (rule less_eq_funE) blast
   167     by (rule less_eq_funE) blast
   168   { fix c n :: nat
   168   { fix c n :: nat
   169     assume "c > 0"
   169     assume "c > 0"
   170     with \<open>\<not> g \<lesssim> f\<close> obtain m where "m > n" "c * f m < g m"
   170     with \<open>\<not> g \<lesssim> f\<close> obtain m where "m > n" "c * f m < g m"
   171       by (rule not_less_eq_funE) blast
   171       by (rule not_less_eq_funE) blast
   200 lemma less_fun_strongI:
   200 lemma less_fun_strongI:
   201   assumes "\<And>c. c > 0 \<Longrightarrow> \<exists>n. \<forall>m>n. c * f m < g m"
   201   assumes "\<And>c. c > 0 \<Longrightarrow> \<exists>n. \<forall>m>n. c * f m < g m"
   202   shows "f \<prec> g"
   202   shows "f \<prec> g"
   203 proof (rule less_funI)
   203 proof (rule less_funI)
   204   have "1 > (0::nat)" by simp
   204   have "1 > (0::nat)" by simp
   205   from assms \<open>1 > 0\<close> have "\<exists>n. \<forall>m>n. 1 * f m < g m" .
   205   with assms [OF this] obtain n where *: "m > n \<Longrightarrow> 1 * f m < g m" for m
   206   then obtain n where *: "\<And>m. m > n \<Longrightarrow> 1 * f m < g m" by blast
   206     by blast
   207   have "\<forall>m>n. f m \<le> 1 * g m"
   207   have "\<forall>m>n. f m \<le> 1 * g m"
   208   proof (rule allI, rule impI)
   208   proof (rule allI, rule impI)
   209     fix m
   209     fix m
   210     assume "m > n"
   210     assume "m > n"
   211     with * have "1 * f m < g m" by simp
   211     with * have "1 * f m < g m" by simp
   212     then show "f m \<le> 1 * g m" by simp
   212     then show "f m \<le> 1 * g m" by simp
   213   qed
   213   qed
   214   with \<open>1 > 0\<close> show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast
   214   with \<open>1 > 0\<close> show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast
   215   fix c n :: nat
   215   fix c n :: nat
   216   assume "c > 0"
   216   assume "c > 0"
   217   with assms obtain q where "\<And>m. m > q \<Longrightarrow> c * f m < g m" by blast
   217   with assms obtain q where "m > q \<Longrightarrow> c * f m < g m" for m by blast
   218   then have "c * f (Suc (q + n)) < g (Suc (q + n))" by simp
   218   then have "c * f (Suc (q + n)) < g (Suc (q + n))" by simp
   219   moreover have "Suc (q + n) > n" by simp
   219   moreover have "Suc (q + n) > n" by simp
   220   ultimately show "\<exists>m>n. c * f m < g m" by blast
   220   ultimately show "\<exists>m>n. c * f m < g m" by blast
   221 qed
   221 qed
   222 
   222