@@ -30,30 +30,18 @@ of `x` with `↑x`. This tactic also works for a function `f : α → ℚ` with
3030
3131open Function
3232
33- /-- Nonnegative rational numbers. -/
34- def NNRat := { q : ℚ // 0 ≤ q } deriving
35- CanonicallyOrderedCommSemiring, CanonicallyLinearOrderedAddCommMonoid, Sub, Inhabited
36- #align nnrat NNRat
33+ deriving instance CanonicallyOrderedCommSemiring for NNRat
34+ deriving instance CanonicallyLinearOrderedAddCommMonoid for NNRat
35+ deriving instance Sub for NNRat
36+ deriving instance Inhabited for NNRat
3737
38- -- Porting note (#10754): Added these instances to get `OrderedSub, DenselyOrdered, Archimedean`
39- -- instead of `deriving` them
40- instance : OrderedSub NNRat := Nonneg.orderedSub
41-
42- scoped [NNRat] notation "ℚ≥0" => NNRat
38+ -- TODO: `deriving instance OrderedSub for NNRat` doesn't work yet, so we add the instance manually
39+ instance NNRat.instOrderedSub : OrderedSub ℚ≥0 := Nonneg.orderedSub
4340
4441namespace NNRat
4542
4643variable {α : Type *} {p q : ℚ≥0 }
4744
48- instance instCoe : Coe ℚ≥0 ℚ := ⟨Subtype.val⟩
49-
50- /-
51- -- Simp lemma to put back `n.val` into the normal form given by the coercion.
52- @[ simp ]
53- theorem val_eq_coe (q : ℚ≥0) : q.val = q :=
54- rfl
55- -/
56- -- Porting note: `val_eq_coe` is no longer needed.
5745#noalign nnrat.val_eq_coe
5846
5947instance canLift : CanLift ℚ ℚ≥0 (↑) fun q ↦ 0 ≤ q where
@@ -358,26 +346,21 @@ namespace NNRat
358346
359347variable {p q : ℚ≥0 }
360348
361- /-- The numerator of a nonnegative rational. -/
362- @[pp_dot] def num (q : ℚ≥0 ) : ℕ := (q : ℚ).num.natAbs
363- #align nnrat.num NNRat.num
364-
365- /-- The denominator of a nonnegative rational. -/
366- @[pp_dot] def den (q : ℚ≥0 ) : ℕ := (q : ℚ).den
367- #align nnrat.denom NNRat.den
368-
369349@[norm_cast] lemma num_coe (q : ℚ≥0 ) : (q : ℚ).num = q.num := by
370350 simp [num, abs_of_nonneg, Rat.num_nonneg, q.2 ]
371351
372352theorem natAbs_num_coe : (q : ℚ).num.natAbs = q.num := rfl
373353#align nnrat.nat_abs_num_coe NNRat.natAbs_num_coe
374354
375- @[simp, norm_cast] lemma den_coe : (q : ℚ).den = q.den := rfl
355+ @[norm_cast] lemma den_coe : (q : ℚ).den = q.den := rfl
376356#align nnrat.denom_coe NNRat.den_coe
377357
378358@[simp] lemma num_ne_zero : q.num ≠ 0 ↔ q ≠ 0 := by simp [num]
379359@[simp] lemma num_pos : 0 < q.num ↔ 0 < q := by simp [pos_iff_ne_zero]
380360@[simp] lemma den_pos (q : ℚ≥0 ) : 0 < q.den := Rat.den_pos _
361+ @[simp] lemma den_ne_zero (q : ℚ≥0 ) : q.den ≠ 0 := Rat.den_ne_zero _
362+
363+ lemma coprime_num_den (q : ℚ≥0 ) : q.num.Coprime q.den := by simpa [num, den] using Rat.reduced _
381364
382365-- TODO: Rename `Rat.coe_nat_num`, `Rat.intCast_den`, `Rat.ofNat_num`, `Rat.ofNat_den`
383366@[simp, norm_cast] lemma num_natCast (n : ℕ) : num n = n := rfl
@@ -395,7 +378,34 @@ theorem ext_num_den_iff : p = q ↔ p.num = q.num ∧ p.den = q.den :=
395378 ⟨by rintro rfl; exact ⟨rfl, rfl⟩, fun h ↦ ext_num_den h.1 h.2 ⟩
396379#align nnrat.ext_num_denom_iff NNRat.ext_num_den_iff
397380
398- end NNRat
381+ /-- Form the quotient `n / d` where `n d : ℕ`.
399382
400- -- `NNRat` needs to be available in the definition of `Field`
401- assert_not_exists Field
383+ See also `Rat.divInt` and `mkRat`. -/
384+ def divNat (n d : ℕ) : ℚ≥0 := ⟨.divInt n d, Rat.divInt_nonneg n.cast_nonneg d.cast_nonneg⟩
385+
386+ variable {n₁ n₂ d₁ d₂ d : ℕ}
387+
388+ @[simp, norm_cast] lemma coe_divNat (n d : ℕ) : (divNat n d : ℚ) = .divInt n d := rfl
389+
390+ lemma mk_divInt (n d : ℕ) :
391+ ⟨.divInt n d, Rat.divInt_nonneg n.cast_nonneg d.cast_nonneg⟩ = divNat n d := rfl
392+
393+ lemma divNat_inj (h₁ : d₁ ≠ 0 ) (h₂ : d₂ ≠ 0 ) : divNat n₁ d₁ = divNat n₂ d₂ ↔ n₁ * d₂ = n₂ * d₁ := by
394+ rw [← coe_inj]; simp [Rat.mkRat_eq_iff, h₁, h₂]; norm_cast
395+
396+ @[simp] lemma num_divNat_den (q : ℚ≥0 ) : divNat q.num q.den = q :=
397+ ext $ by rw [← (q : ℚ).mkRat_num_den']; simp [num_coe, den_coe]
398+
399+ /-- Define a (dependent) function or prove `∀ r : ℚ, p r` by dealing with nonnegative rational
400+ numbers of the form `n / d` with `d ≠ 0` and `n`, `d` coprime. -/
401+ @[elab_as_elim]
402+ def numDenCasesOn. {u} {C : ℚ≥0 → Sort u} (q) (H : ∀ n d, d ≠ 0 → n.Coprime d → C (divNat n d)) :
403+ C q := by rw [← q.num_divNat_den]; exact H _ _ q.den_ne_zero q.coprime_num_den
404+
405+ lemma add_def (q r : ℚ≥0 ) : q + r = divNat (q.num * r.den + r.num * q.den) (q.den * r.den) := by
406+ ext; simp [Rat.add_def', Rat.mkRat_eq, num_coe, den_coe]
407+
408+ lemma mul_def (q r : ℚ≥0 ) : q * r = divNat (q.num * r.num) (q.den * r.den) := by
409+ ext; simp [Rat.mul_def', Rat.mkRat_eq, num_coe, den_coe]
410+
411+ end NNRat
0 commit comments