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 |