Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 15 additions & 16 deletions Mathlib/Algebra/Order/Antidiag/Prod.lean
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ open Function

namespace Finset

/-- The class of additive monoids with an antidiagonal. -/
class HasAntidiagonal (A : Type*) [AddMonoid A] where
/-- The class of additive magmas with an antidiagonal. -/
class HasAntidiagonal (A : Type*) [Add A] where
/-- The antidiagonal of an element `n` is the finset of pairs `(i, j)` such that
`i + j = n`. -/
antidiagonal : A → Finset (A × A)
Expand All @@ -72,8 +72,8 @@ export HasAntidiagonal (antidiagonal mem_antidiagonal)

attribute [simp] mem_antidiagonal

/-- The class of (multiplicative) monoids with a mulAntidiagonal. -/
class HasMulAntidiagonal (A : Type*) [Monoid A] where
/-- The class of (multiplicative) magmas with a mulAntidiagonal. -/
class HasMulAntidiagonal (A : Type*) [Mul A] where
/-- The mulAntidiagonal of an element `n` is the finset of pairs `(i, j)` such that
`i * j = n`. -/
mulAntidiagonal : A → Finset (A × A)
Expand All @@ -92,38 +92,37 @@ namespace HasMulAntidiagonal

/-- All `HasMulAntidiagonal` instances are equal -/
@[to_additive /-- All `HasAntidiagonal` instances are equal -/]
instance [Monoid A] : Subsingleton (HasMulAntidiagonal A) where
instance [Mul A] : Subsingleton (HasMulAntidiagonal A) where
allEq := by
rintro ⟨a, ha⟩ ⟨b, hb⟩
congr with n xy
rw [ha, hb]

@[to_additive]
lemma nonempty_antidiagonal {M : Type*} [Monoid M] [Finset.HasMulAntidiagonal M] (a : M) :
lemma nonempty_antidiagonal {M : Type*} [MulOneClass M] [Finset.HasMulAntidiagonal M] (a : M) :
(Finset.mulAntidiagonal a).Nonempty :=
⟨(1, a), by simp⟩

-- The goal of this lemma is to allow to rewrite mulAntidiagonal/antidiagonal
-- when the decidability instances obfuscate Lean
set_option linter.overlappingInstances false in
@[to_additive]
lemma congr (A : Type*) [Monoid A]
[H1 : HasMulAntidiagonal A] [H2 : HasMulAntidiagonal A] :
lemma congr (A : Type*) [Mul A] [H1 : HasMulAntidiagonal A] [H2 : HasMulAntidiagonal A] :
H1.mulAntidiagonal = H2.mulAntidiagonal := by congr!; subsingleton

@[to_additive]
theorem swap_mem_mulAntidiagonal [CommMonoid A] [HasMulAntidiagonal A] {n : A} {xy : A × A} :
theorem swap_mem_mulAntidiagonal [CommMagma A] [HasMulAntidiagonal A] {n : A} {xy : A × A} :
xy.swap ∈ mulAntidiagonal n ↔ xy ∈ mulAntidiagonal n := by
simp [mul_comm]

@[to_additive (attr := simp) map_prodComm_antidiagonal]
theorem map_prodComm_mulAntidiagonal [CommMonoid A] [HasMulAntidiagonal A] {n : A} :
theorem map_prodComm_mulAntidiagonal [CommMagma A] [HasMulAntidiagonal A] {n : A} :
(mulAntidiagonal n).map (Equiv.prodComm A A) = mulAntidiagonal n :=
Finset.ext fun ⟨a, b⟩ => by simp [mul_comm]

/-- See also `Finset.map_prodComm_mulAntidiagonal`. -/
@[to_additive (attr := simp)]
theorem map_swap_mulAntidiagonal [CommMonoid A] [HasMulAntidiagonal A] {n : A} :
theorem map_swap_mulAntidiagonal [CommMagma A] [HasMulAntidiagonal A] {n : A} :
(mulAntidiagonal n).map ⟨Prod.swap, Prod.swap_injective⟩ = mulAntidiagonal n :=
map_prodComm_mulAntidiagonal

Expand Down Expand Up @@ -232,7 +231,7 @@ namespace HasMulAntidiagonal
@[to_additive (attr := simps) sigmaAntidiagonalEquivProd
/-- The disjoint union of antidiagonals `Σ (n : A), antidiagonal n` is equivalent to the
product `A × A`. This is such an equivalence, obtained by mapping `(n, (k, l))` to `(k, l)`. -/]
def sigmaMulAntidiagonalEquivProd [Monoid A] [HasMulAntidiagonal A] :
def sigmaMulAntidiagonalEquivProd [Mul A] [HasMulAntidiagonal A] :
(Σ n : A, mulAntidiagonal n) ≃ A × A where
toFun x := x.2
invFun x := ⟨x.1 * x.2, x, mem_mulAntidiagonal.mpr rfl⟩
Expand All @@ -244,15 +243,15 @@ def sigmaMulAntidiagonalEquivProd [Monoid A] [HasMulAntidiagonal A] :
section

variable {A : Type*}
[CommMonoid A] [PartialOrder A] [CanonicallyOrderedMul A]
[CommMagma A] [PartialOrder A] [CanonicallyOrderedMul A]
[LocallyFiniteOrderBot A] [DecidableEq A]

/-- In a canonically ordered multiplicative monoid, the mulAntidiagonal can be constructed by
/-- In a canonically ordered multiplicative magma, the mulAntidiagonal can be constructed by
filtering.

Note that this is not an instance, as for sometimes a more efficient algorithm is available. -/
@[to_additive
/-- In a canonically ordered additive monoid, the antidiagonal can be construct by filtering.
/-- In a canonically ordered additive magma, the antidiagonal can be construct by filtering.

Note that this is not an instance, as for some times a more efficient algorithm is available. -/]
abbrev mulAntidiagonalOfLocallyFinite : HasMulAntidiagonal A where
Expand All @@ -268,7 +267,7 @@ section Multiplicative

open Multiplicative

variable {A : Type*} [AddMonoid A] [HasAntidiagonal A]
variable {A : Type*} [Add A] [HasAntidiagonal A]

instance : HasMulAntidiagonal (Multiplicative A) where
mulAntidiagonal a :=
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Algebra/Order/Antidiag/Tendsto.lean
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace Finset.HasAntidiagonal

open Filter

variable {M R : Type*} [AddMonoid M] [HasAntidiagonal M] {f : M × M → R} [LinearOrder R]
variable {M R : Type*} [AddZeroClass M] [HasAntidiagonal M] {f : M × M → R} [LinearOrder R]
{F : Filter R}

lemma tendsto_sup'_antidiagonal_cofinite (hf : Tendsto f cofinite F) : Tendsto
Expand Down
Loading