text‹Two slopes are said to be equivalent if their difference is bounded.› definition eudoxus_rel :: "(int ==> int) ==> (int ==> int) ==> bool" (infix‹∼e›50) where "f ∼e g ≡ slope f ∧ slope g ∧ bounded (λn. f n - g n)"
lemma eudoxus_rel_equivp: "part_equivp eudoxus_rel" proof (rule part_equivpI) show"∃x. x ∼e x"unfolding eudoxus_rel_def slope_def bounded_def by fast show"symp (∼e)"unfolding eudoxus_rel_def by (force intro: sympI dest: bounded_uminus simp: fun_Compl_def) show"transp (∼e)"unfolding eudoxus_rel_def by (force intro!: transpI dest: bounded_add) qed
text‹We define the reals as the set of all equivalence classes of the relation term‹eudoxus_rel›.›
quotient_type real = "(int ==> int)" / partial: eudoxus_rel by (rule eudoxus_rel_equivp)
lemma eudoxus_relI: assumes"slope f""slope g""∧n. n ≥ N ==>∣f n - g n∣≤ C" shows"f ∼e g" proof - have C_nonneg: "C ≥ 0"using assms by force
obtain C_f where C_f: "∣f (n + (- n)) - (f n + f (- n))∣≤ C_f""0 ≤ C_f"for n using assms by fast
obtain C_g where C_g: "∣g (n + (- n)) - (g n + g (- n))∣≤ C_g""0 ≤ C_g"for n using assms by fast
have bound: "∣f (- n) - g (- n)∣≤∣f n - g n∣ + ∣f 0∣ + ∣g 0∣ + C_f + C_g"for n using C_f(1)[of n] C_g(1)[of n] by simp
define C' where"C' = Sup {∣f n - g n∣ | n. n ∈ {0..max 0 N}} + C + ∣f 0∣ + ∣g 0∣ + C_f + C_g" have *: "bdd_above {∣f n - g n∣ |n. n ∈ {0..max 0 N}}"by simp have"Sup {∣f n - g n∣ |n. n ∈ {0..max 0 N}} ∈ {∣f n - g n∣ |n. n ∈ {0..max 0 N}}"using C_nonneg by (intro int_Sup_mem[OF _ *]) auto hence Sup_nonneg: "Sup {∣f n - g n∣ | n. n ∈ {0..max 0 N}} ≥ 0"by fastforce
have *: "∣f n - g n∣≤ Sup {∣f n - g n∣ | n. n ∈ {0..max 0 N}} + C"if"n ≥ 0"for n unfolding C'_defusing cSup_upper[OF _ *] that C_nonneg Sup_nonneg by (cases "n ≤ N") (fastforce simp add: add.commute add_increasing2 assms(3))+
{ fix n have"∣f n - g n∣≤ C'" proof (cases "n ≥ 0") case True thus ?thesis unfolding C'_defusing * C_f C_g by fastforce next case False hence"- n ≥ 0"by simp hence"∣f (- n) - g (- n)∣≤ Sup {∣f n - g n∣ | n. n ∈ {0..max 0 N}} + C"using *[of "- n"] by blast hence"∣f (- (- n)) - g (- (- n))∣≤ C'"unfolding C'_defusing bound[of "- n"] by linarith thus ?thesis by simp qed
} thus ?thesis using assms unfolding eudoxus_rel_def by (auto intro: boundedI) qed
subsection‹Addition and Subtraction›
text‹We define addition, subtraction and the additive identity as follows.› instantiation real :: "{zero, plus, minus, uminus}" begin
lemma abs_real_uminus[simp]: assumes"slope f" shows"- abs_real f = abs_real (-e f)" using assms unfolding uminus_real_def by auto
definition"x - (y::real) = x + - y"
declare slope_minus[intro, simp]
lemma abs_real_minus[simp]: assumes"slope g""slope f" shows"abs_real g - abs_real f = abs_real (g +e (-e f))" using assms by (simp add: minus_real_def slope_refl eudoxus_uminus_cong)
instance .. end
text‹The Eudoxus reals equipped with addition and negation specified as above constitute an Abelian group.› instance real :: ab_group_add proof fix x y z :: real show"x + y + z = x + (y + z)"by (induct x, induct y, induct z) (simp add: eudoxus_plus_cong eudoxus_plus_def add.assoc) show"x + y = y + x"by (induct x, induct y) (simp add: eudoxus_plus_def add.commute) show"0 + x = x"by (induct x) (simp add: zero_real_def eudoxus_plus_def) show"- x + x = 0"by (induct x) (simp add: eudoxus_uminus_cong, simp add: zero_real_def eudoxus_plus_def eudoxus_uminus_def) qed (simp add: minus_real_def)
subsection‹Multiplication›
text‹We define multiplication as the composition of two slopes.› instantiation real :: "{one, times}" begin
quotient_definition "1 :: real"is"abs_real id" .
declare slope_one[intro!, simp]
lemma one_def: "1 = abs_real id"unfolding one_real_def by simp
definition eudoxus_times :: "(int ==> int) ==> (int ==> int) ==> int ==> int" (infixl‹*e›60) where "f *e g = f o g"
quotient_definition "(*) :: real \ real \ real" is "(*\<^sub>e)" proof - fix x x' y y' assume"x ∼e x'""y ∼e y'" hence rel_x: "slope x""slope x'""bounded (λz. x z - x' z)"and rel_y: "slope y""slope y'""bounded (λz. y z - y' z)"unfolding eudoxus_rel_def by blast+
obtain C where x'_bound: "∣x' (m + n) - (x' m + x' n)∣≤ C"for m n using rel_x(2) unfolding slope_def by fastforce
obtain A B where x'_lin_bound: "∣x' n∣≤ A * ∣n∣ + B""0 ≤ A""0 ≤ B"for n using slope_linear_bound[OF rel_x(2)] by blast
obtain C' where y_y'_bound: "∣y z - y' z∣≤ C'"for z using rel_y(3) unfolding slope_def byfastforce
have"bounded (λz. x' (y z) - x' (y' z))" proof (rule boundedI) fix z have"∣x' (y z) - x' (y' z)∣≤∣x' (y z - y' z)∣ + C"using x'_bound[of "y z - y' z""y' z"] by fastforce alsohave"... ≤ A * ∣y z - y' z∣ + B + C"using x'_lin_bound by force alsohave"... ≤ A * C' + B + C"using mult_left_mono[OF y_y'_bound x'_lin_bound(2)] byfastforce finallyshow"∣x' (y z) - x' (y' z)∣≤ A * C' + B + C"by blast qed hence"bounded (λz. x (y z) - x' (y' z))"using bounded_add[OF bounded_comp(1)[OF rel_x(3), of y]] by force thus"(x *e y) ∼e (x' *e y')"unfolding eudoxus_rel_def eudoxus_times_def using rel_x rel_y by simp qed
text‹With the definitions provided above, the Eudoxus reals are a commutative ring with unity.› instance real :: comm_ring_1 proof fix x y z :: real show"x * y * z = x * (y * z)"by (induct x, induct y, induct z) (simp add: eudoxus_times_cong eudoxus_times_def comp_assoc) show"x * y = y * x"by (induct x, induct y) (force simp add: slope_refl eudoxus_times_commute) show"1 * x = x"by (induct x) (simp add: one_real_def eudoxus_times_def) show"(x + y) * z = x * z + y * z"by (induct x, induct y, induct z) (simp add: eudoxus_times_cong eudoxus_plus_cong, simp add: eudoxus_times_def eudoxus_plus_def comp_def) have"¬bounded (λx. x)"by (metis add.inverse_inverse boundedE_strict less_irrefl neg_less_0_iff_less zabs_def) thus"(0 :: real) ≠ (1 :: real)"using abs_real_eq_iff[of id "λ_. 0"] unfolding one_real_def zero_real_def eudoxus_rel_def by simp qed
lemma real_of_nat: "of_nat n = abs_real ((*) (of_nat n))" proof (induction n) case0 thenshow ?caseby (simp add: zero_real_def) next case (Suc n) thenshow ?caseby (simp add: one_real_def distrib_right eudoxus_plus_def) qed
lemma real_of_int: "of_int z = abs_real ((*) z)" proof (induction z rule: int_induct[where ?k=0]) case base thenshow ?caseby (simp add: zero_real_def) next case (step1 i) thenshow ?caseby (simp add: one_real_def distrib_right eudoxus_plus_def) next case (step2 i) thenshow ?caseby (simp add: one_real_def eudoxus_plus_def left_diff_distrib eudoxus_uminus_def) qed
text‹The Eudoxus reals are a ring of characteristic term‹0›.› instance real :: ring_char_0 proof show"inj (λn. of_nat n :: real)" proof (intro inj_onI) fix x y assume"(of_nat x :: real) = of_nat y" hence"((*) (int x)) ∼e ((*) (int y))"unfolding abs_real_eq_iff real_of_nat using slope_scale by blast hence"bounded (λz. (int x - int y) * z)"unfolding eudoxus_rel_def by (simp add: left_diff_distrib) thenobtain C where bound: "∣(int x - int y) * z∣≤ C"and C_nonneg: "0 ≤ C"for z by blast hence"∣int x - int y∣ * ∣C + 1∣≤ C"using abs_mult by metis hence *: "∣int x - int y∣ * (C + 1) ≤ C"using C_nonneg by force thus"x = y"using order_trans[OF mult_right_mono *, of 1] C_nonneg by fastforce qed qed
subsection‹Ordering›
text‹We call a slope positive, if it tends to infinity. Similarly, we call a slope negative if it tends to negative infinity.› instantiation real :: "{ord, abs, sgn}" begin
definition pos :: "(int ==> int) ==> bool"where "pos f = (∀C ≥ 0. ∃N. ∀n ≥ N. f n ≥ C)"
definition neg :: "(int ==> int) ==> bool"where "neg f = (∀C ≥ 0. ∃N. ∀n ≥ N. f n ≤ -C)"
lemma pos_neg_exclusive: "¬ (pos f ∧ neg f)"unfolding neg_def pos_def by (metis int_one_le_iff_zero_less linorder_not_less nle_le uminus_int_code(1) zero_less_one_class.zero_le_one)
lemma pos_iff_neg_uminus: "pos f = neg (-e f)"unfolding neg_def pos_def eudoxus_uminus_def by simp
lemma neg_iff_pos_uminus: "neg f = pos (-e f)"unfolding neg_def pos_def eudoxus_uminus_def by fastforce
lemma pos_iff: assumes"slope f" shows"pos f = infinite (f ` {0..} ∩ {0<..})" (is"?lhs = ?rhs") proof (rule iffI) assume pos: ?lhs
{ fix C assume C_nonneg: "0 ≤ (C :: int)" hence"∃z ≥ 0. (C + 1) ≤ f z"by (metis add_increasing2 nle_le zero_less_one_class.zero_le_one pos pos_def) hence"∃z ≥ 0. C ≤ f z ∧ 0 < f z"using C_nonneg by fastforce hence"∃N≥C. ∃z. N = f z ∧ 0 < f z ∧ 0 ≤ z"by blast
} thus ?rhs by (blast intro!: int_set_infiniteI) next assume infinite: ?rhs thenobtain D where D_bound: "∣f (m + n) - (f m + f n)∣ < D""0 < D"for m n using assms by (fastforce simp: slope_def elim: boundedE_strict)
obtain M where M_bound: "∀m>0. (m + 1) * D ≤ f (m * M)""0 < M"using slope_positive_lower_bound[OF assms infinite] D_bound(2) by blast
define g where"g = (λz. f ((z div M) * M))"
define E where"E = Sup ((abs o f) ` {z. 0 ≤ z ∧ z < M})"
have E_bound: "∣f (z mod M)∣≤ E"for z proof - have"(z mod M) ∈ {z. 0 ≤ z ∧ z < M}"by (simp add: M_bound(2)) hence"∣f (z mod M)∣∈ (abs o f) ` {z. 0 ≤ z ∧ z < M}"by fastforce thus"∣f (z mod M)∣≤ E"unfolding E_def by (simp add: le_cSup_finite) qed hence E_nonneg: "0 ≤ E"by fastforce
have diff_bound: "∣f z - g z∣≤ E + D"for z proof- let ?d = "z div M"and ?r = "z mod M" have z_is: "z = ?d * M + ?r"by presburger hence"∣f z - g z∣ = ∣f (?d * M + ?r) - g (?d * M + ?r)∣"by argo alsohave"... = ∣(f (?d*M + ?r) - (f (?d * M) + f ?r)) + (f (?d * M) + f ?r) - g (?d * M + ?r)∣"by auto alsohave"... = ∣f ?r + (f (?d*M + ?r) - (f (?d * M) + f ?r))∣"unfolding g_def by force alsohave"... ≤∣f ?r∣ + D"using D_bound(1)[of "?d * M""?r"] by linarith alsohave"... ≤ E + D"using E_bound by simp finallyshow"∣f z - g z∣≤ E + D" . qed
{ fix C assume C_nonneg: "0 ≤ (C :: int)"
define n where"n = (E + D + C) div D" hence zero_less_n: "n > 0"using D_bound(2) E_nonneg C_nonneg using pos_imp_zdiv_pos_iff by fastforce
have"E + C < E + D + C - (E + D + C) mod D"using diff_strict_left_mono[OF pos_mod_bound[OF D_bound(2)]] by simp alsohave"... = n * D"unfolding n_def using div_mod_decomp_int[of "E + D + C" D] by algebra finallyhave *: "(n + 1) * D > E + D + C"by (simp add: add.commute distrib_right)
have"C ≤ f m"if"m ≥ n * M"for m proof - let ?d = "m div M"and ?r = "m mod M" have d_pos: "?d > 0"using zero_less_n M_bound that dual_order.trans pos_imp_zdiv_pos_iff by fastforce have n_le_d: "?d ≥ n"using zdiv_mono1 M_bound that by fastforce have"E + D + C < (?d + 1) * D"using D_bound n_le_d by (intro *[THEN order.strict_trans2]) simp alsohave"... ≤ g m"unfolding g_def using M_bound d_pos by blast finallyhave"E + D + C < g m" . hence"∣f m - g m∣ + C < g m"using diff_bound[of m] by fastforce thus ?thesis by fastforce qed hence"∃N. ∀p≥N. C ≤ f p"using add1_zle_eq by blast
} thus ?lhs unfolding pos_def by blast qed
lemma neg_iff: assumes"slope f" shows"neg f = infinite (f ` {0..} ∩ {..<0})" (is"?lhs = ?rhs") proof (rule iffI) assume ?lhs hence"infinite ((- f) ` {0..} ∩ {0<..})"using pos_iff[OF slope_uminus'[OF assms]] unfolding neg_def pos_def by fastforce moreoverhave"inj (uminus :: int ==> int)"by simp moreoverhave"(- f) ` {0..} ∩ {0<..} = uminus ` (f ` {0..} ∩ {..<0})"by fastforce ultimatelyshow ?rhs using finite_imageD by fastforce next assume ?rhs moreoverhave"inj (uminus :: int ==> int)"by simp moreoverhave"f ` {0..} ∩ {..<0} = uminus ` ((- f) ` {0..} ∩ {0<..})"by force ultimatelyhave"infinite ((- f) ` {0..} ∩ {0<..})"using finite_imageD by force thus ?lhs using pos_iff[OF slope_uminus'[OF assms]] unfolding pos_def neg_def by fastforce qed
lemma pos_cong: assumes"f ∼e g" shows"pos f = pos g" proof -
{ fix x y assume asm: "pos x""x ∼e y" fix D assume D: "0 ≤ D""∀N. ∃p≥N. ¬ D ≤ y p" obtain C where bounds: "∀n. ∣x n - y n∣≤ C""0 ≤ C"using asm unfolding eudoxus_rel_def by blast obtain N where"∀p≥N. C + D ≤ x p"using D bounds asm by (fastforce simp add: pos_def) hence"∀p≥N. ∣x p - y p∣ + D ≤ x p"by (metis add.commute add_left_mono bounds(1) dual_order.trans) hence"∀p≥N. D ≤ y p"by force hence False using D by blast
} hence"pos x ==> pos y"if"x ∼e y"for x y using that unfolding pos_def by metis thus ?thesis by (metis assms eudoxus_rel_equivp part_equivp_symp) qed
lemma neg_cong: assumes"f ∼e g" shows"neg f = neg g" proof -
{ fix x y assume asm: "neg x""x ∼e y" fix D assume D: "0 ≤ D""∀N. ∃p≥N. ¬ - D ≥ y p" obtain C where bounds: "∣x n - y n∣≤ C""0 ≤ C"for n using asm unfolding eudoxus_rel_def by blast obtain N where"∀p≥N. - (C + D) ≥ x p"using D bounds asm add_increasing2 unfolding neg_def by meson hence"∀p≥N. - ∣x p - y p∣ - D ≥ x p"using bounds(1)[THEN le_imp_neg_le, THEN diff_right_mono, THEN dual_order.trans] by simp hence"∀p≥N. - D ≥ y p"by force hence False using D by blast
} hence"neg x ==> neg y"if"x ∼e y"for x y using that unfolding neg_def by metis thus ?thesis by (metis assms eudoxus_rel_equivp part_equivp_symp) qed
lemma pos_iff_nonneg_nonzero: assumes"slope f" shows"pos f ⟷ (¬ neg f) ∧ (¬ bounded f)" (is"?lhs ⟷ ?rhs") proof (rule iffI) assume pos: ?lhs thenobtain N where"∀n≥N. f n > 0"unfolding pos_def by (metis int_one_le_iff_zero_less zero_less_one_class.zero_le_one) hence"f (max N m) > 0"for m by simp hence"¬ neg f"unfolding neg_def by (metis add.inverse_neutral dual_order.refl linorder_not_le max.cobounded2) thus ?rhs using pos unfolding pos_def bounded_def bdd_above_def by (metis abs_ge_self dual_order.trans gt_ex imageI iso_tuple_UNIV_I order.strict_iff_not) next assume nonneg_nonzero: ?rhs hence finite: "finite (f ` {0..} ∩ {..<0})"using neg_iff assms by blast moreoverhave unbounded: "infinite (f ` {0..})"using nonneg_nonzero bounded_iff_finite_range slope_finite_range_iff assms by blast ultimatelyhave"infinite (f ` {0..} ∩ {0..})"by (metis Compl_atLeast Diff_Diff_Int Diff_eq Diff_infinite_finite) moreoverhave"f ` {0..} ∩ {0<..} = f ` {0..} ∩ {0..} - {0}"by force ultimatelyshow ?lhs unfolding pos_iff[OF assms] by simp qed
lemma neg_iff_nonpos_nonzero: assumes"slope f" shows"neg f ⟷ (¬ pos f) ∧ (¬ bounded f)" unfolding pos_iff_nonneg_nonzero[OF assms] neg_iff_pos_uminus uminus_apply
eudoxus_uminus_def pos_iff_nonneg_nonzero[OF slope_uminus', OF assms] by (force simp add: bounded_def bdd_above_def)
text‹We define the sign of a slope to be term‹id› if it is positive, term‹-e id› if it is negative and term‹(λ_. 0)› otherwise.› definition eudoxus_sgn :: "(int ==> int) ==> (int ==> int)"where "eudoxus_sgn f = (if pos f then id else if neg f then -e id else (λ_. 0))"
lemma eudoxus_sgn_iff: assumes"slope f" shows"eudoxus_sgn f = (λ_. 0) ⟷ bounded f" "eudoxus_sgn f = id ⟷ pos f" "eudoxus_sgn f = (-e id) ⟷ neg f" using eudoxus_sgn_def neg_one_def one_def zero_def assms neg_iff_nonpos_nonzero pos_iff_nonneg_nonzero by auto
quotient_definition "(sgn :: real ==> real)"is eudoxus_sgn unfolding eudoxus_sgn_def using eudoxus_uminus_cong neg_cong pos_cong slope_one slope_refl by fastforce
lemma sgn_plus: assumes"sgn x = (1 :: real)""sgn y = 1" shows"sgn (x + y) = 1" proof - have pos: "pos (rep_real x)""pos (rep_real y)"using assms sgn_abs_real_one_iff[OF slope_rep_real] by simp+
{ fix C :: int assume C_nonneg: "C ≥ 0" thenobtain N M where"∀n≥N. rep_real x n ≥ C""∀n≥M. rep_real y n ≥ C"using pos unfolding pos_def by presburger hence"∀n≥ max N M. (rep_real x +e rep_real y) n ≥ C"using C_nonneg unfolding eudoxus_plus_def by fastforce hence"∃N. ∀n ≥ N. (rep_real x +e rep_real y) n ≥ C"by blast
} thus ?thesis using pos_def by (simp add: eudoxus_plus_cong plus_real_def) qed
lemma sgn_times: "sgn ((x :: real) * y) = sgn x * sgn y" proof (cases "x = 0 ∨ y = 0") case False have *: "[x ≠ 0; pos (rep_real y)]==> sgn ((x :: real) * y) = sgn x * sgn y"for x y proof (induct x rule: slope_induct, induct y rule: slope_induct) case (slope y x) hence pos_y: "pos y"using pos_cong by blast show ?case proof (cases "pos x") case pos_x: True
{ fix C :: int assume asm: "C ≥ 0" thenobtain N where N: "∀n ≥ N. x n ≥ C"using pos_x unfolding pos_def by blast thenobtain N' where"∀n≥ N'. y n ≥ max 0 N"using pos_y unfolding pos_def by (meson max.cobounded1) hence"∃N'. ∀n≥ N'. x (y n) ≥ C"using N by force
} hence"pos (x *e y)"unfolding pos_def eudoxus_times_def by simp thus ?thesis using pos_x pos_y slope by (simp add: eudoxus_times_def) next case _: False hence neg_x: "neg x"using slope by (metis abs_real_eqI neg_iff_nonpos_nonzero zero_def zero_iff_bounded)
{ fix C :: int assume"C ≥ 0" thenobtain N where N: "∀n ≥ N. x n ≤ - C"using neg_x unfolding neg_def by blast thenobtain N' where"∀n≥ N'. y n ≥ max 0 N"using pos_y unfolding pos_def by (meson max.cobounded1) hence"∃N'. ∀n≥ N'. x (y n) ≤ -C"using N by force
} hence"neg (x *e y)"unfolding neg_def eudoxus_times_def by simp thus ?thesis using neg_x pos_y slope by (simp add: eudoxus_times_def) qed qed moreoverhave"sgn ((x :: real) * y) = sgn x * sgn y"if neg_x: "neg (rep_real x)"andneg_y: "neg (rep_real y)"for x y proof - have pos_uminus_y: "pos (rep_real (- y))"by (metis abs_real_eq_iff eudoxus_uminus_cong map_fun_apply neg_iff_pos_uminus neg_y pos_cong rep_real_abs_real_refl rep_real_iff uminus_real_def) moreoverhave"x ≠ 0"using neg_iff_nonpos_nonzero neg_x zero_iff_bounded' by fastforce ultimatelyhave"sgn (- (x * y)) = - 1"using sgn_neg[OF slope_rep_real neg_x] sgn_pos[OF slope_rep_real pos_uminus_y] * by fastforce hence"pos (rep_real (x * y))"by (metis eudoxus_uminus_cong map_fun_apply pos_iff_neg_uminus sgn_abs_real_neg_one_iff slope_refl slope_rep_real uminus_real_def) thus ?thesis using sgn_neg[OF slope_rep_real] sgn_pos[OF slope_rep_real] neg_x neg_y by simp qed ultimatelyshow ?thesis using False neg_iff_nonpos_nonzero[OF slope_rep_real] zero_iff_bounded' by (cases "pos (rep_real x)" ; cases "pos (rep_real y)") (fastforce simp add: mult.commute)+ qed (force)
lemma sgn_plus': assumes"sgn x = (-1 :: real)""sgn y = -1" shows"sgn (x + y) = -1" using assms sgn_uminus[of x] sgn_uminus[of y] sgn_uminus[of "x + y"] sgn_plus[of "- x""- y"] by (simp add: equation_minus_iff)
lemma pos_dual_def: assumes"slope f" shows"pos f = (∀C ≥ 0. ∃N. ∀n ≤ N. f n ≤ -C)" proof- have"pos f = neg (f *e (-e id))"by (metis abs_real_eq_iff abs_real_times add.inverse_inverse assms eudoxus_times_commute mult_minus1_right neg_one_def sgn_abs_real_neg_one_iff sgn_abs_real_one_iff sgn_uminus slope_neg_one) alsohave"... = (∀C ≥ 0. ∃N. ∀n ≥ N. (f (- n)) ≤ -C)"unfolding neg_def eudoxus_times_def eudoxus_uminus_def by simp alsohave"... = (∀C ≥ 0. ∃N. ∀n ≤ N. f n ≤ -C)"by (metis add.inverse_inverse minus_le_iff) finallyshow ?thesis . qed
lemma neg_dual_def: assumes"slope f" shows"neg f = (∀C ≥ 0. ∃N. ∀n ≤ N. f n ≥ C)" unfolding neg_iff_pos_uminus using assms by (subst pos_dual_def) (auto simp add: eudoxus_uminus_def)
lemma pos_representative: assumes"slope f""pos f" obtains g where"f ∼e g""∧n. n ≥ N ==> g n ≥ C" proof - obtain N' where N': "∀z≥N'. f z ≥ max 0 C"using assms unfolding pos_def by (meson max.cobounded1) have *: "1 = abs_real (λx. x + N' - N)""slope (λx. x + N' - N)"unfolding one_def by (intro abs_real_eqI) (auto simp add: eudoxus_rel_def slope_def intro!: boundedI) hence"abs_real f * 1 = abs_real (f *e (λx. x + N' - N))"using abs_real_times[OF assms(1) *(2)] by simp hence"f ∼e (f *e (λx. x + N' - N))"using assms * by (metis abs_real_eq_iff eudoxus_times_commute mult.right_neutral) moreoverhave"∀z≥N. (f *e (λx. x + N' - N)) z ≥ C"unfolding eudoxus_times_def using N' by simp ultimatelyshow ?thesis using that by blast qed
lemma pos_representative': assumes"slope f""pos f" obtains g where"f ∼e g""∧n. g n ≥ C ==> n ≥ N" proof - obtain N' where"∀z ≤ N'. f z ≤ - (max 0 (- C) + 1)"using assms unfolding pos_dual_def[OF assms(1)] by (metis max.cobounded1 add_increasing2 zero_less_one_class.zero_le_one) hence N': "∀z ≤ N'. f z < min 0 C"by fastforce have *: "1 = abs_real (λx. x + N' - N)""slope (λx. x + N' - N)"unfolding one_def by (intro abs_real_eqI) (auto simp add: eudoxus_rel_def slope_def intro!: boundedI) hence"abs_real f * 1 = abs_real (f *e (λx. x + N' - N))"using abs_real_times[OF assms(1) *(2)] by simp hence"f ∼e (f *e (λx. x + N' - N))"using assms * by (metis abs_real_eq_iff eudoxus_times_commute mult.right_neutral) moreoverhave"∀z<N. (f *e (λx. x + N' - N)) z < C"unfolding eudoxus_times_def using N' by simp ultimatelyshow ?thesis using that by (meson linorder_not_less) qed
lemma neg_representative: assumes"slope f""neg f" obtains g where"f ∼e g""∧n. n ≥ N ==> g n ≤ - C" proof - obtain N' where"∀z≥N'. f z ≤ - max 0 C"using assms unfolding neg_def by (meson max.cobounded1) hence N': "∀z≥N'. f z ≤ min 0 (- C)"by force have *: "1 = abs_real (λx. x + N' - N)""slope (λx. x + N' - N)"unfolding one_def by (intro abs_real_eqI) (auto simp add: eudoxus_rel_def slope_def intro!: boundedI) hence"abs_real f * 1 = abs_real (f *e (λx. x + N' - N))"using abs_real_times[OF assms(1) *(2)] by simp hence"f ∼e (f *e (λx. x + N' - N))"using assms * by (metis abs_real_eq_iff eudoxus_times_commute mult.right_neutral) moreoverhave"∀z≥N. (f *e (λx. x + N' - N)) z ≤ - C"unfolding eudoxus_times_def using N' by simp ultimatelyshow ?thesis using that by blast qed
lemma neg_representative': assumes"slope f""neg f" obtains g where"f ∼e g""∧n. g n ≤ - C ==> n ≥ N" proof - obtain N' where"∀z ≤ N'. f z ≥ max 0 (- C) + 1"using assms unfolding neg_dual_def[OF assms(1)] by (metis max.cobounded1 add_increasing2 zero_less_one_class.zero_le_one) hence N': "∀z ≤ N'. f z > max 0 (- C)"by fastforce have *: "1 = abs_real (λx. x + N' - N)""slope (λx. x + N' - N)"unfolding one_def by (intro abs_real_eqI) (auto simp add: eudoxus_rel_def slope_def intro!: boundedI) hence"abs_real f * 1 = abs_real (f *e (λx. x + N' - N))"using abs_real_times[OF assms(1) *(2)] by simp hence"f ∼e (f *e (λx. x + N' - N))"using assms * by (metis abs_real_eq_iff eudoxus_times_commute mult.right_neutral) moreoverhave"∀z < N. (f *e (λx. x + N' - N)) z > - C"unfolding eudoxus_times_def using N' by simp ultimatelyshow ?thesis using that by (meson linorder_not_less) qed
text‹We call a real term‹x› less than another real term‹y›, if their difference is positive.› definition "x < (y::real) ≡ sgn (y - x) = 1"
definition "x ≤ (y::real) ≡ x < y ∨ x = y"
definition
abs_real: "∣x :: real∣ = (if 0 ≤ x then x else - x)"
instance .. end
instance real :: linorder proof fix x y z :: real show"(x < y) = (x ≤ y ∧¬ y ≤ x)"unfolding less_eq_real_def less_real_def using sgn_times[of "-1""x - y"] by fastforce show"x ≤ x"unfolding less_eq_real_def by blast show"[x ≤ y; y ≤ z]==> x ≤ z"unfolding less_eq_real_def less_real_def using sgn_plus by fastforce show"[x ≤ y; y ≤ x]==> x = y"unfolding less_eq_real_def less_real_def using sgn_times[of "-1""x - y"] by fastforce show"x ≤ y ∨ y ≤ x"unfolding less_eq_real_def less_real_def using sgn_times[of "-1""x - y"] sgn_range by force qed
lemma real_leI: assumes"sgn (y - x) ∈ {0 :: real, 1}" shows"x ≤ y" using assms unfolding less_eq_real_def less_real_def by force
lemma real_lessI: assumes"sgn (y - x) = (1 :: real)" shows"x < y" using assms unfolding less_real_def by blast
lemma abs_real_leI: assumes"slope f""slope g""∧z. z ≥ N ==> f z ≥ g z" shows"abs_real f ≥ abs_real g" proof -
{ assume"abs_real f ≠ abs_real g" hence"abs_real (f +e -e g) ≠ 0"by (metis abs_real_minus assms(1,2) eq_iff_diff_eq_0) hence"¬ bounded (f +e -e g)"by (metis abs_real_eqI zero_def zero_iff_bounded) hence"pos (f +e -e g) ∨ neg (f +e -e g)"using assms eudoxus_plus_cong eudoxus_uminus_cong neg_iff_nonpos_nonzero slope_refl by auto moreover
{ assume"neg (f +e -e g)" thenobtain N' where"(f +e -e g) z ≤ - 1"if"z ≥ N'"for z unfolding neg_def by fastforce hence"f z < g z"if"z ≥ N'"for z using that unfolding eudoxus_plus_def eudoxus_uminus_def by fastforce hence False using assms by (metis linorder_not_less nle_le)
} ultimatelyhave"abs_real f > abs_real g"using assms by (fastforce intro: real_lessI sgn_pos simp add: eudoxus_plus_def eudoxus_uminus_def)
} thus ?thesis unfolding less_eq_real_def by argo qed
lemma abs_real_lessI: assumes"slope f""slope g""∧z. z ≥ N ==> f z ≥ g z""∧C. C ≥ 0 ==>∃z. f z ≥ g z + C" shows"abs_real f > abs_real g" proof -
{ assume"bounded (f +e -e g)" thenobtain C where"∣f z - g z∣≤ C""C ≥ 0"for z unfolding eudoxus_plus_def eudoxus_uminus_def by auto moreoverobtain z where"f z ≥ g z + (C + 1)"using assms(4)[of "C + 1"] calculation by auto ultimatelyhave False by (metis abs_le_D1 add.commute dual_order.trans le_diff_eq linorder_not_less zless_add1_eq)
} moreoverhave"abs_real f ≥ abs_real g"using assms abs_real_leI by blast ultimatelyshow ?thesis by (metis abs_real_minus assms(1,2) eq_iff_diff_eq_0 eudoxus_plus_cong eudoxus_sgn_iff(1) eudoxus_uminus_cong order_le_imp_less_or_eq sgn_abs_real_zero_iff sgn_zero slope_refl) qed
lemma abs_real_lessD: assumes"slope f""slope g""abs_real f > abs_real g" obtains z where"z ≥ N""f z > g z" proof -
{ assume"∃N. ∀z≥N. f z ≤ g z" thenobtain N where"f z ≤ g z"if"z ≥ N"for z by fastforce hence False using assms abs_real_leI by (metis linorder_not_le)
} thus ?thesis using that by fastforce qed
subsection‹Multiplicative Inverse›
text‹We now define the multiplicative inverse. We start by constructing a candidate for positive slopes first and then extend it to the entire domain using the choice function term‹Eps›.› instantiation real :: "{inverse}" begin
definition eudoxus_pos_inverse :: "(int ==> int) ==> (int ==> int)"where "eudoxus_pos_inverse f z = sgn z * Inf ({0..} ∩ {n. f n ≥∣z∣})"
lemma eudoxus_pos_inverse: assumes"slope f""pos f" obtains g where"f ∼e g""slope (eudoxus_pos_inverse g)""eudoxus_pos_inverse g *e f ∼e id" proof - let ?φ = eudoxus_pos_inverse obtain g where g: "f ∼e g""g z ≥ 0 ==> z > 1"for z using pos_representative'[OF assms] by(metis gt_ex order_less_le_trans) hence pos_g: "pos g"using assms pos_cong by blast have slope_g: "slope g"using g unfolding eudoxus_rel_def by simp
have"∃n ≥ 0. g n ≥∣z∣"for z using pos_g unfolding pos_def by (metis abs_ge_self order_less_imp_le zero_less_abs_iff) hence nonempty_φ: "{0..} ∩ {n. ∣z∣≤ g n} ≠ {}"for z by blast have bdd_below_φ: "bdd_below ({0..} ∩ {n. g n ≥∣z∣})"for z by simp have φ_bound: "g n ≥ z ==> ?φ g z ≤ n"if"z ≥ 0""n ≥ 0"for n z unfolding eudoxus_pos_inverse_def using cInf_lower[OF _ bdd_below_φ, of n z] that abs_of_nonneg zsgn_def by simp hence φ_bound': "?φ g z > n ==> g n < z"if"z ≥ 0""n ≥ 0"for z n using that linorder_not_less by blast
have φ_mem: "z > 0 ==> ?φ g z ∈ {0..} ∩ {n. g n ≥∣z∣}"for z unfolding eudoxus_pos_inverse_def using int_Inf_mem[OF nonempty_φ bdd_below_φ, of z] by simp
obtain L where"∣g (1 + (z - 1)) - (g 1 + g (z - 1))∣≤ L"for z using slope_g by fast hence *: "∣g z - (g 1 + g (z - 1))∣≤ L"for z by simp hence L: "g z ≤ g (z - 1) + (L + g 1)"for z using abs_le_D1 *[of z] by linarith
let ?γ = "λm n. (g (m + (- n)) - (g m + g (- n))) - (g (n + (- n)) - (g n + g (- n))) + g 0"
obtain c where c: "∣g (m + (- n)) - (g m + g (- n))∣≤ c"for m n using slope_g by fast obtain c' where c': "∣g (n + (- n)) - (g n + g (- n))∣≤ c'"for n using slope_g by fast have"∣?γ m n∣≤∣g (m + (- n)) - (g m + g (- n))∣ + ∣g (n + (- n)) - (g n + g (- n))∣ + ∣g 0∣"for m n by linarith hence *: "∣?γ m n∣≤ c + c' + ∣g 0∣"for m n using c[of m n] c'[of n] by linarith
define C where"C = 2 * (c + c' + ∣g 0∣)" have"g (m - (n + p)) - (g m - (g n + g p)) = ?γ (m - n) p + ?γ m n"for m n p by (simp add: algebra_simps) hence"∣g (m - (n + p)) - (g m - (g n + g p))∣≤ (c + c' + ∣g 0∣) + (c + c' + ∣g 0∣)"for m n p using *[of "m - n" p] *[of m n] by simp hence *: "∣g (m - (n + p)) - (g m - (g n + g p))∣≤ C"for m n p unfolding C_def by (metis mult_2) have C: "g (m - (n + p)) ≤ g m - (g n + g p) + C""g m - (g n + g p) + (- C) ≤ g (m - (n + p))"for m n p using *[of m n p] abs_le_D1 abs_le_D2 by linarith+
have bounded: "bounded h"if bounded: "bounded (g o h)"for h :: "'a ==> int" proof (rule ccontr) assume asm: "¬ bounded h" obtain C where C: "∣g (h z)∣≤ C""C ≥ 0"for z using bounded by fastforce obtain N where N: "g z ≥ C + 1"if"z ≥ N"for z using C pos_g unfolding pos_def by fastforce obtain N' where N': "g z ≤ - (C + 1)"if"z ≤ N'"for z using C pos_g unfolding pos_dual_def[OF slope_g] by (meson add_increasing2 zero_le_one) obtain z where"∣h z∣ > max ∣N∣∣N'∣"using asm unfolding bounded_alt_def by (meson leI) hence"h z ∈ {..N'} ∪ {N..}"by fastforce hence"g (h z) ∈ {..- (C + 1)} ∪ {C + 1..}"using N N' by blast hence"∣g (h z)∣≥ C + 1"by fastforce thus False using C(1)[of z] by simp qed
define D where"D = max ∣- (C + (L + g 1) + (L + g 1))∣∣C + L + g 1∣"
{ fix m n :: int assume asm: "m > 0""n > 0"
have"g (?φ g m) ≥ m"using φ_mem asm by simp moreoverhave"?φ g m > 1"using calculation g asm by simp moreoverhave"m > g (?φ g m - 1)"using asm calculation by (intro φ_bound') auto ultimatelyhave m: "m ∈ {g (?φ g m - 1)<..g (?φ g m)}"by simp
have"g (?φ g n) ≥ n"using φ_mem asm by simp moreoverhave"?φ g n > 1"using calculation g asm by simp moreoverhave"n > g (?φ g n - 1)"using asm calculation by (intro φ_bound') auto ultimatelyhave n: "n ∈ {g (?φ g n - 1)<..g (?φ g n)}"by simp
have"g (?φ g (m + n)) ≥ m + n"using φ_mem asm by simp moreoverhave"?φ g (m + n) > 1"using calculation g asm by simp moreoverhave"(m + n) > g (?φ g (m + n) - 1)"using asm calculation by (intro φ_bound') auto ultimatelyhave m_n: "m + n ∈ {g (?φ g (m + n) - 1)<..g (?φ g (m + n))}"by simp
have *: "g (?φ g (m + n)) - (g (?φ g m - 1) + g (?φ g n - 1)) > 0""g (?φ g (m + n) - 1) - (g (?φ g m) + g (?φ g n)) < 0"using m_n m n by simp+
have"g (?φ g (m + n) - (?φ g m + ?φ g n)) ≤ g (?φ g (m + n)) - (g (?φ g m) + g (?φ g n)) + C"using C by blast alsohave"... ≤ g (?φ g (m + n) - 1) - g (?φ g m) - g (?φ g n) + (C + L + g 1)"usingL by fastforce finallyhave upper: "g (?φ g (m + n) - (?φ g m + ?φ g n)) ≤ C + L + g 1"using * by fastforce
have"- (C + (L + g 1) + (L + g 1)) ≤ g (?φ g (m + n)) - g (?φ g m - 1) - g (?φ g n - 1) - (C + (L + g 1) + (L + g 1))"using * by linarith alsohave"... ≤ g (?φ g (m + n)) - (g (?φ g m) + g (?φ g n)) + (- C)"using L[THEN le_imp_neg_le, of "?φ g m"] L[THEN le_imp_neg_le, of "?φ g n"] by linarith alsohave"... ≤ g (?φ g (m + n) - (?φ g m + ?φ g n))"using C by blast finallyhave lower: "- (C + (L + g 1) + (L + g 1)) ≤ g (?φ g (m + n) - (?φ g m + ?φ g n))" .
have"∣g (?φ g (m + n) - (?φ g m + ?φ g n))∣≤ D"using upper lower unfolding D_def by simp
} hence"bounded (g o (λ(m, n). ?φ g (m + n) - (?φ g m + ?φ g n)) o (λ(m, n). (max 1 m, max 1 n)))"by (intro boundedI[of _ D]) auto hence"bounded ((λ(m, n). ?φ g (m + n) - (?φ g m + ?φ g n)) o (λ(m, n). (max 1 m, max 1 n)))"by (metis (mono_tags, lifting) bounded comp_assoc) thenobtain C where"∣((λ(m, n). ?φ g (m + n) - (?φ g m + ?φ g n)) o (λ(m, n). (max 1 m, max 1 n))) (m, n)∣≤ C"for m n by blast hence"∣?φ g (m + n) - (?φ g m + ?φ g n)∣≤ C"if"m ≥ 1""n ≥ 1"for m n using that[THEN max_absorb2] by (metis (no_types, lifting) comp_apply prod.case) hence slope: "slope (?φ g)"by (intro slope_odd[of _ C]) (auto simp add: eudoxus_pos_inverse_def) moreover
{ obtain C where C: "∣g ((?φ g n - 1) + 1) - (g (?φ g n - 1) + g 1)∣≤ C"for n using slope_g by fast have C_bound: "g (?φ g n - 1) ≥ g (?φ g n) - (∣g 1∣ + C)"for n using C[of n] by fastforce
{ fix n :: int assume asm: "n > 0" have upper: "g (?φ g n) ≥ n"using φ_mem asm by simp moreoverhave"?φ g n > 1"using calculation g asm by simp moreoverhave"n > g (?φ g n - 1)"using calculation asm by (intro φ_bound') auto moreoverhave"n ≥ g (?φ g n) - (∣g 1∣ + C)"using calculation C_bound[of n] by force ultimatelyhave"∣g (?φ g n) - n∣≤∣g 1∣ + C"by simp
} hence id: "g *e ?φ g ∼e id"using slope_g slope by (intro eudoxus_relI[of _ _ 1"∣g 1∣ + C"]) (auto simp add: eudoxus_times_def)
} ultimatelyshow ?thesis using g that eudoxus_rel_trans eudoxus_times_cong slope_reflI eudoxus_times_commute[OF slope slope_g] by metis qed
definition eudoxus_inverse :: "(int ==> int) ==> (int ==> int)"where "eudoxus_inverse f = (if ¬ bounded f then SOME g. slope g ∧ (g *e f) ∼e id else (λ_. 0))"
lemma assumes"slope f" shows slope_eudoxus_inverse: "slope (eudoxus_inverse f)" (is"?slope") and
eudoxus_inverse_id: "¬ bounded f ==> eudoxus_inverse f *e f ∼e id" (is"¬ bounded f==> ?id") proof - have *: "[slope g; (g *e f) ∼e id]==> ?slope""[slope g; (g *e f) ∼e id; ¬ bounded f]==> ?id"for g unfolding eudoxus_inverse_def using someI[where ?P="λg. slope g ∧ (g *e f) ∼e id"] by auto
{ assume pos: "pos f" thenobtain g where"slope (eudoxus_pos_inverse g)""eudoxus_pos_inverse g *e f ∼e id"using eudoxus_pos_inverse[OF assms] by blast hence ?slope "¬ bounded f ==> ?id"using pos pos_iff_nonneg_nonzero[OF assms] * by blast+
} moreover
{ assume nonpos: "¬ pos f"
{ assume nonzero: "¬ bounded f" hence uminus_f: "slope (-e f)""pos (-e f)"using neg_iff_pos_uminus neg_iff_nonpos_nonzero assms slope_refl nonpos by auto thenobtain g where g: "slope (eudoxus_pos_inverse g)""eudoxus_pos_inverse g *e (-e f) ∼e id"using eudoxus_pos_inverse by metis hence"-e (eudoxus_pos_inverse g) *e f ∼e id"by (metis (full_types) uminus_f(1) abs_real_eq_iff abs_real_times abs_real_uminus assms(1) eudoxus_times_commute minus_mult_commute rel_funE uminus_real.rsp) moreoverhave"slope (-e (eudoxus_pos_inverse g))"using uminus_f eudoxus_uminus_cong slope_refl g by presburger ultimatelyhave ?slope ?id using * nonzero by blast+
} moreoverhave"bounded f ==> ?slope"unfolding eudoxus_inverse_def by simp ultimatelyhave ?slope "¬ bounded f ==> ?id"by blast+
} ultimatelyshow ?slope "¬ bounded f ==> ?id"by blast+ qed
quotient_definition "(inverse :: real ==> real)"is eudoxus_inverse proof - fix x x' assume asm: "x ∼e x'" hence slopes: "slope x""slope x'"unfolding eudoxus_rel_def by blast+ show"eudoxus_inverse x ∼e eudoxus_inverse x'" proof (cases "bounded x") case True hence"bounded x'"by (meson asm eudoxus_rel_sym eudoxus_rel_trans zero_iff_bounded) thenshow ?thesis unfolding eudoxus_inverse_def using True slope_zero slope_refl by auto next case False hence"¬ bounded x'"by (meson asm eudoxus_rel_sym eudoxus_rel_trans zero_iff_bounded) hence inverses: "eudoxus_inverse x *e x ∼e id""eudoxus_inverse x' *e x' ∼e id"using slopes eudoxus_inverse_id False by blast+
have alt_inverse: "eudoxus_inverse x *e x' ∼e id" using inverses eudoxus_times_cong[OF slope_reflI, OF slope_eudoxus_inverse asm, OF slopes(1)]
eudoxus_rel_sym eudoxus_rel_trans by blast
have"eudoxus_inverse x ∼e eudoxus_inverse x *e (eudoxus_inverse x' *e x')" using eudoxus_times_cong[OF slope_reflI, OF slope_eudoxus_inverse inverses(2)[THEN eudoxus_rel_sym], OF slopes(1)] by (simp add: eudoxus_times_def) alsohave"... ∼e eudoxus_inverse x' *e (eudoxus_inverse x *e x')" using eudoxus_times_commute[OF slope_eudoxus_inverse(1,1), OF slopes, THEN eudoxus_times_cong, OF slope_reflI, OF slopes(2)] by (simp add: eudoxus_times_def comp_assoc) alsohave"... ∼e eudoxus_inverse x' *e id"using alt_inverse eudoxus_times_cong[OF slope_reflI] slope_eudoxus_inverse slopes by blast alsohave"... = eudoxus_inverse x'"unfolding eudoxus_times_def by simp finallyshow ?thesis . qed qed
lemma eudoxus_inverse_abs[simp]: assumes"slope f""¬ bounded f" shows"inverse (abs_real f) * abs_real f = 1" unfolding inverse_real_def using eudoxus_inverse_id[OF assms] by (metis abs_real_eqI abs_real_times assms(1) eudoxus_inverse_cong map_fun_apply one_def rep_real_abs_real_refl slope_refl)
text‹The Eudoxus reals are a field, with inverses defined as above.› instance real :: field proof fix x y :: real show"x ≠ 0 ==> inverse x * x = 1"using eudoxus_sgn_iff(1) sgn_abs_real_zero_iff by (induct x rule: slope_induct) force show"x / y = x * inverse y"unfolding divide_real_def by simp show"inverse (0 :: real) = 0"unfolding inverse_real_def eudoxus_inverse_def using zero_def zero_iff_bounded' by auto qed
instantiation real :: distrib_lattice begin
definition "(inf :: real ==> real ==> real) = min"
definition "(sup :: real ==> real ==> real) = max"
instanceby standard (auto simp: inf_real_def sup_real_def max_min_distrib2)
end
text‹The ordering on the Eudoxus reals is linear.› instance real :: linordered_field proof fix x y z :: real show"z + x ≤ z + y"if"x ≤ y" proof (cases "x = y") case False hence"x < y"using that by simp thus ?thesis proof (induct x rule: slope_induct, induct y rule: slope_induct, induct z rule: slope_induct) case (slope h g f) hence"pos (g +e (-e f))"unfolding less_real_def using sgn_abs_real_one_iff by (force simp add: eudoxus_plus_def eudoxus_uminus_def) thus ?caseby (metis slope(4) less_real_def add_diff_cancel_left nless_le) qed qed (force)
show"∣x∣ = (if x < 0 then -x else x)"by (metis abs_real less_eq_real_def not_less_iff_gr_or_eq) show"sgn x = (if x = 0 then 0 else if 0 < x then 1 else - 1)"using sgn_range sgn_zero_iff by (auto simp: less_real_def) show"[x < y; 0 < z]==> z * x < z * y"by (metis (no_types, lifting) diff_zero less_real_def mult.right_neutral right_diff_distrib' sgn_times) qed
text‹The Eudoxus reals fulfill the Archimedean property.› instance real :: archimedean_field proof fix x :: real show"∃z. x ≤ of_int z" proof (induct x rule: slope_induct) case (slope y) thenobtain A B where linear_bound: "∣y z∣≤ A * ∣z∣ + B""0 ≤ A""0 ≤ B"for z using slope_linear_bound by blast
{ fix C assume C_nonneg: "0 ≤ (C :: int)"
{ fix z assume asm: "z ≥ B + C" have"y z + C ≤ A * ∣z∣ + B + C"using abs_le_D1 linear_bound by auto alsohave"... ≤ (A + 1) * ∣z∣"using C_nonneg linear_bound(2,3) asm by (auto simp: distrib_right) finallyhave"y z + C ≤ (A + 1) * z"using add_nonneg_nonneg[OF C_nonneg linear_bound(3)] abs_of_nonneg[of z] asm by linarith
} hence"∃N. ∀x ≥ N. (((*) (A + 1)) +e -e y) x ≥ C"unfolding eudoxus_plus_def eudoxus_uminus_def by fastforce
} hence"pos (((*) (A + 1)) +e -e y)"unfolding pos_def by blast hence"pos (rep_real (of_int (A + 1) - abs_real y))"unfolding real_of_int using slope by (simp, subst pos_cong[OF rep_real_abs_real_refl]) (auto simp add: eudoxus_plus_def eudoxus_uminus_def) hence"abs_real y < of_int (A + 1)"unfolding less_real_def by (metis sgn_pos rep_real_abs_real_refl rep_real_iff slope_rep_real) thus ?caseunfolding less_eq_real_def by blast qed qed
subsection‹Completeness›
text‹To show that the Eudoxus reals are complete, we first introduce the floor function.› instantiation real :: floor_ceiling begin
definition "(floor :: (real ==> int)) = (λx. (SOME z. of_int z ≤ x ∧ x < of_int z + 1))"
instance proof fix x :: real show"of_int ⌊x⌋≤ x ∧ x < of_int (⌊x⌋ + 1)"using someI[of "λz. of_int z ≤ x ∧ x < of_int z + 1"] floor_exists by (fastforce simp add: floor_real_def) qed end
lemma eudoxus_dense_rational: fixes x y :: real assumes"x < y" obtains m n where"x < (of_int m / of_int n)""(of_int m / of_int n) < y""n > 0" proof - obtain n :: int where n: "inverse (y - x) < of_int n""n > 0"by (metis ex_less_of_int antisym_conv3 dual_order.strict_trans of_int_less_iff) hence *: "inverse (of_int n) < y - x"by (metis assms diff_gt_0_iff_gt inverse_inverse_eq inverse_less_iff_less inverse_positive_iff_positive of_int_0_less_iff)
define m where"m = floor (x * of_int n) + 1"
{ assume"y ≤ of_int m / of_int n" hence"inverse (of_int n) < of_int m / of_int n - x"using * by linarith hence"x < (of_int m - 1) / of_int n"by (simp add: diff_divide_distrib inverse_eq_divide) hence False unfolding m_def using n(2) divide_le_eq linorder_not_less by fastforce
} moreoverhave"x < of_int m / of_int n"unfolding m_def by (meson n(2) floor_correct mult_imp_less_div_pos of_int_pos) ultimatelyshow ?thesis using that n by fastforce qed
text‹The Eudoxus reals are a complete field.› lemma eudoxus_complete: assumes"S ≠ {}""bdd_above S" obtains u :: real where"∧s. s ∈ S ==> s ≤ u""∧y. (∧s. s ∈ S ==> s ≤ y) ==> u ≤ y" proof (cases "∃u ∈ S. ∀s ∈ S. s ≤ u") case False hence no_greatest_element: "∃y ∈ S. x < y"if"x ∈ S"for x using that by force
define u :: "int ==> int"where"u = (λz. sgn z * Sup ((λx. ⌊of_int ∣z∣ * x⌋) ` S))"
have bdd_above_u: "bdd_above ((λx. ⌊of_int ∣z∣ * x⌋) ` S)"for z by (intro bdd_above_image_mono[OF _ assms(2)] monoI) (simp add: floor_mono mult.commute mult_right_mono)
have u_Sup_nonneg: "z ≥ 0 ==>⌊of_int z * s⌋≤ u z"and
u_Sup_nonpos: "z ≤ 0 ==> - ⌊of_int (- z) * s⌋≥ u z"if"s ∈ S"for s z unfolding u_def using cSup_upper[OF _ bdd_above_u, of "⌊of_int ∣z∣ * s⌋" z] that abs_of_nonpos zsgn_def by force+
have u_mem: "u z ∈ (λx. sgn z * ⌊of_int ∣z∣ * x⌋) ` S"for z unfolding u_def using int_Sup_mem[OF _ bdd_above_u, of z] assms by auto
have slope: "slope u" proof -
{ fix m n :: int assume asm: "m > 0""n > 0" obtain x_m where x_m: "x_m ∈ S""u m = ⌊of_int m * x_m⌋"using u_mem[of m] asm zsgn_def by auto obtain x_n where x_n: "x_n ∈ S""u n = ⌊of_int n * x_n⌋"using u_mem[of n] asm zsgn_def by auto obtain x_m_n where x_m_n: "x_m_n ∈ S""u (m + n) = ⌊of_int (m + n) * x_m_n⌋"using u_mem[of "m + n"] asm zsgn_def by auto
define x where"x = max (max x_m x_n) x_m_n" have x: "x ∈ S"unfolding x_def using x_m x_n x_m_n by linarith
have"x ≥ x_m""x ≥ x_n""x ≥ x_m_n"unfolding x_def by linarith+ hence"u m ≤⌊of_int m * x⌋""u n ≤⌊of_int n * x⌋""u (m + n) ≤⌊of_int (m + n) * x⌋" unfolding x_m x_n x_m_n by (meson asm floor_less_cancel linorder_not_less mult_le_cancel_left_pos of_int_0_less_iff add_pos_pos)+ hence"u m = ⌊of_int m * x⌋""u n = ⌊of_int n * x⌋""u (m + n) = ⌊of_int m * x + of_int n * x⌋" using u_Sup_nonneg[OF x(1), of m] u_Sup_nonneg[OF x(1), of n] u_Sup_nonneg[OF x(1), of "m + n"] asm add_pos_pos[OF asm] by (force simp add: distrib_right)+ moreover
{ fix a b :: real have"a - of_int ⌊a⌋∈ {0..<1}"using floor_less_one by fastforce moreoverhave"b - of_int ⌊b⌋∈ {0..<1}"using floor_less_one by fastforce ultimatelyhave"(a - of_int ⌊a⌋) + (b - of_int ⌊b⌋) ∈ {0..<2}"unfolding atLeastLessThan_def by simp hence"(a + b) - (of_int ⌊a⌋ + of_int ⌊b⌋) ∈ {0..<2}"by (simp add: diff_add_eq) hence"⌊a + b - (of_int ⌊a⌋ + of_int ⌊b⌋)⌋∈ {0..<2}"by simp hence"⌊a + b⌋ - (⌊a⌋ + ⌊b⌋) ∈ {0..<2}"by (metis floor_diff_of_int of_int_add)
} ultimatelyhave"∣u (m + n) - (u m + u n)∣≤ 2"by (metis abs_of_nonneg atLeastLessThan_iff nless_le)
} moreoverhave"u z = - u (- z)"for z unfolding u_def by simp ultimatelyshow ?thesis using slope_odd by blast qed
{ fix s assume"s ∈ S" thenobtain y where y: "s < y""y ∈ S"using no_greatest_element by blast thenobtain m n :: int where *: "s < (of_int m / of_int n)""(of_int m / of_int n) < y""n > 0"using eudoxus_dense_rational by blast hence n_nonneg: "n ≥ 0"by simp
{ fix z :: int assume z_nonneg: "z ≥ 0" have"z * m = ⌊of_int (z * n) * (of_int m / of_int n) :: real⌋"using *(3) by simp (auto simp only: of_int_mult[symmetric] floor_of_int) alsohave"... ≤⌊of_int (z * n) * y⌋"using *(2) by (meson floor_mono mult_left_mono n_nonneg nless_le of_int_nonneg z_nonneg zero_le_mult_iff) alsohave"... ≤ u (z * n)"using u_Sup_nonneg[OF y(2)] mult_nonneg_nonneg[OF z_nonneg n_nonneg] by blast finallyhave"u (z * n) ≥ z * m" .
} hence"abs_real (u *e (*) n) ≥ of_int m"using slope unfolding real_of_int eudoxus_times_def by (intro abs_real_leI[where ?N=0]) (auto simp add: mult.commute) moreoverhave"abs_real u * of_int n = abs_real (u *e (*) n)"unfolding real_of_int using slope by (simp add: eudoxus_times_def comp_def) ultimatelyhave"s ≤ abs_real u"using * by (metis leI mult_imp_div_pos_le of_int_0_less_iff order_le_less_trans order_less_asym)
} moreover
{ fix y assume asm: "s ≤ y"if"s ∈ S"for s assume"abs_real u > y" thenobtain m n :: int where *: "y < (of_int m / of_int n)""(of_int m / of_int n) < abs_real u""n > 0"using eudoxus_dense_rational by blast hence"of_int m < abs_real u * of_int n"by (simp add: pos_divide_less_eq) hence"of_int m < abs_real (u *e (*) n)"unfolding real_of_int using slope by (simp add: eudoxus_times_def comp_def) moreoverhave"slope (u *e (*) n)"using slope by (simp add: eudoxus_times_def) ultimatelyobtain z where z: "(u *e (*) n) z > m * z""z ≥ 1"unfolding real_of_int usingabs_real_lessD by blast hence **: "u (n * z) > m * z"by (simp add: eudoxus_times_def comp_def)
obtain x where x: "x ∈ S""u (n * z) = ⌊of_int (n * z) * x⌋"using u_mem[of "n * z"] zsgn_def[of "n * z"] mult_pos_pos[OF *(3), of z] z(2) by fastforce
have"of_int (n * z) * x ≤ of_int z * of_int n * y"using asm[OF x(1)] using * z by auto alsohave"... < of_int z * of_int m"using * z by (simp add: mult.commute pos_less_divide_eq) finallyhave"of_int (n * z) * x < of_int (m * z)"by (simp add: mult.commute) hence False using ** by (metis floor_less_iff less_le_not_le x(2))
} ultimatelyshow ?thesis using that by force qed blast
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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 und die Messung sind noch experimentell.