-- Mathlib/LinearAlgebra/PiTensorProduct.lean
theorem liftAux_tprod (φ : MultilinearMap R s E) (f : Π i, s i) : liftAux φ (tprod R f) = φ f

Proof state:
case h.e'_3
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ 1 • φ f = φ f

Tactic:
simp

Result:
no goals

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (match
      List.map (fun p => p.1 • φ p.2) (FreeAddMonoid.toList ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)])) with
    | [] => 0
    | x :: xs => List.foldl (fun x1 x2 => x1 + x2) x xs) =
    1 • φ f

Tactic:
convert one_smul R (φ f)

Result:
case h.e'_3
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ 1 • φ f = φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) (FreeAddMonoid.ofList [(1, f)]) = φ f

Tactic:
dsimp [FreeAddMonoid.ofList]

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)]) = φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)]) = φ f

Tactic:
rw [← one_smul R (φ f)]

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)]) = 1 • φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) (FreeAddMonoid.of (1, f)) = φ f

Tactic:
rw [FreeAddMonoid.of]

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) (FreeAddMonoid.ofList [(1, f)]) = φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)]) = 1 • φ f

Tactic:
erw [Equiv.refl_apply]

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (match
      List.map (fun p => p.1 • φ p.2) (FreeAddMonoid.toList ((Equiv.refl (List (R × ((i : ι) → s i)))) [(1, f)])) with
    | [] => 0
    | x :: xs => List.foldl (fun x1 x2 => x1 + x2) x xs) =
    1 • φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ ((addConGen (Eqv R s)).lift (FreeAddMonoid.lift fun p => p.1 • φ p.2) ⋯) ↑(FreeAddMonoid.of (1, f)) = φ f

Tactic:
erw [AddCon.lift_coe]

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (FreeAddMonoid.lift fun p => p.1 • φ p.2) (FreeAddMonoid.of (1, f)) = φ f

Proof state:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ (liftAux φ) ((tprod R) f) = φ f

Tactic:
simp only [liftAux, liftAddHom, tprod_eq_tprodCoeff_one, tprodCoeff, AddCon.coe_mk']

Result:
ι : Type u_1
R : Type u_4
inst✝⁴ : CommSemiring R
s : ι → Type u_7
inst✝³ : (i : ι) → AddCommMonoid (s i)
inst✝² : (i : ι) → Module R (s i)
E : Type u_9
inst✝¹ : AddCommMonoid E
inst✝ : Module R E
φ : MultilinearMap R s E
f : (i : ι) → s i
⊢ ((addConGen (Eqv R s)).lift (FreeAddMonoid.lift fun p => p.1 • φ p.2) ⋯) ↑(FreeAddMonoid.of (1, f)) = φ f