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.

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.
Equations
Instances For
    @[simp]
    theorem NNRat.val_eq_cast (q : ℚ≥0) :
    q = 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

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

    Equations
    Instances For
      theorem Rat.coe_toNNRat (q : ) (hq : 0 q) :
      q.toNNRat = q
      theorem Rat.le_coe_toNNRat (q : ) :
      q q.toNNRat
      @[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

      Coercion ℚ≥0 → ℚ as a RingHom.

      Equations
      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]
        @[simp]
        @[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) :
        @[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) :
        @[simp]
        theorem Rat.toNNRat_add {p q : } (hq : 0 q) (hp : 0 p) :
        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) :
        def Rat.nnabs (x : ) :

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

        Equations
        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.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.den_ofNat (n : ) [n.AtLeastTwo] :
          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.

          Equations
          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
            @[simp]
            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.

            Equations
            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