(************************************************************************)
(*         *      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)         *)
(************************************************************************)
(** Normalisation functions for rational numbers. *)
Require Export QArith_base.
Notation Z2P := Z.to_pos (only parsing).
Notation Z2P_correct := Z2Pos.id (only parsing).
(** Simplification of fractions using [Z.gcd]. This version can compute within Coq. *)
Definition Qred (q:Q) :=
let (q1,q2) := q in
let (r1,r2) := snd (Z.ggcd q1 (Zpos q2))
in r1#(Z.to_pos r2).

(* Specifications: *)
Lemma Qred_correct : forall q, (Qred q) == q.
Lemma Qred_complete : forall p q,  p==q -> Qred p = Qred q.
Lemma Qred_eq_iff q q' : Qred q = Qred q' <-> q == q'.
Add Morphism Qred with signature (Qeq ==> Qeq) as Qred_comp.