diff options
Diffstat (limited to 'theories/Reals/Ranalysis1.v')
-rw-r--r-- | theories/Reals/Ranalysis1.v | 2343 |
1 files changed, 1208 insertions, 1135 deletions
diff --git a/theories/Reals/Ranalysis1.v b/theories/Reals/Ranalysis1.v index 0148d0a2..93a66e70 100644 --- a/theories/Reals/Ranalysis1.v +++ b/theories/Reals/Ranalysis1.v @@ -6,7 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -(*i $Id: Ranalysis1.v 9042 2006-07-11 22:06:48Z herbelin $ i*) +(*i $Id: Ranalysis1.v 9245 2006-10-17 12:53:34Z notin $ i*) Require Import Rbase. Require Import Rfunctions. @@ -15,7 +15,7 @@ Require Export Rderiv. Open Local Scope R_scope. Implicit Type f : R -> R. (****************************************************) -(** Basic operations on functions *) +(** * Basic operations on functions *) (****************************************************) Definition plus_fct f1 f2 (x:R) : R := f1 x + f2 x. Definition opp_fct f (x:R) : R := - f x. @@ -52,14 +52,14 @@ Definition fct_cte (a x:R) : R := a. Definition id (x:R) := x. (****************************************************) -(** Variations of functions *) +(** * Variations of functions *) (****************************************************) Definition increasing f : Prop := forall x y:R, x <= y -> f x <= f y. Definition decreasing f : Prop := forall x y:R, x <= y -> f y <= f x. Definition strict_increasing f : Prop := forall x y:R, x < y -> f x < f y. Definition strict_decreasing f : Prop := forall x y:R, x < y -> f y < f x. Definition constant f : Prop := forall x y:R, f x = f y. - + (**********) Definition no_cond (x:R) : Prop := True. @@ -68,7 +68,7 @@ Definition constant_D_eq f (D:R -> Prop) (c:R) : Prop := forall x:R, D x -> f x = c. (***************************************************) -(** Definition of continuity as a limit *) +(** * Definition of continuity as a limit *) (***************************************************) (**********) @@ -80,173 +80,192 @@ Arguments Scope continuity [Rfun_scope]. (**********) Lemma continuity_pt_plus : - forall f1 f2 (x0:R), - continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 + f2) x0. -unfold continuity_pt, plus_fct in |- *; unfold continue_in in |- *; intros; - apply limit_plus; assumption. + forall f1 f2 (x0:R), + continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 + f2) x0. +Proof. + unfold continuity_pt, plus_fct in |- *; unfold continue_in in |- *; intros; + apply limit_plus; assumption. Qed. Lemma continuity_pt_opp : - forall f (x0:R), continuity_pt f x0 -> continuity_pt (- f) x0. -unfold continuity_pt, opp_fct in |- *; unfold continue_in in |- *; intros; - apply limit_Ropp; assumption. + forall f (x0:R), continuity_pt f x0 -> continuity_pt (- f) x0. +Proof. + unfold continuity_pt, opp_fct in |- *; unfold continue_in in |- *; intros; + apply limit_Ropp; assumption. Qed. - + Lemma continuity_pt_minus : - forall f1 f2 (x0:R), - continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 - f2) x0. -unfold continuity_pt, minus_fct in |- *; unfold continue_in in |- *; intros; - apply limit_minus; assumption. + forall f1 f2 (x0:R), + continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 - f2) x0. +Proof. + unfold continuity_pt, minus_fct in |- *; unfold continue_in in |- *; intros; + apply limit_minus; assumption. Qed. Lemma continuity_pt_mult : - forall f1 f2 (x0:R), - continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 * f2) x0. -unfold continuity_pt, mult_fct in |- *; unfold continue_in in |- *; intros; - apply limit_mul; assumption. + forall f1 f2 (x0:R), + continuity_pt f1 x0 -> continuity_pt f2 x0 -> continuity_pt (f1 * f2) x0. +Proof. + unfold continuity_pt, mult_fct in |- *; unfold continue_in in |- *; intros; + apply limit_mul; assumption. Qed. Lemma continuity_pt_const : forall f (x0:R), constant f -> continuity_pt f x0. -unfold constant, continuity_pt in |- *; unfold continue_in in |- *; - unfold limit1_in in |- *; unfold limit_in in |- *; - intros; exists 1; split; - [ apply Rlt_0_1 - | intros; generalize (H x x0); intro; rewrite H2; simpl in |- *; - rewrite R_dist_eq; assumption ]. +Proof. + unfold constant, continuity_pt in |- *; unfold continue_in in |- *; + unfold limit1_in in |- *; unfold limit_in in |- *; + intros; exists 1; split; + [ apply Rlt_0_1 + | intros; generalize (H x x0); intro; rewrite H2; simpl in |- *; + rewrite R_dist_eq; assumption ]. Qed. Lemma continuity_pt_scal : - forall f (a x0:R), - continuity_pt f x0 -> continuity_pt (mult_real_fct a f) x0. -unfold continuity_pt, mult_real_fct in |- *; unfold continue_in in |- *; - intros; apply (limit_mul (fun x:R => a) f (D_x no_cond x0) a (f x0) x0). -unfold limit1_in in |- *; unfold limit_in in |- *; intros; exists 1; split. -apply Rlt_0_1. -intros; rewrite R_dist_eq; assumption. -assumption. + forall f (a x0:R), + continuity_pt f x0 -> continuity_pt (mult_real_fct a f) x0. +Proof. + unfold continuity_pt, mult_real_fct in |- *; unfold continue_in in |- *; + intros; apply (limit_mul (fun x:R => a) f (D_x no_cond x0) a (f x0) x0). + unfold limit1_in in |- *; unfold limit_in in |- *; intros; exists 1; split. + apply Rlt_0_1. + intros; rewrite R_dist_eq; assumption. + assumption. Qed. Lemma continuity_pt_inv : - forall f (x0:R), continuity_pt f x0 -> f x0 <> 0 -> continuity_pt (/ f) x0. -intros. -replace (/ f)%F with (fun x:R => / f x). -unfold continuity_pt in |- *; unfold continue_in in |- *; intros; - apply limit_inv; assumption. -unfold inv_fct in |- *; reflexivity. -Qed. - + forall f (x0:R), continuity_pt f x0 -> f x0 <> 0 -> continuity_pt (/ f) x0. +Proof. + intros. + replace (/ f)%F with (fun x:R => / f x). + unfold continuity_pt in |- *; unfold continue_in in |- *; intros; + apply limit_inv; assumption. + unfold inv_fct in |- *; reflexivity. +Qed. + Lemma div_eq_inv : forall f1 f2, (f1 / f2)%F = (f1 * / f2)%F. -intros; reflexivity. +Proof. + intros; reflexivity. Qed. - + Lemma continuity_pt_div : - forall f1 f2 (x0:R), - continuity_pt f1 x0 -> - continuity_pt f2 x0 -> f2 x0 <> 0 -> continuity_pt (f1 / f2) x0. -intros; rewrite (div_eq_inv f1 f2); apply continuity_pt_mult; - [ assumption | apply continuity_pt_inv; assumption ]. + forall f1 f2 (x0:R), + continuity_pt f1 x0 -> + continuity_pt f2 x0 -> f2 x0 <> 0 -> continuity_pt (f1 / f2) x0. +Proof. + intros; rewrite (div_eq_inv f1 f2); apply continuity_pt_mult; + [ assumption | apply continuity_pt_inv; assumption ]. Qed. Lemma continuity_pt_comp : - forall f1 f2 (x:R), - continuity_pt f1 x -> continuity_pt f2 (f1 x) -> continuity_pt (f2 o f1) x. -unfold continuity_pt in |- *; unfold continue_in in |- *; intros; - unfold comp in |- *. -cut - (limit1_in (fun x0:R => f2 (f1 x0)) - (Dgf (D_x no_cond x) (D_x no_cond (f1 x)) f1) ( - f2 (f1 x)) x -> - limit1_in (fun x0:R => f2 (f1 x0)) (D_x no_cond x) (f2 (f1 x)) x). -intro; apply H1. -eapply limit_comp. -apply H. -apply H0. -unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -assert (H3 := H1 eps H2). -elim H3; intros. -exists x0. -split. -elim H4; intros; assumption. -intros; case (Req_dec (f1 x) (f1 x1)); intro. -rewrite H6; unfold Rminus in |- *; rewrite Rplus_opp_r; rewrite Rabs_R0; - assumption. -elim H4; intros; apply H8. -split. -unfold Dgf, D_x, no_cond in |- *. -split. -split. -trivial. -elim H5; unfold D_x, no_cond in |- *; intros. -elim H9; intros; assumption. -split. -trivial. -assumption. -elim H5; intros; assumption. + forall f1 f2 (x:R), + continuity_pt f1 x -> continuity_pt f2 (f1 x) -> continuity_pt (f2 o f1) x. +Proof. + unfold continuity_pt in |- *; unfold continue_in in |- *; intros; + unfold comp in |- *. + cut + (limit1_in (fun x0:R => f2 (f1 x0)) + (Dgf (D_x no_cond x) (D_x no_cond (f1 x)) f1) ( + f2 (f1 x)) x -> + limit1_in (fun x0:R => f2 (f1 x0)) (D_x no_cond x) (f2 (f1 x)) x). + intro; apply H1. + eapply limit_comp. + apply H. + apply H0. + unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + assert (H3 := H1 eps H2). + elim H3; intros. + exists x0. + split. + elim H4; intros; assumption. + intros; case (Req_dec (f1 x) (f1 x1)); intro. + rewrite H6; unfold Rminus in |- *; rewrite Rplus_opp_r; rewrite Rabs_R0; + assumption. + elim H4; intros; apply H8. + split. + unfold Dgf, D_x, no_cond in |- *. + split. + split. + trivial. + elim H5; unfold D_x, no_cond in |- *; intros. + elim H9; intros; assumption. + split. + trivial. + assumption. + elim H5; intros; assumption. Qed. (**********) Lemma continuity_plus : - forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 + f2). -unfold continuity in |- *; intros; - apply (continuity_pt_plus f1 f2 x (H x) (H0 x)). + forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 + f2). +Proof. + unfold continuity in |- *; intros; + apply (continuity_pt_plus f1 f2 x (H x) (H0 x)). Qed. Lemma continuity_opp : forall f, continuity f -> continuity (- f). -unfold continuity in |- *; intros; apply (continuity_pt_opp f x (H x)). +Proof. + unfold continuity in |- *; intros; apply (continuity_pt_opp f x (H x)). Qed. Lemma continuity_minus : - forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 - f2). -unfold continuity in |- *; intros; - apply (continuity_pt_minus f1 f2 x (H x) (H0 x)). + forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 - f2). +Proof. + unfold continuity in |- *; intros; + apply (continuity_pt_minus f1 f2 x (H x) (H0 x)). Qed. - + Lemma continuity_mult : - forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 * f2). -unfold continuity in |- *; intros; - apply (continuity_pt_mult f1 f2 x (H x) (H0 x)). + forall f1 f2, continuity f1 -> continuity f2 -> continuity (f1 * f2). +Proof. + unfold continuity in |- *; intros; + apply (continuity_pt_mult f1 f2 x (H x) (H0 x)). Qed. Lemma continuity_const : forall f, constant f -> continuity f. -unfold continuity in |- *; intros; apply (continuity_pt_const f x H). +Proof. + unfold continuity in |- *; intros; apply (continuity_pt_const f x H). Qed. Lemma continuity_scal : - forall f (a:R), continuity f -> continuity (mult_real_fct a f). -unfold continuity in |- *; intros; apply (continuity_pt_scal f a x (H x)). + forall f (a:R), continuity f -> continuity (mult_real_fct a f). +Proof. + unfold continuity in |- *; intros; apply (continuity_pt_scal f a x (H x)). Qed. - + Lemma continuity_inv : - forall f, continuity f -> (forall x:R, f x <> 0) -> continuity (/ f). -unfold continuity in |- *; intros; apply (continuity_pt_inv f x (H x) (H0 x)). + forall f, continuity f -> (forall x:R, f x <> 0) -> continuity (/ f). +Proof. + unfold continuity in |- *; intros; apply (continuity_pt_inv f x (H x) (H0 x)). Qed. Lemma continuity_div : - forall f1 f2, - continuity f1 -> - continuity f2 -> (forall x:R, f2 x <> 0) -> continuity (f1 / f2). -unfold continuity in |- *; intros; - apply (continuity_pt_div f1 f2 x (H x) (H0 x) (H1 x)). + forall f1 f2, + continuity f1 -> + continuity f2 -> (forall x:R, f2 x <> 0) -> continuity (f1 / f2). +Proof. + unfold continuity in |- *; intros; + apply (continuity_pt_div f1 f2 x (H x) (H0 x) (H1 x)). Qed. - + Lemma continuity_comp : - forall f1 f2, continuity f1 -> continuity f2 -> continuity (f2 o f1). -unfold continuity in |- *; intros. -apply (continuity_pt_comp f1 f2 x (H x) (H0 (f1 x))). + forall f1 f2, continuity f1 -> continuity f2 -> continuity (f2 o f1). +Proof. + unfold continuity in |- *; intros. + apply (continuity_pt_comp f1 f2 x (H x) (H0 (f1 x))). Qed. (*****************************************************) -(** Derivative's definition using Landau's kernel *) +(** * Derivative's definition using Landau's kernel *) (*****************************************************) Definition derivable_pt_lim f (x l:R) : Prop := forall eps:R, 0 < eps -> - exists delta : posreal, + exists delta : posreal, (forall h:R, - h <> 0 -> Rabs h < delta -> Rabs ((f (x + h) - f x) / h - l) < eps). + h <> 0 -> Rabs h < delta -> Rabs ((f (x + h) - f x) / h - l) < eps). Definition derivable_pt_abs f (x l:R) : Prop := derivable_pt_lim f x l. @@ -265,1225 +284,1279 @@ Arguments Scope derive [Rfun_scope _]. Definition antiderivative f (g:R -> R) (a b:R) : Prop := (forall x:R, - a <= x <= b -> exists pr : derivable_pt g x, f x = derive_pt g x pr) /\ + a <= x <= b -> exists pr : derivable_pt g x, f x = derive_pt g x pr) /\ a <= b. -(************************************) -(** Class of differential functions *) -(************************************) +(**************************************) +(** * Class of differential functions *) +(**************************************) Record Differential : Type := mkDifferential {d1 :> R -> R; cond_diff : derivable d1}. - + Record Differential_D2 : Type := mkDifferential_D2 {d2 :> R -> R; - cond_D1 : derivable d2; - cond_D2 : derivable (derive d2 cond_D1)}. + cond_D1 : derivable d2; + cond_D2 : derivable (derive d2 cond_D1)}. (**********) Lemma uniqueness_step1 : - forall f (x l1 l2:R), - limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l1 0 -> - limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l2 0 -> - l1 = l2. -intros; - apply - (single_limit (fun h:R => (f (x + h) - f x) / h) ( - fun h:R => h <> 0) l1 l2 0); try assumption. -unfold adhDa in |- *; intros; exists (alp / 2). -split. -unfold Rdiv in |- *; apply prod_neq_R0. -red in |- *; intro; rewrite H2 in H1; elim (Rlt_irrefl _ H1). -apply Rinv_neq_0_compat; discrR. -unfold R_dist in |- *; unfold Rminus in |- *; rewrite Ropp_0; - rewrite Rplus_0_r; unfold Rdiv in |- *; rewrite Rabs_mult. -replace (Rabs (/ 2)) with (/ 2). -replace (Rabs alp) with alp. -apply Rmult_lt_reg_l with 2. -prove_sup0. -rewrite (Rmult_comm 2); rewrite Rmult_assoc; rewrite <- Rinv_l_sym; - [ idtac | discrR ]; rewrite Rmult_1_r; rewrite double; - pattern alp at 1 in |- *; replace alp with (alp + 0); - [ idtac | ring ]; apply Rplus_lt_compat_l; assumption. -symmetry in |- *; apply Rabs_right; left; assumption. -symmetry in |- *; apply Rabs_right; left; change (0 < / 2) in |- *; - apply Rinv_0_lt_compat; prove_sup0. + forall f (x l1 l2:R), + limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l1 0 -> + limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l2 0 -> + l1 = l2. +Proof. + intros; + apply + (single_limit (fun h:R => (f (x + h) - f x) / h) ( + fun h:R => h <> 0) l1 l2 0); try assumption. + unfold adhDa in |- *; intros; exists (alp / 2). + split. + unfold Rdiv in |- *; apply prod_neq_R0. + red in |- *; intro; rewrite H2 in H1; elim (Rlt_irrefl _ H1). + apply Rinv_neq_0_compat; discrR. + unfold R_dist in |- *; unfold Rminus in |- *; rewrite Ropp_0; + rewrite Rplus_0_r; unfold Rdiv in |- *; rewrite Rabs_mult. + replace (Rabs (/ 2)) with (/ 2). + replace (Rabs alp) with alp. + apply Rmult_lt_reg_l with 2. + prove_sup0. + rewrite (Rmult_comm 2); rewrite Rmult_assoc; rewrite <- Rinv_l_sym; + [ idtac | discrR ]; rewrite Rmult_1_r; rewrite double; + pattern alp at 1 in |- *; replace alp with (alp + 0); + [ idtac | ring ]; apply Rplus_lt_compat_l; assumption. + symmetry in |- *; apply Rabs_right; left; assumption. + symmetry in |- *; apply Rabs_right; left; change (0 < / 2) in |- *; + apply Rinv_0_lt_compat; prove_sup0. Qed. Lemma uniqueness_step2 : - forall f (x l:R), - derivable_pt_lim f x l -> - limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0. -unfold derivable_pt_lim in |- *; intros; unfold limit1_in in |- *; - unfold limit_in in |- *; intros. -assert (H1 := H eps H0). -elim H1; intros. -exists (pos x0). -split. -apply (cond_pos x0). -simpl in |- *; unfold R_dist in |- *; intros. -elim H3; intros. -apply H2; - [ assumption - | unfold Rminus in H5; rewrite Ropp_0 in H5; rewrite Rplus_0_r in H5; - assumption ]. + forall f (x l:R), + derivable_pt_lim f x l -> + limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0. +Proof. + unfold derivable_pt_lim in |- *; intros; unfold limit1_in in |- *; + unfold limit_in in |- *; intros. + assert (H1 := H eps H0). + elim H1; intros. + exists (pos x0). + split. + apply (cond_pos x0). + simpl in |- *; unfold R_dist in |- *; intros. + elim H3; intros. + apply H2; + [ assumption + | unfold Rminus in H5; rewrite Ropp_0 in H5; rewrite Rplus_0_r in H5; + assumption ]. Qed. Lemma uniqueness_step3 : - forall f (x l:R), - limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0 -> - derivable_pt_lim f x l. -unfold limit1_in, derivable_pt_lim in |- *; unfold limit_in in |- *; - unfold dist in |- *; simpl in |- *; intros. -elim (H eps H0). -intros; elim H1; intros. -exists (mkposreal x0 H2). -simpl in |- *; intros; unfold R_dist in H3; apply (H3 h). -split; - [ assumption - | unfold Rminus in |- *; rewrite Ropp_0; rewrite Rplus_0_r; assumption ]. + forall f (x l:R), + limit1_in (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0 -> + derivable_pt_lim f x l. +Proof. + unfold limit1_in, derivable_pt_lim in |- *; unfold limit_in in |- *; + unfold dist in |- *; simpl in |- *; intros. + elim (H eps H0). + intros; elim H1; intros. + exists (mkposreal x0 H2). + simpl in |- *; intros; unfold R_dist in H3; apply (H3 h). + split; + [ assumption + | unfold Rminus in |- *; rewrite Ropp_0; rewrite Rplus_0_r; assumption ]. Qed. Lemma uniqueness_limite : - forall f (x l1 l2:R), - derivable_pt_lim f x l1 -> derivable_pt_lim f x l2 -> l1 = l2. -intros. -assert (H1 := uniqueness_step2 _ _ _ H). -assert (H2 := uniqueness_step2 _ _ _ H0). -assert (H3 := uniqueness_step1 _ _ _ _ H1 H2). -assumption. + forall f (x l1 l2:R), + derivable_pt_lim f x l1 -> derivable_pt_lim f x l2 -> l1 = l2. +Proof. + intros. + assert (H1 := uniqueness_step2 _ _ _ H). + assert (H2 := uniqueness_step2 _ _ _ H0). + assert (H3 := uniqueness_step1 _ _ _ _ H1 H2). + assumption. Qed. Lemma derive_pt_eq : - forall f (x l:R) (pr:derivable_pt f x), - derive_pt f x pr = l <-> derivable_pt_lim f x l. -intros; split. -intro; assert (H1 := projT2 pr); unfold derive_pt in H; rewrite H in H1; - assumption. -intro; assert (H1 := projT2 pr); unfold derivable_pt_abs in H1. -assert (H2 := uniqueness_limite _ _ _ _ H H1). -unfold derive_pt in |- *; unfold derivable_pt_abs in |- *. -symmetry in |- *; assumption. + forall f (x l:R) (pr:derivable_pt f x), + derive_pt f x pr = l <-> derivable_pt_lim f x l. +Proof. + intros; split. + intro; assert (H1 := projT2 pr); unfold derive_pt in H; rewrite H in H1; + assumption. + intro; assert (H1 := projT2 pr); unfold derivable_pt_abs in H1. + assert (H2 := uniqueness_limite _ _ _ _ H H1). + unfold derive_pt in |- *; unfold derivable_pt_abs in |- *. + symmetry in |- *; assumption. Qed. (**********) Lemma derive_pt_eq_0 : - forall f (x l:R) (pr:derivable_pt f x), - derivable_pt_lim f x l -> derive_pt f x pr = l. -intros; elim (derive_pt_eq f x l pr); intros. -apply (H1 H). + forall f (x l:R) (pr:derivable_pt f x), + derivable_pt_lim f x l -> derive_pt f x pr = l. +Proof. + intros; elim (derive_pt_eq f x l pr); intros. + apply (H1 H). Qed. (**********) Lemma derive_pt_eq_1 : - forall f (x l:R) (pr:derivable_pt f x), - derive_pt f x pr = l -> derivable_pt_lim f x l. -intros; elim (derive_pt_eq f x l pr); intros. -apply (H0 H). + forall f (x l:R) (pr:derivable_pt f x), + derive_pt f x pr = l -> derivable_pt_lim f x l. +Proof. + intros; elim (derive_pt_eq f x l pr); intros. + apply (H0 H). Qed. -(********************************************************************) -(** Equivalence of this definition with the one using limit concept *) -(********************************************************************) +(**********************************************************************) +(** * Equivalence of this definition with the one using limit concept *) +(**********************************************************************) Lemma derive_pt_D_in : - forall f (df:R -> R) (x:R) (pr:derivable_pt f x), - D_in f df no_cond x <-> derive_pt f x pr = df x. -intros; split. -unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -apply derive_pt_eq_0. -unfold derivable_pt_lim in |- *. -intros; elim (H eps H0); intros alpha H1; elim H1; intros; - exists (mkposreal alpha H2); intros; generalize (H3 (x + h)); - intro; cut (x + h - x = h); - [ intro; cut (D_x no_cond x (x + h) /\ Rabs (x + h - x) < alpha); - [ intro; generalize (H6 H8); rewrite H7; intro; assumption - | split; - [ unfold D_x in |- *; split; - [ unfold no_cond in |- *; trivial - | apply Rminus_not_eq_right; rewrite H7; assumption ] - | rewrite H7; assumption ] ] - | ring ]. -intro. -assert (H0 := derive_pt_eq_1 f x (df x) pr H). -unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; - unfold dist in |- *; simpl in |- *; unfold R_dist in |- *; - intros. -elim (H0 eps H1); intros alpha H2; exists (pos alpha); split. -apply (cond_pos alpha). -intros; elim H3; intros; unfold D_x in H4; elim H4; intros; cut (x0 - x <> 0). -intro; generalize (H2 (x0 - x) H8 H5); replace (x + (x0 - x)) with x0. -intro; assumption. -ring. -auto with real. + forall f (df:R -> R) (x:R) (pr:derivable_pt f x), + D_in f df no_cond x <-> derive_pt f x pr = df x. +Proof. + intros; split. + unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + apply derive_pt_eq_0. + unfold derivable_pt_lim in |- *. + intros; elim (H eps H0); intros alpha H1; elim H1; intros; + exists (mkposreal alpha H2); intros; generalize (H3 (x + h)); + intro; cut (x + h - x = h); + [ intro; cut (D_x no_cond x (x + h) /\ Rabs (x + h - x) < alpha); + [ intro; generalize (H6 H8); rewrite H7; intro; assumption + | split; + [ unfold D_x in |- *; split; + [ unfold no_cond in |- *; trivial + | apply Rminus_not_eq_right; rewrite H7; assumption ] + | rewrite H7; assumption ] ] + | ring ]. + intro. + assert (H0 := derive_pt_eq_1 f x (df x) pr H). + unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; + unfold dist in |- *; simpl in |- *; unfold R_dist in |- *; + intros. + elim (H0 eps H1); intros alpha H2; exists (pos alpha); split. + apply (cond_pos alpha). + intros; elim H3; intros; unfold D_x in H4; elim H4; intros; cut (x0 - x <> 0). + intro; generalize (H2 (x0 - x) H8 H5); replace (x + (x0 - x)) with x0. + intro; assumption. + ring. + auto with real. Qed. Lemma derivable_pt_lim_D_in : - forall f (df:R -> R) (x:R), - D_in f df no_cond x <-> derivable_pt_lim f x (df x). -intros; split. -unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -unfold derivable_pt_lim in |- *. -intros; elim (H eps H0); intros alpha H1; elim H1; intros; - exists (mkposreal alpha H2); intros; generalize (H3 (x + h)); - intro; cut (x + h - x = h); - [ intro; cut (D_x no_cond x (x + h) /\ Rabs (x + h - x) < alpha); - [ intro; generalize (H6 H8); rewrite H7; intro; assumption - | split; - [ unfold D_x in |- *; split; - [ unfold no_cond in |- *; trivial - | apply Rminus_not_eq_right; rewrite H7; assumption ] - | rewrite H7; assumption ] ] - | ring ]. -intro. -unfold derivable_pt_lim in H. -unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; - unfold dist in |- *; simpl in |- *; unfold R_dist in |- *; - intros. -elim (H eps H0); intros alpha H2; exists (pos alpha); split. -apply (cond_pos alpha). -intros. -elim H1; intros; unfold D_x in H3; elim H3; intros; cut (x0 - x <> 0). -intro; generalize (H2 (x0 - x) H7 H4); replace (x + (x0 - x)) with x0. -intro; assumption. -ring. -auto with real. + forall f (df:R -> R) (x:R), + D_in f df no_cond x <-> derivable_pt_lim f x (df x). +Proof. + intros; split. + unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + unfold derivable_pt_lim in |- *. + intros; elim (H eps H0); intros alpha H1; elim H1; intros; + exists (mkposreal alpha H2); intros; generalize (H3 (x + h)); + intro; cut (x + h - x = h); + [ intro; cut (D_x no_cond x (x + h) /\ Rabs (x + h - x) < alpha); + [ intro; generalize (H6 H8); rewrite H7; intro; assumption + | split; + [ unfold D_x in |- *; split; + [ unfold no_cond in |- *; trivial + | apply Rminus_not_eq_right; rewrite H7; assumption ] + | rewrite H7; assumption ] ] + | ring ]. + intro. + unfold derivable_pt_lim in H. + unfold D_in in |- *; unfold limit1_in in |- *; unfold limit_in in |- *; + unfold dist in |- *; simpl in |- *; unfold R_dist in |- *; + intros. + elim (H eps H0); intros alpha H2; exists (pos alpha); split. + apply (cond_pos alpha). + intros. + elim H1; intros; unfold D_x in H3; elim H3; intros; cut (x0 - x <> 0). + intro; generalize (H2 (x0 - x) H7 H4); replace (x + (x0 - x)) with x0. + intro; assumption. + ring. + auto with real. Qed. (***********************************) -(** derivability -> continuity *) +(** * derivability -> continuity *) (***********************************) (**********) Lemma derivable_derive : - forall f (x:R) (pr:derivable_pt f x), exists l : R, derive_pt f x pr = l. -intros; exists (projT1 pr). -unfold derive_pt in |- *; reflexivity. + forall f (x:R) (pr:derivable_pt f x), exists l : R, derive_pt f x pr = l. +Proof. + intros; exists (projT1 pr). + unfold derive_pt in |- *; reflexivity. Qed. Theorem derivable_continuous_pt : - forall f (x:R), derivable_pt f x -> continuity_pt f x. -intros f x X. -generalize (derivable_derive f x X); intro. -elim H; intros l H1. -cut (l = fct_cte l x). -intro. -rewrite H0 in H1. -generalize (derive_pt_D_in f (fct_cte l) x); intro. -elim (H2 X); intros. -generalize (H4 H1); intro. -unfold continuity_pt in |- *. -apply (cont_deriv f (fct_cte l) no_cond x H5). -unfold fct_cte in |- *; reflexivity. + forall f (x:R), derivable_pt f x -> continuity_pt f x. +Proof. + intros f x X. + generalize (derivable_derive f x X); intro. + elim H; intros l H1. + cut (l = fct_cte l x). + intro. + rewrite H0 in H1. + generalize (derive_pt_D_in f (fct_cte l) x); intro. + elim (H2 X); intros. + generalize (H4 H1); intro. + unfold continuity_pt in |- *. + apply (cont_deriv f (fct_cte l) no_cond x H5). + unfold fct_cte in |- *; reflexivity. Qed. Theorem derivable_continuous : forall f, derivable f -> continuity f. -unfold derivable, continuity in |- *; intros f X x. -apply (derivable_continuous_pt f x (X x)). +Proof. + unfold derivable, continuity in |- *; intros f X x. + apply (derivable_continuous_pt f x (X x)). Qed. (****************************************************************) -(** Main rules *) +(** * Main rules *) (****************************************************************) Lemma derivable_pt_lim_plus : - forall f1 f2 (x l1 l2:R), - derivable_pt_lim f1 x l1 -> - derivable_pt_lim f2 x l2 -> derivable_pt_lim (f1 + f2) x (l1 + l2). -intros. -apply uniqueness_step3. -assert (H1 := uniqueness_step2 _ _ _ H). -assert (H2 := uniqueness_step2 _ _ _ H0). -unfold plus_fct in |- *. -cut - (forall h:R, - (f1 (x + h) + f2 (x + h) - (f1 x + f2 x)) / h = - (f1 (x + h) - f1 x) / h + (f2 (x + h) - f2 x) / h). -intro. -generalize - (limit_plus (fun h':R => (f1 (x + h') - f1 x) / h') - (fun h':R => (f2 (x + h') - f2 x) / h') (fun h:R => h <> 0) l1 l2 0 H1 H2). -unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -elim (H4 eps H5); intros. -exists x0. -elim H6; intros. -split. -assumption. -intros; rewrite H3; apply H8; assumption. -intro; unfold Rdiv in |- *; ring. + forall f1 f2 (x l1 l2:R), + derivable_pt_lim f1 x l1 -> + derivable_pt_lim f2 x l2 -> derivable_pt_lim (f1 + f2) x (l1 + l2). + intros. + apply uniqueness_step3. + assert (H1 := uniqueness_step2 _ _ _ H). + assert (H2 := uniqueness_step2 _ _ _ H0). + unfold plus_fct in |- *. + cut + (forall h:R, + (f1 (x + h) + f2 (x + h) - (f1 x + f2 x)) / h = + (f1 (x + h) - f1 x) / h + (f2 (x + h) - f2 x) / h). + intro. + generalize + (limit_plus (fun h':R => (f1 (x + h') - f1 x) / h') + (fun h':R => (f2 (x + h') - f2 x) / h') (fun h:R => h <> 0) l1 l2 0 H1 H2). + unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + elim (H4 eps H5); intros. + exists x0. + elim H6; intros. + split. + assumption. + intros; rewrite H3; apply H8; assumption. + intro; unfold Rdiv in |- *; ring. Qed. Lemma derivable_pt_lim_opp : - forall f (x l:R), derivable_pt_lim f x l -> derivable_pt_lim (- f) x (- l). -intros. -apply uniqueness_step3. -assert (H1 := uniqueness_step2 _ _ _ H). -unfold opp_fct in |- *. -cut (forall h:R, (- f (x + h) - - f x) / h = - ((f (x + h) - f x) / h)). -intro. -generalize - (limit_Ropp (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0 H1). -unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -elim (H2 eps H3); intros. -exists x0. -elim H4; intros. -split. -assumption. -intros; rewrite H0; apply H6; assumption. -intro; unfold Rdiv in |- *; ring. + forall f (x l:R), derivable_pt_lim f x l -> derivable_pt_lim (- f) x (- l). +Proof. + intros. + apply uniqueness_step3. + assert (H1 := uniqueness_step2 _ _ _ H). + unfold opp_fct in |- *. + cut (forall h:R, (- f (x + h) - - f x) / h = - ((f (x + h) - f x) / h)). + intro. + generalize + (limit_Ropp (fun h:R => (f (x + h) - f x) / h) (fun h:R => h <> 0) l 0 H1). + unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + elim (H2 eps H3); intros. + exists x0. + elim H4; intros. + split. + assumption. + intros; rewrite H0; apply H6; assumption. + intro; unfold Rdiv in |- *; ring. Qed. Lemma derivable_pt_lim_minus : - forall f1 f2 (x l1 l2:R), - derivable_pt_lim f1 x l1 -> - derivable_pt_lim f2 x l2 -> derivable_pt_lim (f1 - f2) x (l1 - l2). -intros. -apply uniqueness_step3. -assert (H1 := uniqueness_step2 _ _ _ H). -assert (H2 := uniqueness_step2 _ _ _ H0). -unfold minus_fct in |- *. -cut - (forall h:R, - (f1 (x + h) - f1 x) / h - (f2 (x + h) - f2 x) / h = - (f1 (x + h) - f2 (x + h) - (f1 x - f2 x)) / h). -intro. -generalize - (limit_minus (fun h':R => (f1 (x + h') - f1 x) / h') - (fun h':R => (f2 (x + h') - f2 x) / h') (fun h:R => h <> 0) l1 l2 0 H1 H2). -unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; - simpl in |- *; unfold R_dist in |- *; intros. -elim (H4 eps H5); intros. -exists x0. -elim H6; intros. -split. -assumption. -intros; rewrite <- H3; apply H8; assumption. -intro; unfold Rdiv in |- *; ring. + forall f1 f2 (x l1 l2:R), + derivable_pt_lim f1 x l1 -> + derivable_pt_lim f2 x l2 -> derivable_pt_lim (f1 - f2) x (l1 - l2). +Proof. + intros. + apply uniqueness_step3. + assert (H1 := uniqueness_step2 _ _ _ H). + assert (H2 := uniqueness_step2 _ _ _ H0). + unfold minus_fct in |- *. + cut + (forall h:R, + (f1 (x + h) - f1 x) / h - (f2 (x + h) - f2 x) / h = + (f1 (x + h) - f2 (x + h) - (f1 x - f2 x)) / h). + intro. + generalize + (limit_minus (fun h':R => (f1 (x + h') - f1 x) / h') + (fun h':R => (f2 (x + h') - f2 x) / h') (fun h:R => h <> 0) l1 l2 0 H1 H2). + unfold limit1_in in |- *; unfold limit_in in |- *; unfold dist in |- *; + simpl in |- *; unfold R_dist in |- *; intros. + elim (H4 eps H5); intros. + exists x0. + elim H6; intros. + split. + assumption. + intros; rewrite <- H3; apply H8; assumption. + intro; unfold Rdiv in |- *; ring. Qed. Lemma derivable_pt_lim_mult : - forall f1 f2 (x l1 l2:R), - derivable_pt_lim f1 x l1 -> - derivable_pt_lim f2 x l2 -> - derivable_pt_lim (f1 * f2) x (l1 * f2 x + f1 x * l2). -intros. -assert (H1 := derivable_pt_lim_D_in f1 (fun y:R => l1) x). -elim H1; intros. -assert (H4 := H3 H). -assert (H5 := derivable_pt_lim_D_in f2 (fun y:R => l2) x). -elim H5; intros. -assert (H8 := H7 H0). -clear H1 H2 H3 H5 H6 H7. -assert - (H1 := - derivable_pt_lim_D_in (f1 * f2)%F (fun y:R => l1 * f2 x + f1 x * l2) x). -elim H1; intros. -clear H1 H3. -apply H2. -unfold mult_fct in |- *. -apply (Dmult no_cond (fun y:R => l1) (fun y:R => l2) f1 f2 x); assumption. + forall f1 f2 (x l1 l2:R), + derivable_pt_lim f1 x l1 -> + derivable_pt_lim f2 x l2 -> + derivable_pt_lim (f1 * f2) x (l1 * f2 x + f1 x * l2). +Proof. + intros. + assert (H1 := derivable_pt_lim_D_in f1 (fun y:R => l1) x). + elim H1; intros. + assert (H4 := H3 H). + assert (H5 := derivable_pt_lim_D_in f2 (fun y:R => l2) x). + elim H5; intros. + assert (H8 := H7 H0). + clear H1 H2 H3 H5 H6 H7. + assert + (H1 := + derivable_pt_lim_D_in (f1 * f2)%F (fun y:R => l1 * f2 x + f1 x * l2) x). + elim H1; intros. + clear H1 H3. + apply H2. + unfold mult_fct in |- *. + apply (Dmult no_cond (fun y:R => l1) (fun y:R => l2) f1 f2 x); assumption. Qed. Lemma derivable_pt_lim_const : forall a x:R, derivable_pt_lim (fct_cte a) x 0. -intros; unfold fct_cte, derivable_pt_lim in |- *. -intros; exists (mkposreal 1 Rlt_0_1); intros; unfold Rminus in |- *; - rewrite Rplus_opp_r; unfold Rdiv in |- *; rewrite Rmult_0_l; - rewrite Rplus_opp_r; rewrite Rabs_R0; assumption. +Proof. + intros; unfold fct_cte, derivable_pt_lim in |- *. + intros; exists (mkposreal 1 Rlt_0_1); intros; unfold Rminus in |- *; + rewrite Rplus_opp_r; unfold Rdiv in |- *; rewrite Rmult_0_l; + rewrite Rplus_opp_r; rewrite Rabs_R0; assumption. Qed. Lemma derivable_pt_lim_scal : - forall f (a x l:R), - derivable_pt_lim f x l -> derivable_pt_lim (mult_real_fct a f) x (a * l). -intros. -assert (H0 := derivable_pt_lim_const a x). -replace (mult_real_fct a f) with (fct_cte a * f)%F. -replace (a * l) with (0 * f x + a * l); [ idtac | ring ]. -apply (derivable_pt_lim_mult (fct_cte a) f x 0 l); assumption. -unfold mult_real_fct, mult_fct, fct_cte in |- *; reflexivity. + forall f (a x l:R), + derivable_pt_lim f x l -> derivable_pt_lim (mult_real_fct a f) x (a * l). +Proof. + intros. + assert (H0 := derivable_pt_lim_const a x). + replace (mult_real_fct a f) with (fct_cte a * f)%F. + replace (a * l) with (0 * f x + a * l); [ idtac | ring ]. + apply (derivable_pt_lim_mult (fct_cte a) f x 0 l); assumption. + unfold mult_real_fct, mult_fct, fct_cte in |- *; reflexivity. Qed. Lemma derivable_pt_lim_id : forall x:R, derivable_pt_lim id x 1. -intro; unfold derivable_pt_lim in |- *. -intros eps Heps; exists (mkposreal eps Heps); intros h H1 H2; - unfold id in |- *; replace ((x + h - x) / h - 1) with 0. -rewrite Rabs_R0; apply Rle_lt_trans with (Rabs h). -apply Rabs_pos. -assumption. -unfold Rminus in |- *; rewrite Rplus_assoc; rewrite (Rplus_comm x); - rewrite Rplus_assoc. -rewrite Rplus_opp_l; rewrite Rplus_0_r; unfold Rdiv in |- *; - rewrite <- Rinv_r_sym. -symmetry in |- *; apply Rplus_opp_r. -assumption. +Proof. + intro; unfold derivable_pt_lim in |- *. + intros eps Heps; exists (mkposreal eps Heps); intros h H1 H2; + unfold id in |- *; replace ((x + h - x) / h - 1) with 0. + rewrite Rabs_R0; apply Rle_lt_trans with (Rabs h). + apply Rabs_pos. + assumption. + unfold Rminus in |- *; rewrite Rplus_assoc; rewrite (Rplus_comm x); + rewrite Rplus_assoc. + rewrite Rplus_opp_l; rewrite Rplus_0_r; unfold Rdiv in |- *; + rewrite <- Rinv_r_sym. + symmetry in |- *; apply Rplus_opp_r. + assumption. Qed. Lemma derivable_pt_lim_Rsqr : forall x:R, derivable_pt_lim Rsqr x (2 * x). -intro; unfold derivable_pt_lim in |- *. -unfold Rsqr in |- *; intros eps Heps; exists (mkposreal eps Heps); - intros h H1 H2; replace (((x + h) * (x + h) - x * x) / h - 2 * x) with h. -assumption. -replace ((x + h) * (x + h) - x * x) with (2 * x * h + h * h); - [ idtac | ring ]. -unfold Rdiv in |- *; rewrite Rmult_plus_distr_r. -repeat rewrite Rmult_assoc. -repeat rewrite <- Rinv_r_sym; [ idtac | assumption ]. -ring. +Proof. + intro; unfold derivable_pt_lim in |- *. + unfold Rsqr in |- *; intros eps Heps; exists (mkposreal eps Heps); + intros h H1 H2; replace (((x + h) * (x + h) - x * x) / h - 2 * x) with h. + assumption. + replace ((x + h) * (x + h) - x * x) with (2 * x * h + h * h); + [ idtac | ring ]. + unfold Rdiv in |- *; rewrite Rmult_plus_distr_r. + repeat rewrite Rmult_assoc. + repeat rewrite <- Rinv_r_sym; [ idtac | assumption ]. + ring. Qed. Lemma derivable_pt_lim_comp : - forall f1 f2 (x l1 l2:R), - derivable_pt_lim f1 x l1 -> - derivable_pt_lim f2 (f1 x) l2 -> derivable_pt_lim (f2 o f1) x (l2 * l1). -intros; assert (H1 := derivable_pt_lim_D_in f1 (fun y:R => l1) x). -elim H1; intros. -assert (H4 := H3 H). -assert (H5 := derivable_pt_lim_D_in f2 (fun y:R => l2) (f1 x)). -elim H5; intros. -assert (H8 := H7 H0). -clear H1 H2 H3 H5 H6 H7. -assert (H1 := derivable_pt_lim_D_in (f2 o f1)%F (fun y:R => l2 * l1) x). -elim H1; intros. -clear H1 H3; apply H2. -unfold comp in |- *; - cut - (D_in (fun x0:R => f2 (f1 x0)) (fun y:R => l2 * l1) - (Dgf no_cond no_cond f1) x -> - D_in (fun x0:R => f2 (f1 x0)) (fun y:R => l2 * l1) no_cond x). -intro; apply H1. -rewrite Rmult_comm; - apply (Dcomp no_cond no_cond (fun y:R => l1) (fun y:R => l2) f1 f2 x); - assumption. -unfold Dgf, D_in, no_cond in |- *; unfold limit1_in in |- *; - unfold limit_in in |- *; unfold dist in |- *; simpl in |- *; - unfold R_dist in |- *; intros. -elim (H1 eps H3); intros. -exists x0; intros; split. -elim H5; intros; assumption. -intros; elim H5; intros; apply H9; split. -unfold D_x in |- *; split. -split; trivial. -elim H6; intros; unfold D_x in H10; elim H10; intros; assumption. -elim H6; intros; assumption. + forall f1 f2 (x l1 l2:R), + derivable_pt_lim f1 x l1 -> + derivable_pt_lim f2 (f1 x) l2 -> derivable_pt_lim (f2 o f1) x (l2 * l1). +Proof. + intros; assert (H1 := derivable_pt_lim_D_in f1 (fun y:R => l1) x). + elim H1; intros. + assert (H4 := H3 H). + assert (H5 := derivable_pt_lim_D_in f2 (fun y:R => l2) (f1 x)). + elim H5; intros. + assert (H8 := H7 H0). + clear H1 H2 H3 H5 H6 H7. + assert (H1 := derivable_pt_lim_D_in (f2 o f1)%F (fun y:R => l2 * l1) x). + elim H1; intros. + clear H1 H3; apply H2. + unfold comp in |- *; + cut + (D_in (fun x0:R => f2 (f1 x0)) (fun y:R => l2 * l1) + (Dgf no_cond no_cond f1) x -> + D_in (fun x0:R => f2 (f1 x0)) (fun y:R => l2 * l1) no_cond x). + intro; apply H1. + rewrite Rmult_comm; + apply (Dcomp no_cond no_cond (fun y:R => l1) (fun y:R => l2) f1 f2 x); + assumption. + unfold Dgf, D_in, no_cond in |- *; unfold limit1_in in |- *; + unfold limit_in in |- *; unfold dist in |- *; simpl in |- *; + unfold R_dist in |- *; intros. + elim (H1 eps H3); intros. + exists x0; intros; split. + elim H5; intros; assumption. + intros; elim H5; intros; apply H9; split. + unfold D_x in |- *; split. + split; trivial. + elim H6; intros; unfold D_x in H10; elim H10; intros; assumption. + elim H6; intros; assumption. Qed. Lemma derivable_pt_plus : - forall f1 f2 (x:R), - derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 + f2) x. -unfold derivable_pt in |- *; intros f1 f2 x X X0. -elim X; intros. -elim X0; intros. -apply existT with (x0 + x1). -apply derivable_pt_lim_plus; assumption. + forall f1 f2 (x:R), + derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 + f2) x. +Proof. + unfold derivable_pt in |- *; intros f1 f2 x X X0. + elim X; intros. + elim X0; intros. + apply existT with (x0 + x1). + apply derivable_pt_lim_plus; assumption. Qed. Lemma derivable_pt_opp : - forall f (x:R), derivable_pt f x -> derivable_pt (- f) x. -unfold derivable_pt in |- *; intros f x X. -elim X; intros. -apply existT with (- x0). -apply derivable_pt_lim_opp; assumption. + forall f (x:R), derivable_pt f x -> derivable_pt (- f) x. +Proof. + unfold derivable_pt in |- *; intros f x X. + elim X; intros. + apply existT with (- x0). + apply derivable_pt_lim_opp; assumption. Qed. Lemma derivable_pt_minus : - forall f1 f2 (x:R), - derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 - f2) x. -unfold derivable_pt in |- *; intros f1 f2 x X X0. -elim X; intros. -elim X0; intros. -apply existT with (x0 - x1). -apply derivable_pt_lim_minus; assumption. + forall f1 f2 (x:R), + derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 - f2) x. +Proof. + unfold derivable_pt in |- *; intros f1 f2 x X X0. + elim X; intros. + elim X0; intros. + apply existT with (x0 - x1). + apply derivable_pt_lim_minus; assumption. Qed. Lemma derivable_pt_mult : - forall f1 f2 (x:R), - derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 * f2) x. -unfold derivable_pt in |- *; intros f1 f2 x X X0. -elim X; intros. -elim X0; intros. -apply existT with (x0 * f2 x + f1 x * x1). -apply derivable_pt_lim_mult; assumption. + forall f1 f2 (x:R), + derivable_pt f1 x -> derivable_pt f2 x -> derivable_pt (f1 * f2) x. +Proof. + unfold derivable_pt in |- *; intros f1 f2 x X X0. + elim X; intros. + elim X0; intros. + apply existT with (x0 * f2 x + f1 x * x1). + apply derivable_pt_lim_mult; assumption. Qed. Lemma derivable_pt_const : forall a x:R, derivable_pt (fct_cte a) x. -intros; unfold derivable_pt in |- *. -apply existT with 0. -apply derivable_pt_lim_const. +Proof. + intros; unfold derivable_pt in |- *. + apply existT with 0. + apply derivable_pt_lim_const. Qed. Lemma derivable_pt_scal : - forall f (a x:R), derivable_pt f x -> derivable_pt (mult_real_fct a f) x. -unfold derivable_pt in |- *; intros f1 a x X. -elim X; intros. -apply existT with (a * x0). -apply derivable_pt_lim_scal; assumption. + forall f (a x:R), derivable_pt f x -> derivable_pt (mult_real_fct a f) x. +Proof. + unfold derivable_pt in |- *; intros f1 a x X. + elim X; intros. + apply existT with (a * x0). + apply derivable_pt_lim_scal; assumption. Qed. Lemma derivable_pt_id : forall x:R, derivable_pt id x. -unfold derivable_pt in |- *; intro. -exists 1. -apply derivable_pt_lim_id. +Proof. + unfold derivable_pt in |- *; intro. + exists 1. + apply derivable_pt_lim_id. Qed. Lemma derivable_pt_Rsqr : forall x:R, derivable_pt Rsqr x. -unfold derivable_pt in |- *; intro; apply existT with (2 * x). -apply derivable_pt_lim_Rsqr. +Proof. + unfold derivable_pt in |- *; intro; apply existT with (2 * x). + apply derivable_pt_lim_Rsqr. Qed. Lemma derivable_pt_comp : - forall f1 f2 (x:R), - derivable_pt f1 x -> derivable_pt f2 (f1 x) -> derivable_pt (f2 o f1) x. -unfold derivable_pt in |- *; intros f1 f2 x X X0. -elim X; intros. -elim X0; intros. -apply existT with (x1 * x0). -apply derivable_pt_lim_comp; assumption. + forall f1 f2 (x:R), + derivable_pt f1 x -> derivable_pt f2 (f1 x) -> derivable_pt (f2 o f1) x. +Proof. + unfold derivable_pt in |- *; intros f1 f2 x X X0. + elim X; intros. + elim X0; intros. + apply existT with (x1 * x0). + apply derivable_pt_lim_comp; assumption. Qed. Lemma derivable_plus : - forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 + f2). -unfold derivable in |- *; intros f1 f2 X X0 x. -apply (derivable_pt_plus _ _ x (X _) (X0 _)). + forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 + f2). +Proof. + unfold derivable in |- *; intros f1 f2 X X0 x. + apply (derivable_pt_plus _ _ x (X _) (X0 _)). Qed. Lemma derivable_opp : forall f, derivable f -> derivable (- f). -unfold derivable in |- *; intros f X x. -apply (derivable_pt_opp _ x (X _)). +Proof. + unfold derivable in |- *; intros f X x. + apply (derivable_pt_opp _ x (X _)). Qed. Lemma derivable_minus : - forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 - f2). -unfold derivable in |- *; intros f1 f2 X X0 x. -apply (derivable_pt_minus _ _ x (X _) (X0 _)). + forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 - f2). +Proof. + unfold derivable in |- *; intros f1 f2 X X0 x. + apply (derivable_pt_minus _ _ x (X _) (X0 _)). Qed. Lemma derivable_mult : - forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 * f2). -unfold derivable in |- *; intros f1 f2 X X0 x. -apply (derivable_pt_mult _ _ x (X _) (X0 _)). + forall f1 f2, derivable f1 -> derivable f2 -> derivable (f1 * f2). +Proof. + unfold derivable in |- *; intros f1 f2 X X0 x. + apply (derivable_pt_mult _ _ x (X _) (X0 _)). Qed. Lemma derivable_const : forall a:R, derivable (fct_cte a). -unfold derivable in |- *; intros. -apply derivable_pt_const. +Proof. + unfold derivable in |- *; intros. + apply derivable_pt_const. Qed. Lemma derivable_scal : - forall f (a:R), derivable f -> derivable (mult_real_fct a f). -unfold derivable in |- *; intros f a X x. -apply (derivable_pt_scal _ a x (X _)). + forall f (a:R), derivable f -> derivable (mult_real_fct a f). +Proof. + unfold derivable in |- *; intros f a X x. + apply (derivable_pt_scal _ a x (X _)). Qed. Lemma derivable_id : derivable id. -unfold derivable in |- *; intro; apply derivable_pt_id. +Proof. + unfold derivable in |- *; intro; apply derivable_pt_id. Qed. Lemma derivable_Rsqr : derivable Rsqr. -unfold derivable in |- *; intro; apply derivable_pt_Rsqr. +Proof. + unfold derivable in |- *; intro; apply derivable_pt_Rsqr. Qed. Lemma derivable_comp : - forall f1 f2, derivable f1 -> derivable f2 -> derivable (f2 o f1). -unfold derivable in |- *; intros f1 f2 X X0 x. -apply (derivable_pt_comp _ _ x (X _) (X0 _)). + forall f1 f2, derivable f1 -> derivable f2 -> derivable (f2 o f1). +Proof. + unfold derivable in |- *; intros f1 f2 X X0 x. + apply (derivable_pt_comp _ _ x (X _) (X0 _)). Qed. Lemma derive_pt_plus : - forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), - derive_pt (f1 + f2) x (derivable_pt_plus _ _ _ pr1 pr2) = - derive_pt f1 x pr1 + derive_pt f2 x pr2. -intros. -assert (H := derivable_derive f1 x pr1). -assert (H0 := derivable_derive f2 x pr2). -assert - (H1 := derivable_derive (f1 + f2)%F x (derivable_pt_plus _ _ _ pr1 pr2)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -elim H1; clear H1; intros l H1. -rewrite H; rewrite H0; apply derive_pt_eq_0. -assert (H3 := projT2 pr1). -unfold derive_pt in H; rewrite H in H3. -assert (H4 := projT2 pr2). -unfold derive_pt in H0; rewrite H0 in H4. -apply derivable_pt_lim_plus; assumption. + forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), + derive_pt (f1 + f2) x (derivable_pt_plus _ _ _ pr1 pr2) = + derive_pt f1 x pr1 + derive_pt f2 x pr2. +Proof. + intros. + assert (H := derivable_derive f1 x pr1). + assert (H0 := derivable_derive f2 x pr2). + assert + (H1 := derivable_derive (f1 + f2)%F x (derivable_pt_plus _ _ _ pr1 pr2)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + elim H1; clear H1; intros l H1. + rewrite H; rewrite H0; apply derive_pt_eq_0. + assert (H3 := projT2 pr1). + unfold derive_pt in H; rewrite H in H3. + assert (H4 := projT2 pr2). + unfold derive_pt in H0; rewrite H0 in H4. + apply derivable_pt_lim_plus; assumption. Qed. Lemma derive_pt_opp : - forall f (x:R) (pr1:derivable_pt f x), - derive_pt (- f) x (derivable_pt_opp _ _ pr1) = - derive_pt f x pr1. -intros. -assert (H := derivable_derive f x pr1). -assert (H0 := derivable_derive (- f)%F x (derivable_pt_opp _ _ pr1)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -rewrite H; apply derive_pt_eq_0. -assert (H3 := projT2 pr1). -unfold derive_pt in H; rewrite H in H3. -apply derivable_pt_lim_opp; assumption. + forall f (x:R) (pr1:derivable_pt f x), + derive_pt (- f) x (derivable_pt_opp _ _ pr1) = - derive_pt f x pr1. +Proof. + intros. + assert (H := derivable_derive f x pr1). + assert (H0 := derivable_derive (- f)%F x (derivable_pt_opp _ _ pr1)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + rewrite H; apply derive_pt_eq_0. + assert (H3 := projT2 pr1). + unfold derive_pt in H; rewrite H in H3. + apply derivable_pt_lim_opp; assumption. Qed. Lemma derive_pt_minus : - forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), - derive_pt (f1 - f2) x (derivable_pt_minus _ _ _ pr1 pr2) = - derive_pt f1 x pr1 - derive_pt f2 x pr2. -intros. -assert (H := derivable_derive f1 x pr1). -assert (H0 := derivable_derive f2 x pr2). -assert - (H1 := derivable_derive (f1 - f2)%F x (derivable_pt_minus _ _ _ pr1 pr2)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -elim H1; clear H1; intros l H1. -rewrite H; rewrite H0; apply derive_pt_eq_0. -assert (H3 := projT2 pr1). -unfold derive_pt in H; rewrite H in H3. -assert (H4 := projT2 pr2). -unfold derive_pt in H0; rewrite H0 in H4. -apply derivable_pt_lim_minus; assumption. + forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), + derive_pt (f1 - f2) x (derivable_pt_minus _ _ _ pr1 pr2) = + derive_pt f1 x pr1 - derive_pt f2 x pr2. +Proof. + intros. + assert (H := derivable_derive f1 x pr1). + assert (H0 := derivable_derive f2 x pr2). + assert + (H1 := derivable_derive (f1 - f2)%F x (derivable_pt_minus _ _ _ pr1 pr2)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + elim H1; clear H1; intros l H1. + rewrite H; rewrite H0; apply derive_pt_eq_0. + assert (H3 := projT2 pr1). + unfold derive_pt in H; rewrite H in H3. + assert (H4 := projT2 pr2). + unfold derive_pt in H0; rewrite H0 in H4. + apply derivable_pt_lim_minus; assumption. Qed. Lemma derive_pt_mult : - forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), - derive_pt (f1 * f2) x (derivable_pt_mult _ _ _ pr1 pr2) = - derive_pt f1 x pr1 * f2 x + f1 x * derive_pt f2 x pr2. -intros. -assert (H := derivable_derive f1 x pr1). -assert (H0 := derivable_derive f2 x pr2). -assert - (H1 := derivable_derive (f1 * f2)%F x (derivable_pt_mult _ _ _ pr1 pr2)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -elim H1; clear H1; intros l H1. -rewrite H; rewrite H0; apply derive_pt_eq_0. -assert (H3 := projT2 pr1). -unfold derive_pt in H; rewrite H in H3. -assert (H4 := projT2 pr2). -unfold derive_pt in H0; rewrite H0 in H4. -apply derivable_pt_lim_mult; assumption. + forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 x), + derive_pt (f1 * f2) x (derivable_pt_mult _ _ _ pr1 pr2) = + derive_pt f1 x pr1 * f2 x + f1 x * derive_pt f2 x pr2. +Proof. + intros. + assert (H := derivable_derive f1 x pr1). + assert (H0 := derivable_derive f2 x pr2). + assert + (H1 := derivable_derive (f1 * f2)%F x (derivable_pt_mult _ _ _ pr1 pr2)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + elim H1; clear H1; intros l H1. + rewrite H; rewrite H0; apply derive_pt_eq_0. + assert (H3 := projT2 pr1). + unfold derive_pt in H; rewrite H in H3. + assert (H4 := projT2 pr2). + unfold derive_pt in H0; rewrite H0 in H4. + apply derivable_pt_lim_mult; assumption. Qed. Lemma derive_pt_const : - forall a x:R, derive_pt (fct_cte a) x (derivable_pt_const a x) = 0. -intros. -apply derive_pt_eq_0. -apply derivable_pt_lim_const. + forall a x:R, derive_pt (fct_cte a) x (derivable_pt_const a x) = 0. +Proof. + intros. + apply derive_pt_eq_0. + apply derivable_pt_lim_const. Qed. Lemma derive_pt_scal : - forall f (a x:R) (pr:derivable_pt f x), - derive_pt (mult_real_fct a f) x (derivable_pt_scal _ _ _ pr) = - a * derive_pt f x pr. -intros. -assert (H := derivable_derive f x pr). -assert - (H0 := derivable_derive (mult_real_fct a f) x (derivable_pt_scal _ _ _ pr)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -rewrite H; apply derive_pt_eq_0. -assert (H3 := projT2 pr). -unfold derive_pt in H; rewrite H in H3. -apply derivable_pt_lim_scal; assumption. + forall f (a x:R) (pr:derivable_pt f x), + derive_pt (mult_real_fct a f) x (derivable_pt_scal _ _ _ pr) = + a * derive_pt f x pr. +Proof. + intros. + assert (H := derivable_derive f x pr). + assert + (H0 := derivable_derive (mult_real_fct a f) x (derivable_pt_scal _ _ _ pr)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + rewrite H; apply derive_pt_eq_0. + assert (H3 := projT2 pr). + unfold derive_pt in H; rewrite H in H3. + apply derivable_pt_lim_scal; assumption. Qed. Lemma derive_pt_id : forall x:R, derive_pt id x (derivable_pt_id _) = 1. -intros. -apply derive_pt_eq_0. -apply derivable_pt_lim_id. +Proof. + intros. + apply derive_pt_eq_0. + apply derivable_pt_lim_id. Qed. Lemma derive_pt_Rsqr : - forall x:R, derive_pt Rsqr x (derivable_pt_Rsqr _) = 2 * x. -intros. -apply derive_pt_eq_0. -apply derivable_pt_lim_Rsqr. + forall x:R, derive_pt Rsqr x (derivable_pt_Rsqr _) = 2 * x. +Proof. + intros. + apply derive_pt_eq_0. + apply derivable_pt_lim_Rsqr. Qed. Lemma derive_pt_comp : - forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 (f1 x)), - derive_pt (f2 o f1) x (derivable_pt_comp _ _ _ pr1 pr2) = - derive_pt f2 (f1 x) pr2 * derive_pt f1 x pr1. -intros. -assert (H := derivable_derive f1 x pr1). -assert (H0 := derivable_derive f2 (f1 x) pr2). -assert - (H1 := derivable_derive (f2 o f1)%F x (derivable_pt_comp _ _ _ pr1 pr2)). -elim H; clear H; intros l1 H. -elim H0; clear H0; intros l2 H0. -elim H1; clear H1; intros l H1. -rewrite H; rewrite H0; apply derive_pt_eq_0. -assert (H3 := projT2 pr1). -unfold derive_pt in H; rewrite H in H3. -assert (H4 := projT2 pr2). -unfold derive_pt in H0; rewrite H0 in H4. -apply derivable_pt_lim_comp; assumption. + forall f1 f2 (x:R) (pr1:derivable_pt f1 x) (pr2:derivable_pt f2 (f1 x)), + derive_pt (f2 o f1) x (derivable_pt_comp _ _ _ pr1 pr2) = + derive_pt f2 (f1 x) pr2 * derive_pt f1 x pr1. +Proof. + intros. + assert (H := derivable_derive f1 x pr1). + assert (H0 := derivable_derive f2 (f1 x) pr2). + assert + (H1 := derivable_derive (f2 o f1)%F x (derivable_pt_comp _ _ _ pr1 pr2)). + elim H; clear H; intros l1 H. + elim H0; clear H0; intros l2 H0. + elim H1; clear H1; intros l H1. + rewrite H; rewrite H0; apply derive_pt_eq_0. + assert (H3 := projT2 pr1). + unfold derive_pt in H; rewrite H in H3. + assert (H4 := projT2 pr2). + unfold derive_pt in H0; rewrite H0 in H4. + apply derivable_pt_lim_comp; assumption. Qed. (* Pow *) Definition pow_fct (n:nat) (y:R) : R := y ^ n. Lemma derivable_pt_lim_pow_pos : - forall (x:R) (n:nat), - (0 < n)%nat -> derivable_pt_lim (fun y:R => y ^ n) x (INR n * x ^ pred n). -intros. -induction n as [| n Hrecn]. -elim (lt_irrefl _ H). -cut (n = 0%nat \/ (0 < n)%nat). -intro; elim H0; intro. -rewrite H1; simpl in |- *. -replace (fun y:R => y * 1) with (id * fct_cte 1)%F. -replace (1 * 1) with (1 * fct_cte 1 x + id x * 0). -apply derivable_pt_lim_mult. -apply derivable_pt_lim_id. -apply derivable_pt_lim_const. -unfold fct_cte, id in |- *; ring. -reflexivity. -replace (fun y:R => y ^ S n) with (fun y:R => y * y ^ n). -replace (pred (S n)) with n; [ idtac | reflexivity ]. -replace (fun y:R => y * y ^ n) with (id * (fun y:R => y ^ n))%F. -set (f := fun y:R => y ^ n). -replace (INR (S n) * x ^ n) with (1 * f x + id x * (INR n * x ^ pred n)). -apply derivable_pt_lim_mult. -apply derivable_pt_lim_id. -unfold f in |- *; apply Hrecn; assumption. -unfold f in |- *. -pattern n at 1 5 in |- *; replace n with (S (pred n)). -unfold id in |- *; rewrite S_INR; simpl in |- *. -ring. -symmetry in |- *; apply S_pred with 0%nat; assumption. -unfold mult_fct, id in |- *; reflexivity. -reflexivity. -inversion H. -left; reflexivity. -right. -apply lt_le_trans with 1%nat. -apply lt_O_Sn. -assumption. + forall (x:R) (n:nat), + (0 < n)%nat -> derivable_pt_lim (fun y:R => y ^ n) x (INR n * x ^ pred n). +Proof. + intros. + induction n as [| n Hrecn]. + elim (lt_irrefl _ H). + cut (n = 0%nat \/ (0 < n)%nat). + intro; elim H0; intro. + rewrite H1; simpl in |- *. + replace (fun y:R => y * 1) with (id * fct_cte 1)%F. + replace (1 * 1) with (1 * fct_cte 1 x + id x * 0). + apply derivable_pt_lim_mult. + apply derivable_pt_lim_id. + apply derivable_pt_lim_const. + unfold fct_cte, id in |- *; ring. + reflexivity. + replace (fun y:R => y ^ S n) with (fun y:R => y * y ^ n). + replace (pred (S n)) with n; [ idtac | reflexivity ]. + replace (fun y:R => y * y ^ n) with (id * (fun y:R => y ^ n))%F. + set (f := fun y:R => y ^ n). + replace (INR (S n) * x ^ n) with (1 * f x + id x * (INR n * x ^ pred n)). + apply derivable_pt_lim_mult. + apply derivable_pt_lim_id. + unfold f in |- *; apply Hrecn; assumption. + unfold f in |- *. + pattern n at 1 5 in |- *; replace n with (S (pred n)). + unfold id in |- *; rewrite S_INR; simpl in |- *. + ring. + symmetry in |- *; apply S_pred with 0%nat; assumption. + unfold mult_fct, id in |- *; reflexivity. + reflexivity. + inversion H. + left; reflexivity. + right. + apply lt_le_trans with 1%nat. + apply lt_O_Sn. + assumption. Qed. Lemma derivable_pt_lim_pow : - forall (x:R) (n:nat), - derivable_pt_lim (fun y:R => y ^ n) x (INR n * x ^ pred n). -intros. -induction n as [| n Hrecn]. -simpl in |- *. -rewrite Rmult_0_l. -replace (fun _:R => 1) with (fct_cte 1); - [ apply derivable_pt_lim_const | reflexivity ]. -apply derivable_pt_lim_pow_pos. -apply lt_O_Sn. + forall (x:R) (n:nat), + derivable_pt_lim (fun y:R => y ^ n) x (INR n * x ^ pred n). +Proof. + intros. + induction n as [| n Hrecn]. + simpl in |- *. + rewrite Rmult_0_l. + replace (fun _:R => 1) with (fct_cte 1); + [ apply derivable_pt_lim_const | reflexivity ]. + apply derivable_pt_lim_pow_pos. + apply lt_O_Sn. Qed. Lemma derivable_pt_pow : - forall (n:nat) (x:R), derivable_pt (fun y:R => y ^ n) x. -intros; unfold derivable_pt in |- *. -apply existT with (INR n * x ^ pred n). -apply derivable_pt_lim_pow. + forall (n:nat) (x:R), derivable_pt (fun y:R => y ^ n) x. +Proof. + intros; unfold derivable_pt in |- *. + apply existT with (INR n * x ^ pred n). + apply derivable_pt_lim_pow. Qed. Lemma derivable_pow : forall n:nat, derivable (fun y:R => y ^ n). -intro; unfold derivable in |- *; intro; apply derivable_pt_pow. +Proof. + intro; unfold derivable in |- *; intro; apply derivable_pt_pow. Qed. Lemma derive_pt_pow : - forall (n:nat) (x:R), - derive_pt (fun y:R => y ^ n) x (derivable_pt_pow n x) = INR n * x ^ pred n. -intros; apply derive_pt_eq_0. -apply derivable_pt_lim_pow. + forall (n:nat) (x:R), + derive_pt (fun y:R => y ^ n) x (derivable_pt_pow n x) = INR n * x ^ pred n. +Proof. + intros; apply derive_pt_eq_0. + apply derivable_pt_lim_pow. Qed. Lemma pr_nu : - forall f (x:R) (pr1 pr2:derivable_pt f x), - derive_pt f x pr1 = derive_pt f x pr2. -intros. -unfold derivable_pt in pr1. -unfold derivable_pt in pr2. -elim pr1; intros. -elim pr2; intros. -unfold derivable_pt_abs in p. -unfold derivable_pt_abs in p0. -simpl in |- *. -apply (uniqueness_limite f x x0 x1 p p0). + forall f (x:R) (pr1 pr2:derivable_pt f x), + derive_pt f x pr1 = derive_pt f x pr2. +Proof. + intros. + unfold derivable_pt in pr1. + unfold derivable_pt in pr2. + elim pr1; intros. + elim pr2; intros. + unfold derivable_pt_abs in p. + unfold derivable_pt_abs in p0. + simpl in |- *. + apply (uniqueness_limite f x x0 x1 p p0). Qed. (************************************************************) -(** Local extremum's condition *) +(** * Local extremum's condition *) (************************************************************) Theorem deriv_maximum : - forall f (a b c:R) (pr:derivable_pt f c), - a < c -> - c < b -> - (forall x:R, a < x -> x < b -> f x <= f c) -> derive_pt f c pr = 0. -intros; case (Rtotal_order 0 (derive_pt f c pr)); intro. -assert (H3 := derivable_derive f c pr). -elim H3; intros l H4; rewrite H4 in H2. -assert (H5 := derive_pt_eq_1 f c l pr H4). -cut (0 < l / 2); - [ intro - | unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ assumption | apply Rinv_0_lt_compat; prove_sup0 ] ]. -elim (H5 (l / 2) H6); intros delta H7. -cut (0 < (b - c) / 2). -intro; cut (Rmin (delta / 2) ((b - c) / 2) <> 0). -intro; cut (Rabs (Rmin (delta / 2) ((b - c) / 2)) < delta). -intro. -assert (H11 := H7 (Rmin (delta / 2) ((b - c) / 2)) H9 H10). -cut (0 < Rmin (delta / 2) ((b - c) / 2)). -intro; cut (a < c + Rmin (delta / 2) ((b - c) / 2)). -intro; cut (c + Rmin (delta / 2) ((b - c) / 2) < b). -intro; assert (H15 := H1 (c + Rmin (delta / 2) ((b - c) / 2)) H13 H14). -cut - ((f (c + Rmin (delta / 2) ((b - c) / 2)) - f c) / - Rmin (delta / 2) ((b - c) / 2) <= 0). -intro; cut (- l < 0). -intro; unfold Rminus in H11. -cut - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l < 0). -intro; - cut - (Rabs - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l) < l / 2). -unfold Rabs in |- *; - case - (Rcase_abs - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l)); intro. -replace - (- - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l)) with - (l + - - - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2))). -intro; - generalize - (Rplus_lt_compat_l (- l) - (l + - - + forall f (a b c:R) (pr:derivable_pt f c), + a < c -> + c < b -> + (forall x:R, a < x -> x < b -> f x <= f c) -> derive_pt f c pr = 0. +Proof. + intros; case (Rtotal_order 0 (derive_pt f c pr)); intro. + assert (H3 := derivable_derive f c pr). + elim H3; intros l H4; rewrite H4 in H2. + assert (H5 := derive_pt_eq_1 f c l pr H4). + cut (0 < l / 2); + [ intro + | unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ assumption | apply Rinv_0_lt_compat; prove_sup0 ] ]. + elim (H5 (l / 2) H6); intros delta H7. + cut (0 < (b - c) / 2). + intro; cut (Rmin (delta / 2) ((b - c) / 2) <> 0). + intro; cut (Rabs (Rmin (delta / 2) ((b - c) / 2)) < delta). + intro. + assert (H11 := H7 (Rmin (delta / 2) ((b - c) / 2)) H9 H10). + cut (0 < Rmin (delta / 2) ((b - c) / 2)). + intro; cut (a < c + Rmin (delta / 2) ((b - c) / 2)). + intro; cut (c + Rmin (delta / 2) ((b - c) / 2) < b). + intro; assert (H15 := H1 (c + Rmin (delta / 2) ((b - c) / 2)) H13 H14). + cut + ((f (c + Rmin (delta / 2) ((b - c) / 2)) - f c) / + Rmin (delta / 2) ((b - c) / 2) <= 0). + intro; cut (- l < 0). + intro; unfold Rminus in H11. + cut + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2) + - l < 0). + intro; + cut + (Rabs + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2) + - l) < l / 2). + unfold Rabs in |- *; + case + (Rcase_abs ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2))) (l / 2) H19); - repeat rewrite <- Rplus_assoc; rewrite Rplus_opp_l; - rewrite Rplus_0_l; replace (- l + l / 2) with (- (l / 2)). -intro; - generalize - (Ropp_lt_gt_contravar - (- + Rmin (delta / 2) ((b + - c) / 2) + - l)); intro. + replace + (- + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2) + - l)) with + (l + + - + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2))). + intro; + generalize + (Rplus_lt_compat_l (- l) + (l + + - + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2))) (l / 2) H19); + repeat rewrite <- Rplus_assoc; rewrite Rplus_opp_l; + rewrite Rplus_0_l; replace (- l + l / 2) with (- (l / 2)). + intro; + generalize + (Ropp_lt_gt_contravar + (- + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2))) (- (l / 2)) H20); + repeat rewrite Ropp_involutive; intro; + generalize + (Rlt_trans 0 (l / 2) + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2)) H6 H21); intro; + elim + (Rlt_irrefl 0 + (Rlt_le_trans 0 + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / + Rmin (delta / 2) ((b + - c) / 2)) 0 H22 H16)). + pattern l at 2 in |- *; rewrite double_var. + ring. + ring. + intro. + assert + (H20 := + Rge_le ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2))) (- (l / 2)) H20); - repeat rewrite Ropp_involutive; intro; - generalize - (Rlt_trans 0 (l / 2) - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2)) H6 H21); intro; - elim - (Rlt_irrefl 0 - (Rlt_le_trans 0 - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2)) 0 H22 H16)). -pattern l at 2 in |- *; rewrite double_var. -ring. -ring. -intro. -assert - (H20 := - Rge_le + Rmin (delta / 2) ((b + - c) / 2) + - l) 0 r). + elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H20 H18)). + assumption. + rewrite <- Ropp_0; + replace ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l) 0 r). -elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H20 H18)). -assumption. -rewrite <- Ropp_0; - replace - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) + - f c) / - Rmin (delta / 2) ((b + - c) / 2) + - l) with + Rmin (delta / 2) ((b + - c) / 2) + - l) with + (- + (l + + - + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) - f c) / + Rmin (delta / 2) ((b + - c) / 2)))). + apply Ropp_gt_lt_contravar; + change + (0 < + l + + - + ((f (c + Rmin (delta / 2) ((b + - c) / 2)) - f c) / + Rmin (delta / 2) ((b + - c) / 2))) in |- *; apply Rplus_lt_le_0_compat; + [ assumption + | rewrite <- Ropp_0; apply Ropp_ge_le_contravar; apply Rle_ge; assumption ]. + unfold Rminus; ring. + rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. + replace + ((f (c + Rmin (delta / 2) ((b - c) / 2)) - f c) / + Rmin (delta / 2) ((b - c) / 2)) with (- - (l + - - - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) - f c) / - Rmin (delta / 2) ((b + - c) / 2)))). -apply Ropp_gt_lt_contravar; - change - (0 < - l + - - - ((f (c + Rmin (delta / 2) ((b + - c) / 2)) - f c) / - Rmin (delta / 2) ((b + - c) / 2))) in |- *; apply Rplus_lt_le_0_compat; - [ assumption - | rewrite <- Ropp_0; apply Ropp_ge_le_contravar; apply Rle_ge; assumption ]. -ring. -rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. -replace - ((f (c + Rmin (delta / 2) ((b - c) / 2)) - f c) / - Rmin (delta / 2) ((b - c) / 2)) with - (- - ((f c - f (c + Rmin (delta / 2) ((b - c) / 2))) / - Rmin (delta / 2) ((b - c) / 2))). -rewrite <- Ropp_0; apply Ropp_ge_le_contravar; apply Rle_ge; - unfold Rdiv in |- *; apply Rmult_le_pos; - [ generalize - (Rplus_le_compat_r (- f (c + Rmin (delta * / 2) ((b - c) * / 2))) - (f (c + Rmin (delta * / 2) ((b - c) * / 2))) ( - f c) H15); rewrite Rplus_opp_r; intro; assumption - | left; apply Rinv_0_lt_compat; assumption ]. -unfold Rdiv in |- *. -rewrite <- Ropp_mult_distr_l_reverse. -repeat rewrite <- (Rmult_comm (/ Rmin (delta * / 2) ((b - c) * / 2))). -apply Rmult_eq_reg_l with (Rmin (delta * / 2) ((b - c) * / 2)). -repeat rewrite <- Rmult_assoc. -rewrite <- Rinv_r_sym. -repeat rewrite Rmult_1_l. -ring. -red in |- *; intro. -unfold Rdiv in H12; rewrite H16 in H12; elim (Rlt_irrefl 0 H12). -red in |- *; intro. -unfold Rdiv in H12; rewrite H16 in H12; elim (Rlt_irrefl 0 H12). -assert (H14 := Rmin_r (delta / 2) ((b - c) / 2)). -assert - (H15 := - Rplus_le_compat_l c (Rmin (delta / 2) ((b - c) / 2)) ((b - c) / 2) H14). -apply Rle_lt_trans with (c + (b - c) / 2). -assumption. -apply Rmult_lt_reg_l with 2. -prove_sup0. -replace (2 * (c + (b - c) / 2)) with (c + b). -replace (2 * b) with (b + b). -apply Rplus_lt_compat_r; assumption. -ring. -unfold Rdiv in |- *; rewrite Rmult_plus_distr_l. -repeat rewrite (Rmult_comm 2). -rewrite Rmult_assoc; rewrite <- Rinv_l_sym. -rewrite Rmult_1_r. -ring. -discrR. -apply Rlt_trans with c. -assumption. -pattern c at 1 in |- *; rewrite <- (Rplus_0_r c); apply Rplus_lt_compat_l; - assumption. -cut (0 < delta / 2). -intro; - apply - (Rmin_stable_in_posreal (mkposreal (delta / 2) H12) - (mkposreal ((b - c) / 2) H8)). -unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. -unfold Rabs in |- *; case (Rcase_abs (Rmin (delta / 2) ((b - c) / 2))). -intro. -cut (0 < delta / 2). -intro. -generalize - (Rmin_stable_in_posreal (mkposreal (delta / 2) H10) - (mkposreal ((b - c) / 2) H8)); simpl in |- *; intro; - elim (Rlt_irrefl 0 (Rlt_trans 0 (Rmin (delta / 2) ((b - c) / 2)) 0 H11 r)). -unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. -intro; apply Rle_lt_trans with (delta / 2). -apply Rmin_l. -unfold Rdiv in |- *; apply Rmult_lt_reg_l with 2. -prove_sup0. -rewrite <- (Rmult_comm (/ 2)); rewrite <- Rmult_assoc; rewrite <- Rinv_r_sym. -rewrite Rmult_1_l. -replace (2 * delta) with (delta + delta). -pattern delta at 2 in |- *; rewrite <- (Rplus_0_r delta); - apply Rplus_lt_compat_l. -rewrite Rplus_0_r; apply (cond_pos delta). -symmetry in |- *; apply double. -discrR. -cut (0 < delta / 2). -intro; - generalize - (Rmin_stable_in_posreal (mkposreal (delta / 2) H9) - (mkposreal ((b - c) / 2) H8)); simpl in |- *; - intro; red in |- *; intro; rewrite H11 in H10; elim (Rlt_irrefl 0 H10). -unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. -unfold Rdiv in |- *; apply Rmult_lt_0_compat. -generalize (Rplus_lt_compat_r (- c) c b H0); rewrite Rplus_opp_r; intro; - assumption. -apply Rinv_0_lt_compat; prove_sup0. -elim H2; intro. -symmetry in |- *; assumption. -generalize (derivable_derive f c pr); intro; elim H4; intros l H5. -rewrite H5 in H3; generalize (derive_pt_eq_1 f c l pr H5); intro; - cut (0 < - (l / 2)). -intro; elim (H6 (- (l / 2)) H7); intros delta H9. -cut (0 < (c - a) / 2). -intro; cut (Rmax (- (delta / 2)) ((a - c) / 2) < 0). -intro; cut (Rmax (- (delta / 2)) ((a - c) / 2) <> 0). -intro; cut (Rabs (Rmax (- (delta / 2)) ((a - c) / 2)) < delta). -intro; generalize (H9 (Rmax (- (delta / 2)) ((a - c) / 2)) H11 H12); intro; - cut (a < c + Rmax (- (delta / 2)) ((a - c) / 2)). -cut (c + Rmax (- (delta / 2)) ((a - c) / 2) < b). -intros; generalize (H1 (c + Rmax (- (delta / 2)) ((a - c) / 2)) H15 H14); - intro; - cut - (0 <= - (f (c + Rmax (- (delta / 2)) ((a - c) / 2)) - f c) / - Rmax (- (delta / 2)) ((a - c) / 2)). -intro; cut (0 < - l). -intro; unfold Rminus in H13; - cut - (0 < - (f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2) + - l). -intro; - cut - (Rabs - ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2) + - l) < - - (l / 2)). -unfold Rabs in |- *; - case - (Rcase_abs - ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2) + - l)). -intro; - elim - (Rlt_irrefl 0 - (Rlt_trans 0 + ((f c - f (c + Rmin (delta / 2) ((b - c) / 2))) / + Rmin (delta / 2) ((b - c) / 2))). + rewrite <- Ropp_0; apply Ropp_ge_le_contravar; apply Rle_ge; + unfold Rdiv in |- *; apply Rmult_le_pos; + [ generalize + (Rplus_le_compat_r (- f (c + Rmin (delta * / 2) ((b - c) * / 2))) + (f (c + Rmin (delta * / 2) ((b - c) * / 2))) ( + f c) H15); rewrite Rplus_opp_r; intro; assumption + | left; apply Rinv_0_lt_compat; assumption ]. + unfold Rdiv in |- *. + rewrite <- Ropp_mult_distr_l_reverse. + repeat rewrite <- (Rmult_comm (/ Rmin (delta * / 2) ((b - c) * / 2))). + apply Rmult_eq_reg_l with (Rmin (delta * / 2) ((b - c) * / 2)). + repeat rewrite <- Rmult_assoc. + rewrite <- Rinv_r_sym. + repeat rewrite Rmult_1_l. + ring. + red in |- *; intro. + unfold Rdiv in H12; rewrite H16 in H12; elim (Rlt_irrefl 0 H12). + red in |- *; intro. + unfold Rdiv in H12; rewrite H16 in H12; elim (Rlt_irrefl 0 H12). + assert (H14 := Rmin_r (delta / 2) ((b - c) / 2)). + assert + (H15 := + Rplus_le_compat_l c (Rmin (delta / 2) ((b - c) / 2)) ((b - c) / 2) H14). + apply Rle_lt_trans with (c + (b - c) / 2). + assumption. + apply Rmult_lt_reg_l with 2. + prove_sup0. + replace (2 * (c + (b - c) / 2)) with (c + b). + replace (2 * b) with (b + b). + apply Rplus_lt_compat_r; assumption. + ring. + unfold Rdiv in |- *; rewrite Rmult_plus_distr_l. + repeat rewrite (Rmult_comm 2). + rewrite Rmult_assoc; rewrite <- Rinv_l_sym. + rewrite Rmult_1_r. + ring. + discrR. + apply Rlt_trans with c. + assumption. + pattern c at 1 in |- *; rewrite <- (Rplus_0_r c); apply Rplus_lt_compat_l; + assumption. + cut (0 < delta / 2). + intro; + apply + (Rmin_stable_in_posreal (mkposreal (delta / 2) H12) + (mkposreal ((b - c) / 2) H8)). + unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. + unfold Rabs in |- *; case (Rcase_abs (Rmin (delta / 2) ((b - c) / 2))). + intro. + cut (0 < delta / 2). + intro. + generalize + (Rmin_stable_in_posreal (mkposreal (delta / 2) H10) + (mkposreal ((b - c) / 2) H8)); simpl in |- *; intro; + elim (Rlt_irrefl 0 (Rlt_trans 0 (Rmin (delta / 2) ((b - c) / 2)) 0 H11 r)). + unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. + intro; apply Rle_lt_trans with (delta / 2). + apply Rmin_l. + unfold Rdiv in |- *; apply Rmult_lt_reg_l with 2. + prove_sup0. + rewrite <- (Rmult_comm (/ 2)); rewrite <- Rmult_assoc; rewrite <- Rinv_r_sym. + rewrite Rmult_1_l. + replace (2 * delta) with (delta + delta). + pattern delta at 2 in |- *; rewrite <- (Rplus_0_r delta); + apply Rplus_lt_compat_l. + rewrite Rplus_0_r; apply (cond_pos delta). + symmetry in |- *; apply double. + discrR. + cut (0 < delta / 2). + intro; + generalize + (Rmin_stable_in_posreal (mkposreal (delta / 2) H9) + (mkposreal ((b - c) / 2) H8)); simpl in |- *; + intro; red in |- *; intro; rewrite H11 in H10; elim (Rlt_irrefl 0 H10). + unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. + unfold Rdiv in |- *; apply Rmult_lt_0_compat. + generalize (Rplus_lt_compat_r (- c) c b H0); rewrite Rplus_opp_r; intro; + assumption. + apply Rinv_0_lt_compat; prove_sup0. + elim H2; intro. + symmetry in |- *; assumption. + generalize (derivable_derive f c pr); intro; elim H4; intros l H5. + rewrite H5 in H3; generalize (derive_pt_eq_1 f c l pr H5); intro; + cut (0 < - (l / 2)). + intro; elim (H6 (- (l / 2)) H7); intros delta H9. + cut (0 < (c - a) / 2). + intro; cut (Rmax (- (delta / 2)) ((a - c) / 2) < 0). + intro; cut (Rmax (- (delta / 2)) ((a - c) / 2) <> 0). + intro; cut (Rabs (Rmax (- (delta / 2)) ((a - c) / 2)) < delta). + intro; generalize (H9 (Rmax (- (delta / 2)) ((a - c) / 2)) H11 H12); intro; + cut (a < c + Rmax (- (delta / 2)) ((a - c) / 2)). + cut (c + Rmax (- (delta / 2)) ((a - c) / 2) < b). + intros; generalize (H1 (c + Rmax (- (delta / 2)) ((a - c) / 2)) H15 H14); + intro; + cut + (0 <= + (f (c + Rmax (- (delta / 2)) ((a - c) / 2)) - f c) / + Rmax (- (delta / 2)) ((a - c) / 2)). + intro; cut (0 < - l). + intro; unfold Rminus in H13; + cut + (0 < + (f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / + Rmax (- (delta / 2)) ((a + - c) / 2) + - l). + intro; + cut + (Rabs + ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / + Rmax (- (delta / 2)) ((a + - c) / 2) + - l) < + - (l / 2)). + unfold Rabs in |- *; + case + (Rcase_abs + ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / + Rmax (- (delta / 2)) ((a + - c) / 2) + - l)). + intro; + elim + (Rlt_irrefl 0 + (Rlt_trans 0 + ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / + Rmax (- (delta / 2)) ((a + - c) / 2) + - l) 0 H19 r)). + intros; + generalize + (Rplus_lt_compat_r l + ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / + Rmax (- (delta / 2)) ((a + - c) / 2) + - l) ( + - (l / 2)) H20); repeat rewrite Rplus_assoc; rewrite Rplus_opp_l; + rewrite Rplus_0_r; replace (- (l / 2) + l) with (l / 2). + cut (l / 2 < 0). + intros; + generalize + (Rlt_trans ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2) + - l) 0 H19 r)). -intros; - generalize - (Rplus_lt_compat_r l - ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2) + - l) ( - - (l / 2)) H20); repeat rewrite Rplus_assoc; rewrite Rplus_opp_l; - rewrite Rplus_0_r; replace (- (l / 2) + l) with (l / 2). -cut (l / 2 < 0). -intros; - generalize - (Rlt_trans - ((f (c + Rmax (- (delta / 2)) ((a + - c) / 2)) + - f c) / - Rmax (- (delta / 2)) ((a + - c) / 2)) (l / 2) 0 H22 H21); - intro; - elim - (Rlt_irrefl 0 - (Rle_lt_trans 0 - ((f (c + Rmax (- (delta / 2)) ((a - c) / 2)) - f c) / - Rmax (- (delta / 2)) ((a - c) / 2)) 0 H17 H23)). -rewrite <- (Ropp_involutive (l / 2)); rewrite <- Ropp_0; - apply Ropp_lt_gt_contravar; assumption. -pattern l at 3 in |- *; rewrite double_var. -ring. -assumption. -apply Rplus_le_lt_0_compat; assumption. -rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. -unfold Rdiv in |- *; - replace - ((f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c) * - / Rmax (- (delta * / 2)) ((a - c) * / 2)) with - (- (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c) * - / - Rmax (- (delta * / 2)) ((a - c) * / 2)). -apply Rmult_le_pos. -generalize - (Rplus_le_compat_l (- f (c + Rmax (- (delta * / 2)) ((a - c) * / 2))) - (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2))) ( - f c) H16); rewrite Rplus_opp_l; - replace (- (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c)) with - (- f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) + f c). -intro; assumption. -ring. -left; apply Rinv_0_lt_compat; rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; - assumption. -unfold Rdiv in |- *. -rewrite <- Ropp_inv_permute. -rewrite Rmult_opp_opp. -reflexivity. -unfold Rdiv in H11; assumption. -generalize (Rplus_lt_compat_l c (Rmax (- (delta / 2)) ((a - c) / 2)) 0 H10); - rewrite Rplus_0_r; intro; apply Rlt_trans with c; - assumption. -generalize (RmaxLess2 (- (delta / 2)) ((a - c) / 2)); intro; - generalize - (Rplus_le_compat_l c ((a - c) / 2) (Rmax (- (delta / 2)) ((a - c) / 2)) H14); - intro; apply Rlt_le_trans with (c + (a - c) / 2). -apply Rmult_lt_reg_l with 2. -prove_sup0. -replace (2 * (c + (a - c) / 2)) with (a + c). -rewrite double. -apply Rplus_lt_compat_l; assumption. -ring. -rewrite <- Rplus_assoc. -rewrite <- double_var. -ring. -assumption. -unfold Rabs in |- *; case (Rcase_abs (Rmax (- (delta / 2)) ((a - c) / 2))). -intro; generalize (RmaxLess1 (- (delta / 2)) ((a - c) / 2)); intro; - generalize - (Ropp_le_ge_contravar (- (delta / 2)) (Rmax (- (delta / 2)) ((a - c) / 2)) - H12); rewrite Ropp_involutive; intro; - generalize (Rge_le (delta / 2) (- Rmax (- (delta / 2)) ((a - c) / 2)) H13); - intro; apply Rle_lt_trans with (delta / 2). -assumption. -apply Rmult_lt_reg_l with 2. -prove_sup0. -unfold Rdiv in |- *; rewrite <- (Rmult_comm (/ 2)); rewrite <- Rmult_assoc; - rewrite <- Rinv_r_sym. -rewrite Rmult_1_l; rewrite double. -pattern delta at 2 in |- *; rewrite <- (Rplus_0_r delta); - apply Rplus_lt_compat_l; rewrite Rplus_0_r; apply (cond_pos delta). -discrR. -cut (- (delta / 2) < 0). -cut ((a - c) / 2 < 0). -intros; - generalize - (Rmax_stable_in_negreal (mknegreal (- (delta / 2)) H13) - (mknegreal ((a - c) / 2) H12)); simpl in |- *; - intro; generalize (Rge_le (Rmax (- (delta / 2)) ((a - c) / 2)) 0 r); - intro; - elim - (Rlt_irrefl 0 - (Rle_lt_trans 0 (Rmax (- (delta / 2)) ((a - c) / 2)) 0 H15 H14)). -rewrite <- Ropp_0; rewrite <- (Ropp_involutive ((a - c) / 2)); - apply Ropp_lt_gt_contravar; replace (- ((a - c) / 2)) with ((c - a) / 2). -assumption. -unfold Rdiv in |- *. -rewrite <- Ropp_mult_distr_l_reverse. -rewrite (Ropp_minus_distr a c). -reflexivity. -rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; unfold Rdiv in |- *; - apply Rmult_lt_0_compat; - [ apply (cond_pos delta) - | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. -red in |- *; intro; rewrite H11 in H10; elim (Rlt_irrefl 0 H10). -cut ((a - c) / 2 < 0). -intro; cut (- (delta / 2) < 0). -intro; - apply - (Rmax_stable_in_negreal (mknegreal (- (delta / 2)) H11) - (mknegreal ((a - c) / 2) H10)). -rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; unfold Rdiv in |- *; - apply Rmult_lt_0_compat; - [ apply (cond_pos delta) - | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. -rewrite <- Ropp_0; rewrite <- (Ropp_involutive ((a - c) / 2)); - apply Ropp_lt_gt_contravar; replace (- ((a - c) / 2)) with ((c - a) / 2). -assumption. -unfold Rdiv in |- *. -rewrite <- Ropp_mult_distr_l_reverse. -rewrite (Ropp_minus_distr a c). -reflexivity. -unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ generalize (Rplus_lt_compat_r (- a) a c H); rewrite Rplus_opp_r; intro; - assumption - | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. -replace (- (l / 2)) with (- l / 2). -unfold Rdiv in |- *; apply Rmult_lt_0_compat. -rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. -assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ]. -unfold Rdiv in |- *; apply Ropp_mult_distr_l_reverse. + Rmax (- (delta / 2)) ((a + - c) / 2)) (l / 2) 0 H22 H21); + intro; + elim + (Rlt_irrefl 0 + (Rle_lt_trans 0 + ((f (c + Rmax (- (delta / 2)) ((a - c) / 2)) - f c) / + Rmax (- (delta / 2)) ((a - c) / 2)) 0 H17 H23)). + rewrite <- (Ropp_involutive (l / 2)); rewrite <- Ropp_0; + apply Ropp_lt_gt_contravar; assumption. + pattern l at 3 in |- *; rewrite double_var. + ring. + assumption. + apply Rplus_le_lt_0_compat; assumption. + rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. + unfold Rdiv in |- *; + replace + ((f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c) * + / Rmax (- (delta * / 2)) ((a - c) * / 2)) with + (- (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c) * + / - Rmax (- (delta * / 2)) ((a - c) * / 2)). + apply Rmult_le_pos. + generalize + (Rplus_le_compat_l (- f (c + Rmax (- (delta * / 2)) ((a - c) * / 2))) + (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2))) ( + f c) H16); rewrite Rplus_opp_l; + replace (- (f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) - f c)) with + (- f (c + Rmax (- (delta * / 2)) ((a - c) * / 2)) + f c). + intro; assumption. + ring. + left; apply Rinv_0_lt_compat; rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; + assumption. + unfold Rdiv in |- *. + rewrite <- Ropp_inv_permute. + rewrite Rmult_opp_opp. + reflexivity. + unfold Rdiv in H11; assumption. + generalize (Rplus_lt_compat_l c (Rmax (- (delta / 2)) ((a - c) / 2)) 0 H10); + rewrite Rplus_0_r; intro; apply Rlt_trans with c; + assumption. + generalize (RmaxLess2 (- (delta / 2)) ((a - c) / 2)); intro; + generalize + (Rplus_le_compat_l c ((a - c) / 2) (Rmax (- (delta / 2)) ((a - c) / 2)) H14); + intro; apply Rlt_le_trans with (c + (a - c) / 2). + apply Rmult_lt_reg_l with 2. + prove_sup0. + replace (2 * (c + (a - c) / 2)) with (a + c). + rewrite double. + apply Rplus_lt_compat_l; assumption. + field; discrR. + assumption. + unfold Rabs in |- *; case (Rcase_abs (Rmax (- (delta / 2)) ((a - c) / 2))). + intro; generalize (RmaxLess1 (- (delta / 2)) ((a - c) / 2)); intro; + generalize + (Ropp_le_ge_contravar (- (delta / 2)) (Rmax (- (delta / 2)) ((a - c) / 2)) + H12); rewrite Ropp_involutive; intro; + generalize (Rge_le (delta / 2) (- Rmax (- (delta / 2)) ((a - c) / 2)) H13); + intro; apply Rle_lt_trans with (delta / 2). + assumption. + apply Rmult_lt_reg_l with 2. + prove_sup0. + unfold Rdiv in |- *; rewrite <- (Rmult_comm (/ 2)); rewrite <- Rmult_assoc; + rewrite <- Rinv_r_sym. + rewrite Rmult_1_l; rewrite double. + pattern delta at 2 in |- *; rewrite <- (Rplus_0_r delta); + apply Rplus_lt_compat_l; rewrite Rplus_0_r; apply (cond_pos delta). + discrR. + cut (- (delta / 2) < 0). + cut ((a - c) / 2 < 0). + intros; + generalize + (Rmax_stable_in_negreal (mknegreal (- (delta / 2)) H13) + (mknegreal ((a - c) / 2) H12)); simpl in |- *; + intro; generalize (Rge_le (Rmax (- (delta / 2)) ((a - c) / 2)) 0 r); + intro; + elim + (Rlt_irrefl 0 + (Rle_lt_trans 0 (Rmax (- (delta / 2)) ((a - c) / 2)) 0 H15 H14)). + rewrite <- Ropp_0; rewrite <- (Ropp_involutive ((a - c) / 2)); + apply Ropp_lt_gt_contravar; replace (- ((a - c) / 2)) with ((c - a) / 2). + assumption. + unfold Rdiv in |- *. + rewrite <- Ropp_mult_distr_l_reverse. + rewrite (Ropp_minus_distr a c). + reflexivity. + rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; unfold Rdiv in |- *; + apply Rmult_lt_0_compat; + [ apply (cond_pos delta) + | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. + red in |- *; intro; rewrite H11 in H10; elim (Rlt_irrefl 0 H10). + cut ((a - c) / 2 < 0). + intro; cut (- (delta / 2) < 0). + intro; + apply + (Rmax_stable_in_negreal (mknegreal (- (delta / 2)) H11) + (mknegreal ((a - c) / 2) H10)). + rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; unfold Rdiv in |- *; + apply Rmult_lt_0_compat; + [ apply (cond_pos delta) + | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. + rewrite <- Ropp_0; rewrite <- (Ropp_involutive ((a - c) / 2)); + apply Ropp_lt_gt_contravar; replace (- ((a - c) / 2)) with ((c - a) / 2). + assumption. + unfold Rdiv in |- *. + rewrite <- Ropp_mult_distr_l_reverse. + rewrite (Ropp_minus_distr a c). + reflexivity. + unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ generalize (Rplus_lt_compat_r (- a) a c H); rewrite Rplus_opp_r; intro; + assumption + | assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ] ]. + replace (- (l / 2)) with (- l / 2). + unfold Rdiv in |- *; apply Rmult_lt_0_compat. + rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. + assert (Hyp : 0 < 2); [ prove_sup0 | apply (Rinv_0_lt_compat 2 Hyp) ]. + unfold Rdiv in |- *; apply Ropp_mult_distr_l_reverse. Qed. Theorem deriv_minimum : - forall f (a b c:R) (pr:derivable_pt f c), - a < c -> - c < b -> - (forall x:R, a < x -> x < b -> f c <= f x) -> derive_pt f c pr = 0. -intros. -rewrite <- (Ropp_involutive (derive_pt f c pr)). -apply Ropp_eq_0_compat. -rewrite <- (derive_pt_opp f c pr). -cut (forall x:R, a < x -> x < b -> (- f)%F x <= (- f)%F c). -intro. -apply (deriv_maximum (- f)%F a b c (derivable_pt_opp _ _ pr) H H0 H2). -intros; unfold opp_fct in |- *; apply Ropp_ge_le_contravar; apply Rle_ge. -apply (H1 x H2 H3). -Qed. - + forall f (a b c:R) (pr:derivable_pt f c), + a < c -> + c < b -> + (forall x:R, a < x -> x < b -> f c <= f x) -> derive_pt f c pr = 0. +Proof. + intros. + rewrite <- (Ropp_involutive (derive_pt f c pr)). + apply Ropp_eq_0_compat. + rewrite <- (derive_pt_opp f c pr). + cut (forall x:R, a < x -> x < b -> (- f)%F x <= (- f)%F c). + intro. + apply (deriv_maximum (- f)%F a b c (derivable_pt_opp _ _ pr) H H0 H2). + intros; unfold opp_fct in |- *; apply Ropp_ge_le_contravar; apply Rle_ge. + apply (H1 x H2 H3). +Qed. + Theorem deriv_constant2 : - forall f (a b c:R) (pr:derivable_pt f c), - a < c -> - c < b -> (forall x:R, a < x -> x < b -> f x = f c) -> derive_pt f c pr = 0. -intros. -eapply deriv_maximum with a b; try assumption. -intros; right; apply (H1 x H2 H3). + forall f (a b c:R) (pr:derivable_pt f c), + a < c -> + c < b -> (forall x:R, a < x -> x < b -> f x = f c) -> derive_pt f c pr = 0. +Proof. + intros. + eapply deriv_maximum with a b; try assumption. + intros; right; apply (H1 x H2 H3). Qed. (**********) Lemma nonneg_derivative_0 : - forall f (pr:derivable f), - increasing f -> forall x:R, 0 <= derive_pt f x (pr x). -intros; unfold increasing in H. -assert (H0 := derivable_derive f x (pr x)). -elim H0; intros l H1. -rewrite H1; case (Rtotal_order 0 l); intro. -left; assumption. -elim H2; intro. -right; assumption. -assert (H4 := derive_pt_eq_1 f x l (pr x) H1). -cut (0 < - (l / 2)). -intro; elim (H4 (- (l / 2)) H5); intros delta H6. -cut (delta / 2 <> 0 /\ 0 < delta / 2 /\ Rabs (delta / 2) < delta). -intro; decompose [and] H7; intros; generalize (H6 (delta / 2) H8 H11); - cut (0 <= (f (x + delta / 2) - f x) / (delta / 2)). -intro; cut (0 <= (f (x + delta / 2) - f x) / (delta / 2) - l). -intro; unfold Rabs in |- *; - case (Rcase_abs ((f (x + delta / 2) - f x) / (delta / 2) - l)). -intro; - elim - (Rlt_irrefl 0 - (Rle_lt_trans 0 ((f (x + delta / 2) - f x) / (delta / 2) - l) 0 H12 r)). -intros; - generalize - (Rplus_lt_compat_r l ((f (x + delta / 2) - f x) / (delta / 2) - l) - (- (l / 2)) H13); unfold Rminus in |- *; - replace (- (l / 2) + l) with (l / 2). -rewrite Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_r; intro; - generalize - (Rle_lt_trans 0 ((f (x + delta / 2) - f x) / (delta / 2)) (l / 2) H9 H14); - intro; cut (l / 2 < 0). -intro; elim (Rlt_irrefl 0 (Rlt_trans 0 (l / 2) 0 H15 H16)). -rewrite <- Ropp_0 in H5; - generalize (Ropp_lt_gt_contravar (-0) (- (l / 2)) H5); - repeat rewrite Ropp_involutive; intro; assumption. -pattern l at 3 in |- *; rewrite double_var. -ring. -unfold Rminus in |- *; apply Rplus_le_le_0_compat. -unfold Rdiv in |- *; apply Rmult_le_pos. -cut (x <= x + delta * / 2). -intro; generalize (H x (x + delta * / 2) H12); intro; - generalize (Rplus_le_compat_l (- f x) (f x) (f (x + delta * / 2)) H13); - rewrite Rplus_opp_l; rewrite Rplus_comm; intro; assumption. -pattern x at 1 in |- *; rewrite <- (Rplus_0_r x); apply Rplus_le_compat_l; - left; assumption. -left; apply Rinv_0_lt_compat; assumption. -left; rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. -unfold Rdiv in |- *; apply Rmult_le_pos. -cut (x <= x + delta * / 2). -intro; generalize (H x (x + delta * / 2) H9); intro; - generalize (Rplus_le_compat_l (- f x) (f x) (f (x + delta * / 2)) H12); - rewrite Rplus_opp_l; rewrite Rplus_comm; intro; assumption. -pattern x at 1 in |- *; rewrite <- (Rplus_0_r x); apply Rplus_le_compat_l; - left; assumption. -left; apply Rinv_0_lt_compat; assumption. -split. -unfold Rdiv in |- *; apply prod_neq_R0. -generalize (cond_pos delta); intro; red in |- *; intro H9; rewrite H9 in H7; - elim (Rlt_irrefl 0 H7). -apply Rinv_neq_0_compat; discrR. -split. -unfold Rdiv in |- *; apply Rmult_lt_0_compat; - [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. -replace (Rabs (delta / 2)) with (delta / 2). -unfold Rdiv in |- *; apply Rmult_lt_reg_l with 2. -prove_sup0. -rewrite (Rmult_comm 2). -rewrite Rmult_assoc; rewrite <- Rinv_l_sym; [ idtac | discrR ]. -rewrite Rmult_1_r. -rewrite double. -pattern (pos delta) at 1 in |- *; rewrite <- Rplus_0_r. -apply Rplus_lt_compat_l; apply (cond_pos delta). -symmetry in |- *; apply Rabs_right. -left; change (0 < delta / 2) in |- *; unfold Rdiv in |- *; - apply Rmult_lt_0_compat; - [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. -unfold Rdiv in |- *; rewrite <- Ropp_mult_distr_l_reverse; - apply Rmult_lt_0_compat. -apply Rplus_lt_reg_r with l. -unfold Rminus in |- *; rewrite Rplus_opp_r; rewrite Rplus_0_r; assumption. -apply Rinv_0_lt_compat; prove_sup0. + forall f (pr:derivable f), + increasing f -> forall x:R, 0 <= derive_pt f x (pr x). +Proof. + intros; unfold increasing in H. + assert (H0 := derivable_derive f x (pr x)). + elim H0; intros l H1. + rewrite H1; case (Rtotal_order 0 l); intro. + left; assumption. + elim H2; intro. + right; assumption. + assert (H4 := derive_pt_eq_1 f x l (pr x) H1). + cut (0 < - (l / 2)). + intro; elim (H4 (- (l / 2)) H5); intros delta H6. + cut (delta / 2 <> 0 /\ 0 < delta / 2 /\ Rabs (delta / 2) < delta). + intro; decompose [and] H7; intros; generalize (H6 (delta / 2) H8 H11); + cut (0 <= (f (x + delta / 2) - f x) / (delta / 2)). + intro; cut (0 <= (f (x + delta / 2) - f x) / (delta / 2) - l). + intro; unfold Rabs in |- *; + case (Rcase_abs ((f (x + delta / 2) - f x) / (delta / 2) - l)). + intro; + elim + (Rlt_irrefl 0 + (Rle_lt_trans 0 ((f (x + delta / 2) - f x) / (delta / 2) - l) 0 H12 r)). + intros; + generalize + (Rplus_lt_compat_r l ((f (x + delta / 2) - f x) / (delta / 2) - l) + (- (l / 2)) H13); unfold Rminus in |- *; + replace (- (l / 2) + l) with (l / 2). + rewrite Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_r; intro; + generalize + (Rle_lt_trans 0 ((f (x + delta / 2) - f x) / (delta / 2)) (l / 2) H9 H14); + intro; cut (l / 2 < 0). + intro; elim (Rlt_irrefl 0 (Rlt_trans 0 (l / 2) 0 H15 H16)). + rewrite <- Ropp_0 in H5; + generalize (Ropp_lt_gt_contravar (-0) (- (l / 2)) H5); + repeat rewrite Ropp_involutive; intro; assumption. + pattern l at 3 in |- *; rewrite double_var. + ring. + unfold Rminus in |- *; apply Rplus_le_le_0_compat. + unfold Rdiv in |- *; apply Rmult_le_pos. + cut (x <= x + delta * / 2). + intro; generalize (H x (x + delta * / 2) H12); intro; + generalize (Rplus_le_compat_l (- f x) (f x) (f (x + delta * / 2)) H13); + rewrite Rplus_opp_l; rewrite Rplus_comm; intro; assumption. + pattern x at 1 in |- *; rewrite <- (Rplus_0_r x); apply Rplus_le_compat_l; + left; assumption. + left; apply Rinv_0_lt_compat; assumption. + left; rewrite <- Ropp_0; apply Ropp_lt_gt_contravar; assumption. + unfold Rdiv in |- *; apply Rmult_le_pos. + cut (x <= x + delta * / 2). + intro; generalize (H x (x + delta * / 2) H9); intro; + generalize (Rplus_le_compat_l (- f x) (f x) (f (x + delta * / 2)) H12); + rewrite Rplus_opp_l; rewrite Rplus_comm; intro; assumption. + pattern x at 1 in |- *; rewrite <- (Rplus_0_r x); apply Rplus_le_compat_l; + left; assumption. + left; apply Rinv_0_lt_compat; assumption. + split. + unfold Rdiv in |- *; apply prod_neq_R0. + generalize (cond_pos delta); intro; red in |- *; intro H9; rewrite H9 in H7; + elim (Rlt_irrefl 0 H7). + apply Rinv_neq_0_compat; discrR. + split. + unfold Rdiv in |- *; apply Rmult_lt_0_compat; + [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. + replace (Rabs (delta / 2)) with (delta / 2). + unfold Rdiv in |- *; apply Rmult_lt_reg_l with 2. + prove_sup0. + rewrite (Rmult_comm 2). + rewrite Rmult_assoc; rewrite <- Rinv_l_sym; [ idtac | discrR ]. + rewrite Rmult_1_r. + rewrite double. + pattern (pos delta) at 1 in |- *; rewrite <- Rplus_0_r. + apply Rplus_lt_compat_l; apply (cond_pos delta). + symmetry in |- *; apply Rabs_right. + left; change (0 < delta / 2) in |- *; unfold Rdiv in |- *; + apply Rmult_lt_0_compat; + [ apply (cond_pos delta) | apply Rinv_0_lt_compat; prove_sup0 ]. + unfold Rdiv in |- *; rewrite <- Ropp_mult_distr_l_reverse; + apply Rmult_lt_0_compat. + apply Rplus_lt_reg_r with l. + unfold Rminus in |- *; rewrite Rplus_opp_r; rewrite Rplus_0_r; assumption. + apply Rinv_0_lt_compat; prove_sup0. Qed. |