71 subsection {* The @{text "\<approx>"} relation, the equivalence relation induced by @{text "\<lesssim>"} *} |
71 subsection {* The @{text "\<approx>"} relation, the equivalence relation induced by @{text "\<lesssim>"} *} |
72 |
72 |
73 definition equiv_fun :: "(nat \<Rightarrow> nat) \<Rightarrow> (nat \<Rightarrow> nat) \<Rightarrow> bool" (infix "\<cong>" 50) |
73 definition equiv_fun :: "(nat \<Rightarrow> nat) \<Rightarrow> (nat \<Rightarrow> nat) \<Rightarrow> bool" (infix "\<cong>" 50) |
74 where |
74 where |
75 "f \<cong> g \<longleftrightarrow> |
75 "f \<cong> g \<longleftrightarrow> |
76 (\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m)" |
76 (\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m)" |
77 |
77 |
78 text {* |
78 text {* |
79 This yields @{text "f \<cong> g \<longleftrightarrow> f \<in> \<Theta>(g)"}. Concerning @{text "c\<^isub>1"} and @{text "c\<^isub>2"} |
79 This yields @{text "f \<cong> g \<longleftrightarrow> f \<in> \<Theta>(g)"}. Concerning @{text "c\<^sub>1"} and @{text "c\<^sub>2"} |
80 restricted to @{typ nat}, see note above on @{text "(\<lesssim>)"}. |
80 restricted to @{typ nat}, see note above on @{text "(\<lesssim>)"}. |
81 *} |
81 *} |
82 |
82 |
83 lemma equiv_funI [intro?]: |
83 lemma equiv_funI [intro?]: |
84 assumes "\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" |
84 assumes "\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" |
85 shows "f \<cong> g" |
85 shows "f \<cong> g" |
86 unfolding equiv_fun_def by (rule assms) |
86 unfolding equiv_fun_def by (rule assms) |
87 |
87 |
88 lemma not_equiv_funI: |
88 lemma not_equiv_funI: |
89 assumes "\<And>c\<^isub>1 c\<^isub>2 n. c\<^isub>1 > 0 \<Longrightarrow> c\<^isub>2 > 0 \<Longrightarrow> |
89 assumes "\<And>c\<^sub>1 c\<^sub>2 n. c\<^sub>1 > 0 \<Longrightarrow> c\<^sub>2 > 0 \<Longrightarrow> |
90 \<exists>m>n. c\<^isub>1 * f m < g m \<or> c\<^isub>2 * g m < f m" |
90 \<exists>m>n. c\<^sub>1 * f m < g m \<or> c\<^sub>2 * g m < f m" |
91 shows "\<not> f \<cong> g" |
91 shows "\<not> f \<cong> g" |
92 using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast |
92 using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast |
93 |
93 |
94 lemma equiv_funE [elim?]: |
94 lemma equiv_funE [elim?]: |
95 assumes "f \<cong> g" |
95 assumes "f \<cong> g" |
96 obtains n c\<^isub>1 c\<^isub>2 where "c\<^isub>1 > 0" and "c\<^isub>2 > 0" |
96 obtains n c\<^sub>1 c\<^sub>2 where "c\<^sub>1 > 0" and "c\<^sub>2 > 0" |
97 and "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" |
97 and "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" |
98 using assms unfolding equiv_fun_def by blast |
98 using assms unfolding equiv_fun_def by blast |
99 |
99 |
100 lemma not_equiv_funE: |
100 lemma not_equiv_funE: |
101 fixes n c\<^isub>1 c\<^isub>2 |
101 fixes n c\<^sub>1 c\<^sub>2 |
102 assumes "\<not> f \<cong> g" and "c\<^isub>1 > 0" and "c\<^isub>2 > 0" |
102 assumes "\<not> f \<cong> g" and "c\<^sub>1 > 0" and "c\<^sub>2 > 0" |
103 obtains m where "m > n" |
103 obtains m where "m > n" |
104 and "c\<^isub>1 * f m < g m \<or> c\<^isub>2 * g m < f m" |
104 and "c\<^sub>1 * f m < g m \<or> c\<^sub>2 * g m < f m" |
105 using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast |
105 using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast |
106 |
106 |
107 |
107 |
108 subsection {* The @{text "\<prec>"} relation, the strict part of @{text "\<lesssim>"} *} |
108 subsection {* The @{text "\<prec>"} relation, the strict part of @{text "\<lesssim>"} *} |
109 |
109 |
205 show "f \<prec> g \<longleftrightarrow> f \<lesssim> g \<and> \<not> g \<lesssim> f" |
205 show "f \<prec> g \<longleftrightarrow> f \<lesssim> g \<and> \<not> g \<lesssim> f" |
206 by (fact less_fun_def) |
206 by (fact less_fun_def) |
207 assume "f \<lesssim> g" and "g \<lesssim> h" |
207 assume "f \<lesssim> g" and "g \<lesssim> h" |
208 show "f \<lesssim> h" |
208 show "f \<lesssim> h" |
209 proof |
209 proof |
210 from `f \<lesssim> g` obtain n\<^isub>1 c\<^isub>1 |
210 from `f \<lesssim> g` obtain n\<^sub>1 c\<^sub>1 |
211 where "c\<^isub>1 > 0" and P\<^isub>1: "\<And>m. m > n\<^isub>1 \<Longrightarrow> f m \<le> c\<^isub>1 * g m" |
211 where "c\<^sub>1 > 0" and P\<^sub>1: "\<And>m. m > n\<^sub>1 \<Longrightarrow> f m \<le> c\<^sub>1 * g m" |
212 by rule blast |
212 by rule blast |
213 from `g \<lesssim> h` obtain n\<^isub>2 c\<^isub>2 |
213 from `g \<lesssim> h` obtain n\<^sub>2 c\<^sub>2 |
214 where "c\<^isub>2 > 0" and P\<^isub>2: "\<And>m. m > n\<^isub>2 \<Longrightarrow> g m \<le> c\<^isub>2 * h m" |
214 where "c\<^sub>2 > 0" and P\<^sub>2: "\<And>m. m > n\<^sub>2 \<Longrightarrow> g m \<le> c\<^sub>2 * h m" |
215 by rule blast |
215 by rule blast |
216 have "\<forall>m>max n\<^isub>1 n\<^isub>2. f m \<le> (c\<^isub>1 * c\<^isub>2) * h m" |
216 have "\<forall>m>max n\<^sub>1 n\<^sub>2. f m \<le> (c\<^sub>1 * c\<^sub>2) * h m" |
217 proof (rule allI, rule impI) |
217 proof (rule allI, rule impI) |
218 fix m |
218 fix m |
219 assume Q: "m > max n\<^isub>1 n\<^isub>2" |
219 assume Q: "m > max n\<^sub>1 n\<^sub>2" |
220 from P\<^isub>1 Q have *: "f m \<le> c\<^isub>1 * g m" by simp |
220 from P\<^sub>1 Q have *: "f m \<le> c\<^sub>1 * g m" by simp |
221 from P\<^isub>2 Q have "g m \<le> c\<^isub>2 * h m" by simp |
221 from P\<^sub>2 Q have "g m \<le> c\<^sub>2 * h m" by simp |
222 with `c\<^isub>1 > 0` have "c\<^isub>1 * g m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by simp |
222 with `c\<^sub>1 > 0` have "c\<^sub>1 * g m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by simp |
223 with * show "f m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by (rule order_trans) |
223 with * show "f m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by (rule order_trans) |
224 qed |
224 qed |
225 then have "\<exists>n. \<forall>m>n. f m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by rule |
225 then have "\<exists>n. \<forall>m>n. f m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by rule |
226 moreover from `c\<^isub>1 > 0` `c\<^isub>2 > 0` have "c\<^isub>1 * c\<^isub>2 > 0" by (rule mult_pos_pos) |
226 moreover from `c\<^sub>1 > 0` `c\<^sub>2 > 0` have "c\<^sub>1 * c\<^sub>2 > 0" by (rule mult_pos_pos) |
227 ultimately show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * h m" by blast |
227 ultimately show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * h m" by blast |
228 qed |
228 qed |
229 qed |
229 qed |
230 from preorder.preorder_equiv_axioms show "class.preorder_equiv less_eq_fun less_fun" . |
230 from preorder.preorder_equiv_axioms show "class.preorder_equiv less_eq_fun less_fun" . |
231 show "preorder_equiv.equiv less_eq_fun = equiv_fun" |
231 show "preorder_equiv.equiv less_eq_fun = equiv_fun" |
232 proof (rule ext, rule ext, unfold preorder.equiv_def) |
232 proof (rule ext, rule ext, unfold preorder.equiv_def) |
233 fix f g |
233 fix f g |
234 show "f \<lesssim> g \<and> g \<lesssim> f \<longleftrightarrow> f \<cong> g" |
234 show "f \<lesssim> g \<and> g \<lesssim> f \<longleftrightarrow> f \<cong> g" |
235 proof |
235 proof |
236 assume "f \<cong> g" |
236 assume "f \<cong> g" |
237 then obtain n c\<^isub>1 c\<^isub>2 where "c\<^isub>1 > 0" and "c\<^isub>2 > 0" |
237 then obtain n c\<^sub>1 c\<^sub>2 where "c\<^sub>1 > 0" and "c\<^sub>2 > 0" |
238 and *: "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" |
238 and *: "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" |
239 by rule blast |
239 by rule blast |
240 have "\<forall>m>n. f m \<le> c\<^isub>1 * g m" |
240 have "\<forall>m>n. f m \<le> c\<^sub>1 * g m" |
241 proof (rule allI, rule impI) |
241 proof (rule allI, rule impI) |
242 fix m |
242 fix m |
243 assume "m > n" |
243 assume "m > n" |
244 with * show "f m \<le> c\<^isub>1 * g m" by simp |
244 with * show "f m \<le> c\<^sub>1 * g m" by simp |
245 qed |
245 qed |
246 with `c\<^isub>1 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast |
246 with `c\<^sub>1 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast |
247 then have "f \<lesssim> g" .. |
247 then have "f \<lesssim> g" .. |
248 have "\<forall>m>n. g m \<le> c\<^isub>2 * f m" |
248 have "\<forall>m>n. g m \<le> c\<^sub>2 * f m" |
249 proof (rule allI, rule impI) |
249 proof (rule allI, rule impI) |
250 fix m |
250 fix m |
251 assume "m > n" |
251 assume "m > n" |
252 with * show "g m \<le> c\<^isub>2 * f m" by simp |
252 with * show "g m \<le> c\<^sub>2 * f m" by simp |
253 qed |
253 qed |
254 with `c\<^isub>2 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. g m \<le> c * f m" by blast |
254 with `c\<^sub>2 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. g m \<le> c * f m" by blast |
255 then have "g \<lesssim> f" .. |
255 then have "g \<lesssim> f" .. |
256 from `f \<lesssim> g` and `g \<lesssim> f` show "f \<lesssim> g \<and> g \<lesssim> f" .. |
256 from `f \<lesssim> g` and `g \<lesssim> f` show "f \<lesssim> g \<and> g \<lesssim> f" .. |
257 next |
257 next |
258 assume "f \<lesssim> g \<and> g \<lesssim> f" |
258 assume "f \<lesssim> g \<and> g \<lesssim> f" |
259 then have "f \<lesssim> g" and "g \<lesssim> f" by auto |
259 then have "f \<lesssim> g" and "g \<lesssim> f" by auto |
260 from `f \<lesssim> g` obtain n\<^isub>1 c\<^isub>1 where "c\<^isub>1 > 0" |
260 from `f \<lesssim> g` obtain n\<^sub>1 c\<^sub>1 where "c\<^sub>1 > 0" |
261 and P\<^isub>1: "\<And>m. m > n\<^isub>1 \<Longrightarrow> f m \<le> c\<^isub>1 * g m" by rule blast |
261 and P\<^sub>1: "\<And>m. m > n\<^sub>1 \<Longrightarrow> f m \<le> c\<^sub>1 * g m" by rule blast |
262 from `g \<lesssim> f` obtain n\<^isub>2 c\<^isub>2 where "c\<^isub>2 > 0" |
262 from `g \<lesssim> f` obtain n\<^sub>2 c\<^sub>2 where "c\<^sub>2 > 0" |
263 and P\<^isub>2: "\<And>m. m > n\<^isub>2 \<Longrightarrow> g m \<le> c\<^isub>2 * f m" by rule blast |
263 and P\<^sub>2: "\<And>m. m > n\<^sub>2 \<Longrightarrow> g m \<le> c\<^sub>2 * f m" by rule blast |
264 have "\<forall>m>max n\<^isub>1 n\<^isub>2. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" |
264 have "\<forall>m>max n\<^sub>1 n\<^sub>2. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" |
265 proof (rule allI, rule impI) |
265 proof (rule allI, rule impI) |
266 fix m |
266 fix m |
267 assume Q: "m > max n\<^isub>1 n\<^isub>2" |
267 assume Q: "m > max n\<^sub>1 n\<^sub>2" |
268 from P\<^isub>1 Q have "f m \<le> c\<^isub>1 * g m" by simp |
268 from P\<^sub>1 Q have "f m \<le> c\<^sub>1 * g m" by simp |
269 moreover from P\<^isub>2 Q have "g m \<le> c\<^isub>2 * f m" by simp |
269 moreover from P\<^sub>2 Q have "g m \<le> c\<^sub>2 * f m" by simp |
270 ultimately show "f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" .. |
270 ultimately show "f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" .. |
271 qed |
271 qed |
272 with `c\<^isub>1 > 0` `c\<^isub>2 > 0` have "\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n. |
272 with `c\<^sub>1 > 0` `c\<^sub>2 > 0` have "\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n. |
273 \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" by blast |
273 \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" by blast |
274 then show "f \<cong> g" .. |
274 then show "f \<cong> g" .. |
275 qed |
275 qed |
276 qed |
276 qed |
277 qed |
277 qed |
278 |
278 |
316 |
316 |
317 lemma "Discrete.sqrt \<prec> id" |
317 lemma "Discrete.sqrt \<prec> id" |
318 proof (rule less_fun_strongI) |
318 proof (rule less_fun_strongI) |
319 fix c :: nat |
319 fix c :: nat |
320 assume "0 < c" |
320 assume "0 < c" |
321 have "\<forall>m>(Suc c)\<twosuperior>. c * Discrete.sqrt m < id m" |
321 have "\<forall>m>(Suc c)\<^sup>2. c * Discrete.sqrt m < id m" |
322 proof (rule allI, rule impI) |
322 proof (rule allI, rule impI) |
323 fix m |
323 fix m |
324 assume "(Suc c)\<twosuperior> < m" |
324 assume "(Suc c)\<^sup>2 < m" |
325 then have "(Suc c)\<twosuperior> \<le> m" by simp |
325 then have "(Suc c)\<^sup>2 \<le> m" by simp |
326 with mono_sqrt have "Discrete.sqrt ((Suc c)\<twosuperior>) \<le> Discrete.sqrt m" by (rule monoE) |
326 with mono_sqrt have "Discrete.sqrt ((Suc c)\<^sup>2) \<le> Discrete.sqrt m" by (rule monoE) |
327 then have "Suc c \<le> Discrete.sqrt m" by simp |
327 then have "Suc c \<le> Discrete.sqrt m" by simp |
328 then have "c < Discrete.sqrt m" by simp |
328 then have "c < Discrete.sqrt m" by simp |
329 moreover from `(Suc c)\<twosuperior> < m` have "Discrete.sqrt m > 0" by simp |
329 moreover from `(Suc c)\<^sup>2 < m` have "Discrete.sqrt m > 0" by simp |
330 ultimately have "c * Discrete.sqrt m < Discrete.sqrt m * Discrete.sqrt m" by simp |
330 ultimately have "c * Discrete.sqrt m < Discrete.sqrt m * Discrete.sqrt m" by simp |
331 also have "\<dots> \<le> m" by (simp add: power2_eq_square [symmetric]) |
331 also have "\<dots> \<le> m" by (simp add: power2_eq_square [symmetric]) |
332 finally show "c * Discrete.sqrt m < id m" by simp |
332 finally show "c * Discrete.sqrt m < id m" by simp |
333 qed |
333 qed |
334 then show "\<exists>n. \<forall>m>n. c * Discrete.sqrt m < id m" .. |
334 then show "\<exists>n. \<forall>m>n. c * Discrete.sqrt m < id m" .. |
335 qed |
335 qed |
336 |
336 |
337 lemma "id \<prec> (\<lambda>n. n\<twosuperior>)" |
337 lemma "id \<prec> (\<lambda>n. n\<^sup>2)" |
338 by (rule less_fun_strongI) (auto simp add: power2_eq_square) |
338 by (rule less_fun_strongI) (auto simp add: power2_eq_square) |
339 |
339 |
340 lemma "(\<lambda>n. n ^ k) \<prec> (\<lambda>n. n ^ Suc k)" |
340 lemma "(\<lambda>n. n ^ k) \<prec> (\<lambda>n. n ^ Suc k)" |
341 by (rule less_fun_strongI) auto |
341 by (rule less_fun_strongI) auto |
342 |
342 |