Theorem: MonoidAlgebra.mul_apply_antidiagonal
File: Mathlib/Algebra/MonoidAlgebra/Basic.lean

tactic: ext
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
⊢ Finset.filter (fun p => p.1 * p.2 = x) (f.support ×ˢ g.support) =
    Finset.filter (fun p => p.1 ∈ f.support ∧ p.2 ∈ g.support) s
state_after: case a
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
a✝ : G × G
⊢ a✝ ∈ Finset.filter (fun p => p.1 * p.2 = x) (f.support ×ˢ g.support) ↔
    a✝ ∈ Finset.filter (fun p => p.1 ∈ f.support ∧ p.2 ∈ g.support) s

tactic: simp only [mem_filter, mem_product, hs, and_comm]
state_before: case a
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
a✝ : G × G
⊢ a✝ ∈ Finset.filter (fun p => p.1 * p.2 = x) (f.support ×ˢ g.support) ↔
    a✝ ∈ Finset.filter (fun p => p.1 ∈ f.support ∧ p.2 ∈ g.support) s
state_after: no goals

tactic: simp only [mem_filter, mem_support_iff, not_and, Classical.not_not] at hp ⊢
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∉ Finset.filter (fun p => p.1 ∈ f.support ∧ p.2 ∈ g.support) s
⊢ f p.1 * g p.2 = 0
state_after: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
⊢ f p.1 * g p.2 = 0

tactic: by_cases h1 : f p.1 = 0
state_before: k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
⊢ f p.1 * g p.2 = 0
state_after: case pos
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
h1 : f p.1 = 0
⊢ f p.1 * g p.2 = 0

case neg
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
h1 : ¬f p.1 = 0
⊢ f p.1 * g p.2 = 0

tactic: rw [h1, zero_mul]
state_before: case pos
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
h1 : f p.1 = 0
⊢ f p.1 * g p.2 = 0
state_after: no goals

tactic: rw [hp hps h1, mul_zero]
state_before: case neg
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : Mul G
f g : MonoidAlgebra k G
x : G
s : Finset (G × G)
hs : ∀ {p : G × G}, p ∈ s ↔ p.1 * p.2 = x
F : G × G → k := fun p => if p.1 * p.2 = x then f p.1 * g p.2 else 0
p : G × G
hps : p ∈ s
hp : p ∈ s → f p.1 ≠ 0 → g p.2 = 0
h1 : ¬f p.1 = 0
⊢ f p.1 * g p.2 = 0
state_after: no goals