intros; cut (n < last (M N)).
intro; generalize (inter31a N n H H1);
rewrite <-
(first_eq_M_N alpha_irr prop_alpha prop_N N (M N) (refl_equal (M N)))
; intro; apply (tech_fp_alp_irr alpha_irr (after (M N) n) (after N n));
apply
(Rge_antisym (frac_part_n_alpha (after (M N) n))
(frac_part_n_alpha (after N n))).
apply
(Rnot_lt_ge (frac_part_n_alpha (after (M N) n))
(frac_part_n_alpha (after N n))); red in |- *;
intro; cut (0 < after (M N) n).
intro; cut (after (M N) n < N).
intro; cut (frac_part_n_alpha n < frac_part_n_alpha (after (M N) n))%R.
intro;
generalize
(tech_suc_N N n H (contra_lt_minus_p n N (first N) H0)
(after (M N) n) H4 H5 H6
(Rlt_dichotomy_converse (frac_part_n_alpha (after (M N) n))
(frac_part_n_alpha (after N n))
(or_introl
(frac_part_n_alpha (after (M N) n) > frac_part_n_alpha (after N n))%R
H3))); intro;
generalize
(Rlt_asym (frac_part_n_alpha (after (M N) n))
(frac_part_n_alpha (after N n)) H3); intro; elimtype False;
auto with arith real.
apply
(tech_after_lt (M N) n (after (M N) n) H
(lt_le_trans n N (M N) (contra_lt_minus_p n N (first N) H0)
(le_N_M alpha_irr prop_alpha prop_N N (M N) (refl_equal (M N)))));
auto with arith real.
rewrite H2; red in |- *; intro; apply (lt_O_plus_eq n (first N) H);
auto with arith real.
rewrite H2; apply (lt_n_minus_plus n N (first N) H0).
rewrite H2; apply (lt_O_plus n (first N) H).
(**)
apply
(Rnot_lt_ge (frac_part_n_alpha (after N n))
(frac_part_n_alpha (after (M N) n))); red in |- *;
intro; apply (prop_after (M N) n (after (M N) n));
auto with arith real.
split with (after N n); split.
unfold after in |- *;
case (exist_after_M (frac_part_n_alpha n) (P1 n) (P2 n) N).
intro; elim s; intros x y; elim y; intros; assumption.
intro; generalize (a (last N) (le_O_n (last N)) (last_N N (prop_N N))); intro;
elim H4; intros; clear a H4;
generalize
(last_n N n (prop_N N) H (contra_lt_minus_p n N (first N) H0) prop_alpha);
intro; cut (frac_part_n_alpha n = frac_part_n_alpha (last N)).
intro; generalize (tech_fp_alp_irr alpha_irr n (last N) H7);
rewrite (last_eq_M_N alpha_irr prop_alpha prop_N N (M N));
auto with arith real.
intro; generalize (lt_not_eq n (last (M N)) H1); intro; elimtype False;
auto with arith real.
elim (Rle_le_eq (frac_part_n_alpha n) (frac_part_n_alpha (last N))); intros;
clear H8; apply H7; auto with arith real.
split.
cut (after N n < N).
intro;
apply
(lt_le_trans (after N n) N (M N) H4
(le_N_M alpha_irr prop_alpha prop_N N (M N) (refl_equal (M N)))).
unfold after in |- *;
case (exist_after_M (frac_part_n_alpha n) (P1 n) (P2 n) N).
intro; elim s; intros x y; elim y; intros; elim H5; intros; assumption.
intro; apply (arith_2_0 N (prop_N N)).
split; auto with arith real.
apply (tech_after_lt N n (after N n) H (contra_lt_minus_p n N (first N) H0));
auto with arith real.
red in |- *; unfold after in |- *;
case (exist_after_M (frac_part_n_alpha n) (P1 n) (P2 n) N).
intro; elim s; intros x y H4; elim y; intros; generalize (lt_not_eq 0 x H5);
intro; auto with arith real.
intros; generalize (a (last N) (le_O_n (last N)) (last_N N (prop_N N)));
intro; elim H5; intros; clear a H5;
generalize
(last_n N n (prop_N N) H (contra_lt_minus_p n N (first N) H0) prop_alpha);
intro; cut (frac_part_n_alpha n = frac_part_n_alpha (last N)).
intro; generalize (tech_fp_alp_irr alpha_irr n (last N) H8);
rewrite (last_eq_M_N alpha_irr prop_alpha prop_N N (M N));
auto with arith real.
intro; generalize (lt_not_eq n (last (M N)) H1); intro; elimtype False;
auto with arith real.
elim (Rle_le_eq (frac_part_n_alpha n) (frac_part_n_alpha (last N))); intros;
clear H9; apply H8; auto with arith real.
cut (N - first N <= last (M N)).
intro; apply (lt_le_trans n (N - first N) (last (M N)) H0 H1).
generalize (le_N_M alpha_irr prop_alpha prop_N N (M N) (refl_equal (M N)));
unfold M at 1 in |- *;
rewrite <-
(last_eq_M_N alpha_irr prop_alpha prop_N N (M N) (refl_equal (M N)))
; intro; apply (le_plus_min N (first N) (last N) H1).
Qed.

(* Specifications: *)
(**********)
Lemma eq_after_M_N2 :
forall N n : nat, last N <= n -> n < N -> after (M N) n = after N n.