Theorem: Finset.mulAntidiagonal_min_mul_min
File: Mathlib/Data/Finset/MulAntidiagonal.lean

tactic: ext ⟨a, b⟩
state_before: α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
⊢ mulAntidiagonal ⋯ ⋯ (hs.min hns * ht.min hnt) = {(hs.min hns, ht.min hnt)}
state_after: case a.mk
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ (a, b) ∈ mulAntidiagonal ⋯ ⋯ (hs.min hns * ht.min hnt) ↔ (a, b) ∈ {(hs.min hns, ht.min hnt)}

tactic: simp only [mem_mulAntidiagonal, mem_singleton, Prod.ext_iff]
state_before: case a.mk
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ (a, b) ∈ mulAntidiagonal ⋯ ⋯ (hs.min hns * ht.min hnt) ↔ (a, b) ∈ {(hs.min hns, ht.min hnt)}
state_after: case a.mk
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt ↔ a = hs.min hns ∧ b = ht.min hnt

tactic: constructor
state_before: case a.mk
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt ↔ a = hs.min hns ∧ b = ht.min hnt
state_after: case a.mk.mp
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt → a = hs.min hns ∧ b = ht.min hnt

case a.mk.mpr
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a = hs.min hns ∧ b = ht.min hnt → a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt

tactic: rintro ⟨has, hat, hst⟩
state_before: case a.mk.mp
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt → a = hs.min hns ∧ b = ht.min hnt
state_after: case a.mk.mp.intro.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
has : a ∈ s
hat : b ∈ t
hst : a * b = hs.min hns * ht.min hnt
⊢ a = hs.min hns ∧ b = ht.min hnt

tactic: obtain rfl :=
  (hs.min_le hns has).eq_of_not_lt fun hlt =>
    (mul_lt_mul_of_lt_of_le hlt <| ht.min_le hnt hat).ne' hst
state_before: case a.mk.mp.intro.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
has : a ∈ s
hat : b ∈ t
hst : a * b = hs.min hns * ht.min hnt
⊢ a = hs.min hns ∧ b = ht.min hnt
state_after: case a.mk.mp.intro.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
b : α
hat : b ∈ t
has : hs.min hns ∈ s
hst : hs.min hns * b = hs.min hns * ht.min hnt
⊢ hs.min hns = hs.min hns ∧ b = ht.min hnt

tactic: exact ⟨rfl, mul_left_cancel hst⟩
state_before: case a.mk.mp.intro.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
b : α
hat : b ∈ t
has : hs.min hns ∈ s
hst : hs.min hns * b = hs.min hns * ht.min hnt
⊢ hs.min hns = hs.min hns ∧ b = ht.min hnt
state_after: no goals

tactic: rintro ⟨rfl, rfl⟩
state_before: case a.mk.mpr
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a✝ : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
a b : α
⊢ a = hs.min hns ∧ b = ht.min hnt → a ∈ s ∧ b ∈ t ∧ a * b = hs.min hns * ht.min hnt
state_after: case a.mk.mpr.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
⊢ hs.min hns ∈ s ∧ ht.min hnt ∈ t ∧ hs.min hns * ht.min hnt = hs.min hns * ht.min hnt

tactic: exact ⟨hs.min_mem _, ht.min_mem _, rfl⟩
state_before: case a.mk.mpr.intro
α✝ : Type u_1
inst✝¹ : OrderedCancelCommMonoid α✝
s✝ t✝ : Set α✝
hs✝ : s✝.IsPWO
ht✝ : t✝.IsPWO
a : α✝
u : Set α✝
hu : u.IsPWO
x : α✝ × α✝
α : Type u_2
inst✝ : LinearOrderedCancelCommMonoid α
s t : Set α
hs : s.IsWF
ht : t.IsWF
hns : s.Nonempty
hnt : t.Nonempty
⊢ hs.min hns ∈ s ∧ ht.min hnt ∈ t ∧ hs.min hns * ht.min hnt = hs.min hns * ht.min hnt
state_after: no goals