-- Mathlib/LinearAlgebra/Alternating/DomCoprod.lean
theorem MultilinearMap.domCoprod_alternization [DecidableEq ιa] [DecidableEq ιb]
    (a : MultilinearMap R' (fun _ : ιa => Mᵢ) N₁) (b : MultilinearMap R' (fun _ : ιb => Mᵢ) N₂) :
    MultilinearMap.alternatization (MultilinearMap.domCoprod a b) =
      a.alternatization.domCoprod (MultilinearMap.alternatization b)

Proof state:
case a
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
⊢ ↑(alternatization (a.domCoprod b)) = ↑((alternatization a).domCoprod (alternatization b))

Tactic:
rw [domCoprod_coe, MultilinearMap.alternatization_coe,
  Finset.sum_partition (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)]

Result:
case a
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
⊢ ∑ xbar ∈ Finset.image (Quotient.mk (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)) Finset.univ,
      ∑ y ∈ Finset.filter (fun y => ⟦y⟧ = xbar) Finset.univ, Perm.sign y • domDomCongr y (a.domCoprod b) =
    ∑ σ : Perm.ModSumCongr ιa ιb, domCoprod.summand (alternatization a) (alternatization b) σ

Proof state:
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
⊢ alternatization (a.domCoprod b) = (alternatization a).domCoprod (alternatization b)

Tactic:
apply coe_multilinearMap_injective

Result:
case a
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
⊢ ↑(alternatization (a.domCoprod b)) = ↑((alternatization a).domCoprod (alternatization b))

Proof state:
case a.e_f
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
⊢ (fun xbar => ∑ y ∈ Finset.filter (fun y => ⟦y⟧ = xbar) Finset.univ, Perm.sign y • domDomCongr y (a.domCoprod b)) =
    fun σ => domCoprod.summand (alternatization a) (alternatization b) σ

Tactic:
ext1 σ

Result:
case a.e_f.h
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
σ : Quotient (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)
⊢ ∑ y ∈ Finset.filter (fun y => ⟦y⟧ = σ) Finset.univ, Perm.sign y • domDomCongr y (a.domCoprod b) =
    domCoprod.summand (alternatization a) (alternatization b) σ

Proof state:
case a.e_f.h.e_f.h.mk
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
σ✝ : Quotient (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)
σ : Perm (ιa ⊕ ιb)
al : Perm ιa
ar : Perm ιb
⊢ Perm.sign (σ * (Perm.sumCongrHom ιa ιb) (al, ar)) •
      domDomCongr (σ * (Perm.sumCongrHom ιa ιb) (al, ar)) (a.domCoprod b) =
    Perm.sign σ • (domDomCongrEquiv σ) (Perm.sign al • Perm.sign ar • (domDomCongr al a).domCoprod (domDomCongr ar b))

Tactic:
rw [← AddEquiv.coe_toAddMonoidHom, ← AddMonoidHom.coe_toIntLinearMap, LinearMap.map_smul_of_tower,
  LinearMap.map_smul_of_tower, AddMonoidHom.coe_toIntLinearMap, AddEquiv.coe_toAddMonoidHom,
  MultilinearMap.domDomCongrEquiv_apply]

Result:
case a.e_f.h.e_f.h.mk
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
σ✝ : Quotient (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)
σ : Perm (ιa ⊕ ιb)
al : Perm ιa
ar : Perm ιb
⊢ Perm.sign (σ * (Perm.sumCongrHom ιa ιb) (al, ar)) •
      domDomCongr (σ * (Perm.sumCongrHom ιa ιb) (al, ar)) (a.domCoprod b) =
    Perm.sign σ • Perm.sign al • Perm.sign ar • domDomCongr σ ((domDomCongr al a).domCoprod (domDomCongr ar b))

Proof state:
case a.e_f.h
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
σ✝ : Quotient (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)
σ : Perm (ιa ⊕ ιb)
⊢ ∑ x : Perm ιa × Perm ιb,
      Perm.sign (σ * (Perm.sumCongrHom ιa ιb) x) • domDomCongr (σ * (Perm.sumCongrHom ιa ιb) x) (a.domCoprod b) =
    ∑ x : Perm ιa × Perm ιb,
      Perm.sign σ •
        (domDomCongrEquiv σ) (Perm.sign x.1 • Perm.sign x.2 • (domDomCongr x.1 a).domCoprod (domDomCongr x.2 b))

Tactic:
congr 1

Result:
case a.e_f.h.e_f
ιa : Type u_1
ιb : Type u_2
inst✝¹⁰ : Fintype ιa
inst✝⁹ : Fintype ιb
R' : Type u_3
Mᵢ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
inst✝⁸ : CommSemiring R'
inst✝⁷ : AddCommGroup N₁
inst✝⁶ : Module R' N₁
inst✝⁵ : AddCommGroup N₂
inst✝⁴ : Module R' N₂
inst✝³ : AddCommMonoid Mᵢ
inst✝² : Module R' Mᵢ
inst✝¹ : DecidableEq ιa
inst✝ : DecidableEq ιb
a : MultilinearMap R' (fun x => Mᵢ) N₁
b : MultilinearMap R' (fun x => Mᵢ) N₂
σ✝ : Quotient (QuotientGroup.leftRel (Perm.sumCongrHom ιa ιb).range)
σ : Perm (ιa ⊕ ιb)
⊢ (fun x => Perm.sign (σ * (Perm.sumCongrHom ιa ιb) x) • domDomCongr (σ * (Perm.sumCongrHom ιa ιb) x) (a.domCoprod b)) =
    fun x =>
    Perm.sign σ •
      (domDomCongrEquiv σ) (Perm.sign x.1 • Perm.sign x.2 • (domDomCongr x.1 a).domCoprod (domDomCongr x.2 b))