diff --git a/theories/countable.v b/theories/countable.v index 0a8a4ba1cb82511ba4d50a0e1079318021127bfb..2c07d66bcb93bc1ad91a0e96b9d9debb6be95b87 100644 --- a/theories/countable.v +++ b/theories/countable.v @@ -273,7 +273,7 @@ Program Instance Qp_countable : Countable Qp := (λ p : Qc, guard (0 < p)%Qc as Hp; Some (mk_Qp p Hp)) _. Next Obligation. intros [p Hp]. unfold mguard, option_guard; simpl. - case_match; [|done]. f_equal. by apply Qp_eq. + case_match; [|done]. f_equal. by apply Qp_to_Qc_inj_iff. Qed. Program Instance fin_countable n : Countable (fin n) := diff --git a/theories/numbers.v b/theories/numbers.v index 8c3195078b0977f95678d54b9a95cdd54d012d2c..96bc254005460a4000bf15d51700c1c8457dd73d 100644 --- a/theories/numbers.v +++ b/theories/numbers.v @@ -733,62 +733,59 @@ Infix "`min`" := Qp_min : Qp_scope. Hint Extern 0 (_ ≤ _)%Qp => reflexivity : core. -Lemma Qp_eq p q : p = q ↔ Qp_to_Qc p = Qp_to_Qc q. +Lemma Qp_to_Qc_inj_iff p q : Qp_to_Qc p = Qp_to_Qc q ↔ p = q. Proof. - split; [by intros ->|]. + split; [|by intros ->]. destruct p, q; intros; simplify_eq/=; f_equal; apply (proof_irrel _). Qed. Instance Qp_eq_dec : EqDecision Qp. Proof. - refine (λ p q, cast_if (decide (Qp_to_Qc p = Qp_to_Qc q))); by rewrite Qp_eq. + refine (λ p q, cast_if (decide (Qp_to_Qc p = Qp_to_Qc q))); + by rewrite <-Qp_to_Qc_inj_iff. Defined. Instance Qp_inhabited : Inhabited Qp := populate 1%Qp. Instance Qp_plus_assoc : Assoc (=) Qp_plus. -Proof. intros [p ?] [q ?] [r ?]; apply Qp_eq, Qcplus_assoc. Qed. +Proof. intros [p ?] [q ?] [r ?]; apply Qp_to_Qc_inj_iff, Qcplus_assoc. Qed. Instance Qp_plus_comm : Comm (=) Qp_plus. -Proof. intros [p ?] [q ?]; apply Qp_eq, Qcplus_comm. Qed. +Proof. intros [p ?] [q ?]; apply Qp_to_Qc_inj_iff, Qcplus_comm. Qed. Instance Qp_plus_inj_r p : Inj (=) (=) (Qp_plus p). Proof. destruct p as [p ?]. - intros [q1 ?] [q2 ?]. rewrite !Qp_eq; simpl. apply (inj (Qcplus p)). + intros [q1 ?] [q2 ?]. rewrite <-!Qp_to_Qc_inj_iff; simpl. apply (inj (Qcplus p)). Qed. Instance Qp_plus_inj_l p : Inj (=) (=) (λ q, q + p)%Qp. Proof. destruct p as [p ?]. - intros [q1 ?] [q2 ?]. rewrite !Qp_eq; simpl. apply (inj (λ q, q + p)%Qc). + intros [q1 ?] [q2 ?]. rewrite <-!Qp_to_Qc_inj_iff; simpl. apply (inj (λ q, q + p)%Qc). Qed. Instance Qp_mult_assoc : Assoc (=) Qp_mult. -Proof. intros [p ?] [q ?] [r ?]. apply Qp_eq, Qcmult_assoc. Qed. +Proof. intros [p ?] [q ?] [r ?]. apply Qp_to_Qc_inj_iff, Qcmult_assoc. Qed. Instance Qp_mult_comm : Comm (=) Qp_mult. -Proof. intros [p ?] [q ?]; apply Qp_eq, Qcmult_comm. Qed. +Proof. intros [p ?] [q ?]; apply Qp_to_Qc_inj_iff, Qcmult_comm. Qed. Lemma Qp_mult_plus_distr_r p q r : p * (q + r) = p * q + p * r. -Proof. - destruct p as [p ?], q as [q ?], r as [r ?]. apply Qp_eq, Qcmult_plus_distr_r. -Qed. +Proof. destruct p, q, r; by apply Qp_to_Qc_inj_iff, Qcmult_plus_distr_r. Qed. Lemma Qp_mult_plus_distr_l p q r : (p + q) * r = p * r + q * r. -Proof. - destruct p as [p ?], q as [q ?], r as [r ?]. apply Qp_eq, Qcmult_plus_distr_l. -Qed. +Proof. destruct p, q, r; by apply Qp_to_Qc_inj_iff, Qcmult_plus_distr_l. Qed. Lemma Qp_mult_1_l p : 1 * p = p. -Proof. destruct p; apply Qp_eq, Qcmult_1_l. Qed. +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_eq, Qcmult_1_r. Qed. +Proof. destruct p; apply Qp_to_Qc_inj_iff, Qcmult_1_r. Qed. Lemma Qp_plus_diag p : p + p = (2 * p). Proof. by rewrite Qp_mult_plus_distr_l, !Qp_mult_1_l. Qed. Lemma Qp_div_1 p : p / 1 = p. Proof. - destruct p as [p ?]. apply Qp_eq; simpl. + destruct p as [p ?]. apply Qp_to_Qc_inj_iff; simpl. rewrite <-(Qcmult_div_r p 1) at 2 by done. by rewrite Qcmult_1_l. Qed. Lemma Qp_div_S p y : p / (2 * y) + p / (2 * y) = p / y. Proof. - destruct p as [p ?]. apply Qp_eq; simpl. unfold Qcdiv. + destruct p as [p ?]. apply Qp_to_Qc_inj_iff; simpl. unfold Qcdiv. rewrite <-Qcmult_plus_distr_l, Pos2Z.inj_mul, Z2Qc_inj_mul, Z2Qc_inj_2. rewrite Qcplus_diag. by field_simplify. Qed. @@ -808,7 +805,7 @@ Proof. unfold Qp_le. split; [split|]. - by intros p. - intros p q r ??. by etrans. - - intros p q ??. by apply Qp_eq, Qcle_antisym. + - intros p q ??. by apply Qp_to_Qc_inj_iff, Qcle_antisym. Qed. Instance Qp_lt_strict : StrictOrder (<)%Qp. Proof. @@ -822,7 +819,7 @@ Proof. intros p q. apply (total Qcle). Qed. Lemma Qp_lt_le_weak p q : p < q → p ≤ q. Proof. apply Qclt_le_weak. Qed. Lemma Qp_le_lt_or_eq p q : p ≤ q → p < q ∨ p = q. -Proof. intros [? | ->%Qp_eq]%Qcle_lt_or_eq; auto. Qed. +Proof. intros [? | ->%Qp_to_Qc_inj_iff]%Qcle_lt_or_eq; auto. Qed. Lemma Qp_lt_le_dec p q : {p < q} + {q ≤ p}. Proof. apply Qclt_le_dec. Defined. Lemma Qp_le_lt_trans p q r : p ≤ q → q < r → p < r. @@ -895,22 +892,22 @@ Proof. rewrite (comm_L Qp_plus). apply Qp_plus_weak_2_r. Qed. Lemma Qc_minus_Some p q r : p - q = Some r ↔ p = q + r. Proof. destruct p as [p Hp], q as [q Hq], r as [r Hr]. - unfold Qp_minus, Qp_plus; simpl; rewrite Qp_eq; simpl. split. + unfold Qp_minus, Qp_plus; simpl; rewrite <-Qp_to_Qc_inj_iff; simpl. split. - intros; simplify_option_eq. unfold Qcminus. by rewrite (Qcplus_comm p), Qcplus_assoc, Qcplus_opp_r, Qcplus_0_l. - intros ->. unfold Qcminus. rewrite <-Qcplus_assoc, (Qcplus_comm r), Qcplus_assoc. rewrite Qcplus_opp_r, Qcplus_0_l. simplify_option_eq; [|done]. - f_equal. by apply Qp_eq. + f_equal. by apply Qp_to_Qc_inj_iff. Qed. Lemma Qp_lt_sum p q : p < q ↔ ∃ r, q = p + r. Proof. destruct p as [p Hp], q as [q Hq]. unfold Qp_lt; simpl. split. - intros Hlt%Qclt_minus_iff. exists (mk_Qp (q - p) Hlt). - apply Qp_eq; simpl. unfold Qcminus. + apply Qp_to_Qc_inj_iff; simpl. unfold Qcminus. by rewrite (Qcplus_comm q), Qcplus_assoc, Qcplus_opp_r, Qcplus_0_l. - - intros [[r ?] ?%Qp_eq]; simplify_eq/=. + - intros [[r ?] ?%Qp_to_Qc_inj_iff]; simplify_eq/=. rewrite <-(Qcplus_0_r p) at 1. by apply Qcplus_lt_mono_l. Qed.