(Strict) monotonicity of multiplication by nonnegative (positive) elements #
This file defines eight typeclasses expressing monotonicity (strict monotonicity) of multiplication on the left or right by nonnegative (positive) elements in a preorder.
For left multiplication (a ↦ b * a
) we define the following typeclasses:
PosMulMono
: Ifb ≥ 0
, thena₁ ≤ a₂ → b * a₁ ≤ b * a₂
.PosMulStrictMono
: Ifb > 0
, thena₁ < a₂ → b * a₁ < b * a₂
.PosMulReflectLT
: Ifb ≥ 0
, thenb * a₁ < b * a₂ → a₁ < a₂
.PosMulReflectLE
: Ifb > 0
, thenb * a₁ ≤ b * a₂ → a₁ ≤ a₂
.
For right multiplication (a ↦ a * b
) we define the following typeclasses:
MulPosMono
: Ifb ≥ 0
, thena₁ ≤ a₂ → a₁ * b ≤ a₂ * b
.MulPosStrictMono
: Ifb > 0
, thena₁ < a₂ → a₁ * b < a₂ * b
.MulPosReflectLT
: Ifb ≥ 0
, thena₁ * b < a₂ * b → a₁ < a₂
.MulPosReflectLE
: Ifb > 0
, thena₁ * b ≤ a₂ * b → a₁ ≤ a₂
.
We then provide statements and instances about these typeclasses not requiring MulZeroClass
or higher on the underlying type – those that do can be found in
Mathlib.Algebra.Order.GroupWithZero.Unbundled.Basic
.
Less granular typeclasses like OrderedAddCommMonoid
and LinearOrderedField
should be enough for
most purposes, and the system is set up so that they imply the correct granular typeclasses here.
Implications #
As the underlying type α
gets more structured, some of the above typeclasses become equivalent.
The commonly used implications are:
- When
α
is a partial order (inMathlib.Algebra.Order.GroupWithZero.Unbundled.Basic
):PosMulStrictMono.toPosMulMono
MulPosStrictMono.toMulPosMono
PosMulReflectLE.toPosMulReflectLT
MulPosReflectLE.toMulPosReflectLT
- When
α
is a linear order: - When multiplication on
α
is commutative:
Furthermore, the bundled non-granular typeclasses imply the granular ones like so:
OrderedSemiring → PosMulMono
OrderedSemiring → MulPosMono
StrictOrderedSemiring → PosMulStrictMono
StrictOrderedSemiring → MulPosStrictMono
All these are registered as instances, which means that in practice you should not worry about these implications. However, if you encounter a case where you think a statement is true but not covered by the current implications, please bring it up on Zulip!
Notation #
The following is local notation in this file:
α≥0
:{x : α // 0 ≤ x}
α>0
:{x : α // 0 < x}
See https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/notation.20for.20positive.20elements for a discussion about this notation, and whether to enable it globally (note that the notation is currently global but broken, hence actually only works locally).
Typeclass for monotonicity of multiplication by nonnegative elements on the left,
namely a₁ ≤ a₂ → b * a₁ ≤ b * a₂
if 0 ≤ b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
OrderedSemiring
.
Instances
Typeclass for strict monotonicity of multiplication by positive elements on the left,
namely a₁ < a₂ → b * a₁ < b * a₂
if 0 < b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
StrictOrderedSemiring
.
Instances
Typeclass for strict reverse monotonicity of multiplication by nonnegative elements on
the left, namely b * a₁ < b * a₂ → a₁ < a₂
if 0 ≤ b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
LinearOrderedSemiring
.
Instances
Typeclass for reverse monotonicity of multiplication by positive elements on the left,
namely b * a₁ ≤ b * a₂ → a₁ ≤ a₂
if 0 < b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
LinearOrderedSemiring
.
Instances
Typeclass for monotonicity of multiplication by nonnegative elements on the right,
namely a₁ ≤ a₂ → a₁ * b ≤ a₂ * b
if 0 ≤ b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
OrderedSemiring
.
Instances
Typeclass for strict monotonicity of multiplication by positive elements on the right,
namely a₁ < a₂ → a₁ * b < a₂ * b
if 0 < b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
StrictOrderedSemiring
.
Instances
Typeclass for strict reverse monotonicity of multiplication by nonnegative elements on
the right, namely a₁ * b < a₂ * b → a₁ < a₂
if 0 ≤ b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
LinearOrderedSemiring
.
Instances
Typeclass for reverse monotonicity of multiplication by positive elements on the right,
namely a₁ * b ≤ a₂ * b → a₁ ≤ a₂
if 0 < b
.
You should usually not use this very granular typeclass directly, but rather a typeclass like
LinearOrderedSemiring
.
Instances
Alias of lt_of_mul_lt_mul_left
.
Alias of lt_of_mul_lt_mul_right
.
Alias of le_of_mul_le_mul_left
.
Alias of le_of_mul_le_mul_right
.
Alias of mul_le_mul_left
.
Alias of mul_le_mul_right
.
Alias of mul_lt_mul_left
.
Alias of mul_lt_mul_right
.
Alias of mul_lt_mul_of_le_of_lt_of_pos_of_nonneg
.
Alias of mul_lt_mul_of_le_of_lt_of_nonneg_of_pos
.
Alias of mul_lt_mul_of_lt_of_le_of_nonneg_of_pos
.
Alias of mul_lt_mul_of_lt_of_le_of_pos_of_nonneg
.
Alias of mul_le_mul_of_nonneg'
.
Alias of mul_lt_mul_of_lt_of_le_of_pos_of_nonneg
.
Alias of mul_lt_mul_of_lt_of_le_of_pos_of_nonneg
.
Alias of mul_lt_mul_of_le_of_lt_of_nonneg_of_pos
.
Alias of mul_lt_mul_of_le_of_lt_of_nonneg_of_pos
.