From da606ab124e00e243ca8e55580b2acc2d1db1565 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Sat, 3 Oct 2020 14:18:04 +0200
Subject: [PATCH] Define `Qp` numerals in terms of `pos_to_Qp`.

---
 theories/numbers.v | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/theories/numbers.v b/theories/numbers.v
index 491d4522..20a835ca 100644
--- a/theories/numbers.v
+++ b/theories/numbers.v
@@ -685,8 +685,6 @@ Proof.
     by rewrite <-Qp_to_Qc_inj_iff.
 Defined.
 
-Definition Qp_one : Qp := mk_Qp 1 eq_refl.
-
 Definition Qp_plus (p q : Qp) : Qp :=
   let 'mk_Qp p Hp := p in let 'mk_Qp q Hq := q in
   mk_Qp (p + q) (Qcplus_pos_pos _ _ Hp Hq).
@@ -718,10 +716,14 @@ Infix "*" := Qp_mult : Qp_scope.
 Notation "/ q" := (Qp_inv q) : Qp_scope.
 Infix "/" := Qp_div : Qp_scope.
 
-Notation "1" := Qp_one : Qp_scope.
-Notation "2" := (1 + 1)%Qp : Qp_scope.
-Notation "3" := (1 + 2)%Qp : Qp_scope.
-Notation "4" := (1 + 3)%Qp : Qp_scope.
+Program Definition pos_to_Qp (n : positive) : Qp := mk_Qp (Z.pos n) _.
+Next Obligation. intros n. by rewrite <-Z2Qc_inj_0, <-Z2Qc_inj_lt. Qed.
+Arguments pos_to_Qp : simpl never.
+
+Notation "1" := (pos_to_Qp 1) : Qp_scope.
+Notation "2" := (pos_to_Qp 2) : Qp_scope.
+Notation "3" := (pos_to_Qp 3) : Qp_scope.
+Notation "4" := (pos_to_Qp 4) : Qp_scope.
 
 Definition Qp_le (p q : Qp) : Prop :=
   let 'mk_Qp p _ := p in let 'mk_Qp q _ := q in (p ≤ q)%Qc.
@@ -764,10 +766,6 @@ Definition Qp_min (q p : Qp) : Qp := if decide (q ≤ p) then q else p.
 Infix "`max`" := Qp_max : Qp_scope.
 Infix "`min`" := Qp_min : Qp_scope.
 
-Program Definition pos_to_Qp (n : positive) : Qp := mk_Qp (Z.pos n) _.
-Next Obligation. intros n. by rewrite <-Z2Qc_inj_0, <-Z2Qc_inj_lt. Qed.
-Arguments pos_to_Qp : simpl never.
-
 Instance Qp_inhabited : Inhabited Qp := populate 1.
 
 Instance Qp_plus_assoc : Assoc (=) Qp_plus.
@@ -809,13 +807,15 @@ Proof. destruct p; apply Qp_to_Qc_inj_iff, Qcmult_1_l. Qed.
 Lemma Qp_mult_1_r p : p * 1 = p.
 Proof. destruct p; apply Qp_to_Qc_inj_iff, Qcmult_1_r. Qed.
 
+Lemma Qp_one_one : 1 + 1 = 2.
+Proof. apply (bool_decide_unpack _); by compute. Qed.
 Lemma Qp_plus_diag p : p + p = (2 * p).
-Proof. by rewrite Qp_mult_plus_distr_l, !Qp_mult_1_l. Qed.
+Proof. by rewrite <-Qp_one_one, Qp_mult_plus_distr_l, !Qp_mult_1_l. Qed.
 
 Lemma Qp_mult_inv_l p : /p * p = 1.
 Proof.
-  destruct p as [p ?].
-  by apply Qp_to_Qc_inj_iff, Qcmult_inv_l, not_symmetry, Qclt_not_eq.
+  destruct p as [p ?]; apply Qp_to_Qc_inj_iff; simpl.
+  by rewrite Qcmult_inv_l, Z2Qc_inj_1 by (by apply not_symmetry, Qclt_not_eq).
 Qed.
 Lemma Qp_mult_inv_r p : p * /p = 1.
 Proof. by rewrite (comm_L Qp_mult), Qp_mult_inv_l. Qed.
-- 
GitLab