Documentation

Mathlib.Data.NNRat.Defs

Nonnegative rationals #

This file defines the nonnegative rationals as a subtype of Rat and provides its basic algebraic order structure.

Note that NNRat is not declared as a Semifield here. See Mathlib/Algebra/Field/Rat.lean for that instance.

We also define an instance CanLift ℚ ℚ≥0. This instance can be used by the lift tactic to replace x : ℚ and hx : 0 ≤ x in the proof context with x : ℚ≥0 while replacing all occurrences of x with ↑x. This tactic also works for a function f : α → ℚ with a hypothesis hf : ∀ x, 0 ≤ f x.

Notation #

ℚ≥0 is notation for NNRat in scope NNRat.

Huge warning #

Whenever you state a lemma about the coercion ℚ≥0 → ℚ, check that Lean inserts NNRat.cast, not Subtype.val. Else your lemma will never apply.

def LibraryNote.specialised_high_priority_simp_lemma :
Batteries.Util.LibraryNote

It sometimes happens that a @[simp] lemma declared early in the library can be proved by simp using later, more general simp lemmas. In that case, the following reasons might be arguments for the early lemma to be tagged @[simp high] (rather than @[simp, nolint simpNF] or un-@[simp]ed):

  1. There is a significant portion of the library which needs the early lemma to be available via simp and which doesn't have access to the more general lemmas.
  2. The more general lemmas have more complicated typeclass assumptions, causing rewrites with them to be slower.
