(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
(**********************************************************)
(** Complements for the reals.Integer and fractional part *)
(*                                                        *)
(**********************************************************)
Local Open Scope R_scope.
(*********************************************************)
(** *    Fractional part                                 *)
(*********************************************************)
(**********)
Definition Int_part (r:R) : Z := (up r - 1)%Z.
(**********)
Definition frac_part (r:R) : R := r - IZR (Int_part r).

(* Specifications: *)
(**********)
(* TODO: rename this, this is not a technical lemma but the specification of up. *)
Lemma tech_up : forall (r:R) (z:Z), r < IZR z -> IZR z <= r + 1 -> z = up r.
Lemma Int_part_spec : forall r z, r - 1 < IZR z <= r -> z = Int_part r.
(**********)
Lemma up_tech :
forall (r:R) (z:Z), IZR z <= r -> r < IZR (z + 1) -> (z + 1)%Z = up r.
(**********)
Lemma fp_R0 : frac_part 0 = 0.
(**********)
Lemma for_base_fp : forall r:R, IZR (up r) - r > 0 /\ IZR (up r) - r <= 1.
(**********)
Lemma base_fp : forall r:R, frac_part r >= 0 /\ frac_part r < 1.
(*********************************************************)
(** *    Properties                                      *)
(*********************************************************)
(**********)
Lemma base_Int_part :
forall r:R, IZR (Int_part r) <= r /\ IZR (Int_part r) - r > -1.
(**********)
Lemma Int_part_INR : forall n:nat, Int_part (INR n) = Z.of_nat n.
(**********)
Lemma fp_nat : forall r:R, frac_part r = 0 ->  exists c : Z, r = IZR c.
(**********)
Lemma R0_fp_O : forall r:R, 0 <> frac_part r -> 0 <> r.
Lemma Rplus_Int_part_frac_part : forall r, r = IZR (Int_part r) + frac_part r.
(**********)
Lemma Rminus_Int_part1 :
forall r1 r2:R,
frac_part r1 >= frac_part r2 ->
Int_part (r1 - r2) = (Int_part r1 - Int_part r2)%Z.
(**********)
Lemma Rminus_Int_part2 :
forall r1 r2:R,
frac_part r1 < frac_part r2 ->
Int_part (r1 - r2) = (Int_part r1 - Int_part r2 - 1)%Z.
(**********)
Lemma Rminus_fp1 :
forall r1 r2:R,
frac_part r1 >= frac_part r2 ->
frac_part (r1 - r2) = frac_part r1 - frac_part r2.
(**********)
Lemma Rminus_fp2 :
forall r1 r2:R,
frac_part r1 < frac_part r2 ->
frac_part (r1 - r2) = frac_part r1 - frac_part r2 + 1.
(**********)
Lemma plus_Int_part1 :
forall r1 r2:R,
frac_part r1 + frac_part r2 >= 1 ->
Int_part (r1 + r2) = (Int_part r1 + Int_part r2 + 1)%Z.
(**********)
Lemma plus_Int_part2 :
forall r1 r2:R,
frac_part r1 + frac_part r2 < 1 ->
Int_part (r1 + r2) = (Int_part r1 + Int_part r2)%Z.
(**********)
Lemma plus_frac_part1 :
forall r1 r2:R,
frac_part r1 + frac_part r2 >= 1 ->
frac_part (r1 + r2) = frac_part r1 + frac_part r2 - 1.
(**********)
Lemma plus_frac_part2 :
forall r1 r2:R,
frac_part r1 + frac_part r2 < 1 ->
frac_part (r1 + r2) = frac_part r1 + frac_part r2.