Instances For
    @[implicit_reducible]
    instance instSubNNRat :
    @[implicit_reducible]
    instance instInhabitedNNRat :
    Inhabited ℚ≥0
    @[implicit_reducible]
    @[simp]
    theorem NNRat.val_eq_cast (q : ℚ≥0) :
    q = q
    instance NNRat.canLift :
    CanLift ℚ≥0 NNRat.cast fun (q : ) => 0 q
    theorem NNRat.ext {p q : ℚ≥0} :
    p = qp = q
    theorem NNRat.ext_iff {p q : ℚ≥0} :
    p = q p = q
    @[simp]
    theorem NNRat.coe_inj {p q : ℚ≥0} :
    p = q p = q
    theorem NNRat.ne_iff {x y : ℚ≥0} :
    x y x y
    @[simp]
    theorem NNRat.coe_mk (q : ) (hq : 0 q) :
    q, hq = q
    theorem NNRat.forall {p : ℚ≥0Prop} :
    (∀ (q : ℚ≥0), p q) ∀ (q : ) (hq : 0 q), p q, hq
    theorem NNRat.exists {p : ℚ≥0Prop} :
    (∃ (q : ℚ≥0), p q) ∃ (q : ) (hq : 0 q), p q, hq
    def Rat.toNNRat (q : ) :

    Reinterpret a rational number q as a non-negative rational number. Returns 0 if q ≤ 0.

    Instances For
      theorem Rat.coe_toNNRat (q : ) (hq : 0 q) :
      q.toNNRat = q
      @[simp]
      theorem NNRat.coe_nonneg (q : ℚ≥0) :
      0 q
      @[simp]
      theorem NNRat.coe_zero :
      0 = 0
      @[simp]
      theorem NNRat.num_zero :
      num 0 = 0
      @[simp]
      theorem NNRat.den_zero :
      den 0 = 1
      @[simp]
      theorem NNRat.coe_one :
      1 = 1
      @[simp]
      theorem NNRat.num_one :
      num 1 = 1
      @[simp]
      theorem NNRat.den_one :
      den 1 = 1
      @[simp]
      theorem NNRat.coe_add (p q : ℚ≥0) :
      (p + q) = p + q
      @[simp]
      theorem NNRat.coe_mul (p q : ℚ≥0) :
      (p * q) = p * q
      @[simp]
      theorem NNRat.coe_pow (q : ℚ≥0) (n : ) :
      (q ^ n) = q ^ n
      @[simp]
      theorem NNRat.num_pow (q : ℚ≥0) (n : ) :
      (q ^ n).num = q.num ^ n
      @[simp]
      theorem NNRat.den_pow (q : ℚ≥0) (n : ) :
      (q ^ n).den = q.den ^ n
      @[simp]
      theorem NNRat.coe_sub {p q : ℚ≥0} (h : q p) :
      (p - q) = p - q
      @[simp]
      theorem NNRat.coe_eq_zero {q : ℚ≥0} :
      q = 0 q = 0
      theorem NNRat.coe_ne_zero {q : ℚ≥0} :
      q 0 q 0
      @[simp]
      theorem NNRat.mk_zero :
      0, = 0
      theorem NNRat.coe_le_coe {p q : ℚ≥0} :
      p q p q
      theorem NNRat.coe_lt_coe {p q : ℚ≥0} :
      p < q p < q
      theorem NNRat.coe_pos {q : ℚ≥0} :
      0 < q 0 < q
      @[simp]
      theorem NNRat.toNNRat_coe (q : ℚ≥0) :
      (↑q).toNNRat = q
      @[simp]
      theorem NNRat.toNNRat_coe_nat (n : ) :
      (↑n).toNNRat = n

      toNNRat and (↑) : ℚ≥0 → ℚ form a Galois insertion.

      Instances For

        Coercion ℚ≥0 → ℚ as a RingHom.

        Instances For
          @[simp]
          theorem NNRat.coe_natCast (n : ) :
          n = n
          @[simp]
          theorem NNRat.mk_natCast (n : ) :
          n, = n
          theorem NNRat.nsmul_coe (q : ℚ≥0) (n : ) :
          (n q) = n q
          theorem NNRat.coe_max (x y : ℚ≥0) :
          (max x y) = max x y
          theorem NNRat.coe_min (x y : ℚ≥0) :
          (min x y) = min x y
          theorem NNRat.sub_def (p q : ℚ≥0) :
          p - q = (p - q).toNNRat
          @[simp]
          theorem NNRat.abs_coe (q : ℚ≥0) :
          |q| = q
          @[simp]
          theorem NNRat.nonpos_iff_eq_zero (q : ℚ≥0) :
          q 0 q = 0
          @[simp]
          theorem Rat.toNNRat_pos {q : } :
          0 < q.toNNRat 0 < q
          @[simp]
          theorem Rat.toNNRat_eq_zero {q : } :
          q.toNNRat = 0 q 0
          theorem Rat.toNNRat_of_nonpos {q : } :
          q 0q.toNNRat = 0

          Alias of the reverse direction of Rat.toNNRat_eq_zero.

          @[simp]
          theorem Rat.toNNRat_le_toNNRat_iff {p q : } (hp : 0 p) :
          q.toNNRat p.toNNRat q p
          @[simp]
          theorem Rat.toNNRat_lt_toNNRat_iff' {p q : } :
          q.toNNRat < p.toNNRat q < p 0 < p
          theorem Rat.toNNRat_lt_toNNRat_iff {p q : } (h : 0 < p) :
          q.toNNRat < p.toNNRat q < p
          theorem Rat.toNNRat_lt_toNNRat_iff_of_nonneg {p q : } (hq : 0 q) :
          q.toNNRat < p.toNNRat q < p
          @[simp]
          theorem Rat.toNNRat_add {p q : } (hq : 0 q) (hp : 0 p) :
          (q + p).toNNRat = q.toNNRat + p.toNNRat
          theorem Rat.toNNRat_add_le {p q : } :
          (q + p).toNNRat q.toNNRat + p.toNNRat
          theorem Rat.toNNRat_le_iff_le_coe {q : } {p : ℚ≥0} :
          q.toNNRat p q p
          theorem Rat.le_toNNRat_iff_coe_le {p : } {q : ℚ≥0} (hp : 0 p) :
          q p.toNNRat q p
          theorem Rat.le_toNNRat_iff_coe_le' {p : } {q : ℚ≥0} (hq : 0 < q) :
          q p.toNNRat q p
          theorem Rat.toNNRat_lt_iff_lt_coe {q : } {p : ℚ≥0} (hq : 0 q) :
          q.toNNRat < p q < p
          theorem Rat.lt_toNNRat_iff_coe_lt {p : } {q : ℚ≥0} :
          q < p.toNNRat q < p
          theorem Rat.toNNRat_mul {p q : } (hp : 0 p) :
          (p * q).toNNRat = p.toNNRat * q.toNNRat
          def Rat.nnabs (x : ) :

          The absolute value on as a map to ℚ≥0.

          Instances For
            @[simp]
            theorem Rat.coe_nnabs (x : ) :
            (nnabs x) = |x|

            Numerator and denominator #

            theorem NNRat.num_coe (q : ℚ≥0) :
            (↑q).num = q.num
            theorem NNRat.natAbs_num_coe {q : ℚ≥0} :
            (↑q).num.natAbs = q.num
            theorem NNRat.den_coe {q : ℚ≥0} :
            (↑q).den = q.den
            @[simp]
            theorem NNRat.num_ne_zero {q : ℚ≥0} :
            q.num 0 q 0
            @[simp]
            theorem NNRat.num_pos {q : ℚ≥0} :
            0 < q.num 0 < q
            @[simp]
            theorem NNRat.den_pos (q : ℚ≥0) :
            0 < q.den
            @[simp]
            theorem NNRat.den_ne_zero (q : ℚ≥0) :
            q.den 0
            @[simp]
            theorem NNRat.num_natCast (n : ) :
            (↑n).num = n
            @[simp]
            theorem NNRat.den_natCast (n : ) :
            (↑n).den = 1
            @[simp]
            theorem NNRat.num_ofNat (n : ) [n.AtLeastTwo] :
            (OfNat.ofNat n).num = OfNat.ofNat n
            @[simp]
            theorem NNRat.den_ofNat (n : ) [n.AtLeastTwo] :
            (OfNat.ofNat n).den = 1
            theorem NNRat.ext_num_den {p q : ℚ≥0} (hn : p.num = q.num) (hd : p.den = q.den) :
            p = q
            theorem NNRat.ext_num_den_iff {p q : ℚ≥0} :
            p = q p.num = q.num p.den = q.den
            def NNRat.divNat (n d : ) :

            Form the quotient n / d where n d : ℕ.

            See also Rat.divInt and mkRat.

            Instances For
              @[simp]
              theorem NNRat.coe_divNat (n d : ) :
              (divNat n d) = Rat.divInt n d
              theorem NNRat.mk_divInt (n d : ) :
              Rat.divInt n d, = divNat n d
              theorem NNRat.divNat_inj {n₁ n₂ d₁ d₂ : } (h₁ : d₁ 0) (h₂ : d₂ 0) :
              divNat n₁ d₁ = divNat n₂ d₂ n₁ * d₂ = n₂ * d₁
              @[simp]
              theorem NNRat.divNat_zero (n : ) :
              divNat n 0 = 0
              theorem NNRat.natCast_eq_divNat (n : ) :
              n = divNat n 1
              theorem NNRat.divNat_mul_divNat (n₁ n₂ : ) {d₁ d₂ : } :
              divNat n₁ d₁ * divNat n₂ d₂ = divNat (n₁ * n₂) (d₁ * d₂)
              theorem NNRat.divNat_mul_left {a : } (ha : a 0) (n d : ) :
              divNat (a * n) (a * d) = divNat n d
              theorem NNRat.divNat_mul_right {a : } (ha : a 0) (n d : ) :
              divNat (n * a) (d * a) = divNat n d
              @[simp]
              theorem NNRat.mul_den_eq_num (q : ℚ≥0) :
              q * q.den = q.num
              @[simp]
              theorem NNRat.den_mul_eq_num (q : ℚ≥0) :
              q.den * q = q.num
              def NNRat.numDenCasesOn {C : ℚ≥0Sort u} (q : ℚ≥0) (H : (n d : ) → d 0n.Coprime dC (divNat n d)) :
              C q

              Define a (dependent) function or prove ∀ r : ℚ, p r by dealing with nonnegative rational numbers of the form n / d with d ≠ 0 and n, d coprime.

              Instances For
                theorem NNRat.add_def (q r : ℚ≥0) :
                q + r = divNat (q.num * r.den + r.num * q.den) (q.den * r.den)
                theorem NNRat.mul_def (q r : ℚ≥0) :
                q * r = divNat (q.num * r.num) (q.den * r.den)
                theorem NNRat.lt_def {p q : ℚ≥0} :
                p < q p.num * q.den < q.num * p.den
                theorem NNRat.le_def {p q : ℚ≥0} :
                p q p.num * q.den q.num * p.den
                theorem Mathlib.Tactic.Qify.nnratCast_eq (a b : ℚ≥0) :
                a = b a = b
                theorem Mathlib.Tactic.Qify.nnratCast_lt (a b : ℚ≥0) :
                a < b a < b
                theorem Mathlib.Tactic.Qify.nnratCast_ne (a b : ℚ≥0) :
                a b a b