awhecmu/canonical-drafter-extract-mathlib huggingface dataset:
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
⊢ hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ∉ Finset.univ →
    (if i = (f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) then
        Exists.choose (p := fun (c : R) ↦
            g ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))) =
              a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) * c)
            ⋯ •
          a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) =
      0

Tactic:
simp
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
simp :
  Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ *
      a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) =
    g i
⊢ (if i = (f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) then
      Exists.choose (p := fun (c : R) ↦
          g ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))) =
            (if h :
                  ∃ (j : Fin n),
                    Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                      ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι) then
                a
                  (h.choose (p := fun (j : Fin n) ↦
                    Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                      ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι)))
              else 0) *
              c)
          ⋯ *
        a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
    else 0) =
    g i

Tactic:
simp only [hj.choose_spec, ↓reduceIte]

Premises used: Exists.choose_spec, reduceIte
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
rw :
  a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) *
      Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ =
    g i
⊢ Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ *
      a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) =
    g i

Tactic:
rw [mul_comm]

Premises used: mul_comm
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
rw :
  (if h :
        ∃ (j : Fin n),
          Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
            ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι) then
      a
        (h.choose (p := fun (j : Fin n) ↦
          Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
            ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι)))
    else 0) *
    Exists.choose (p := fun (c : R) ↦
      g ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))) =
        (if h :
              ∃ (j : Fin n),
                Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                  ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι) then
            a
              (h.choose (p := fun (j : Fin n) ↦
                Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                  ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι)))
          else 0) *
          c)
      ⋯
| g i

Tactic:
rw [← hj.choose_spec, (h (f hj.choose)).choose_spec]

Premises used: Exists.choose_spec, Exists.choose, DFunLike.coe
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
conv_rhs :
  a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) *
      Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ =
    (if h :
          ∃ (j : Fin n),
            Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
              ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι) then
        a
          (h.choose (p := fun (j : Fin n) ↦
            Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
              ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι)))
      else 0) *
      Exists.choose (p := fun (c : R) ↦
        g ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))) =
          (if h :
                ∃ (j : Fin n),
                  Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                    ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι) then
              a
                (h.choose (p := fun (j : Fin n) ↦
                  Eq (α := ι) ((f : (a : Fin n) → ι) j : ι)
                    ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) : ι)))
            else 0) *
            c)
        ⋯
⊢ a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) *
      Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ =
    g i

Tactic:
conv_rhs =>
                rw [← hj.choose_spec, (h (f hj.choose)).choose_spec]

Premises used: Exists.choose_spec, Exists.choose, DFunLike.coe
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
h₁ : ∀ (x : R), i = (f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
h₂ :
  ∀ (x : R),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
      else 0) =
      a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
⊢ a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) *
      Exists.choose (p := fun (c : R) ↦
        g i =
          (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
              a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
            else 0) *
            c)
        ⋯ =
    a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) *
      Exists.choose (p := fun (c : R) ↦
        g ((f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))) =
          a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i)) * c)
        ⋯

Tactic:
congr!
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
x : R
⊢ i = (f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))

Tactic:
hj.choose_spec.symm

Premises used: Exists.choose_spec, Eq.symm
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
x : R
⊢ i = (f : (a : Fin n) → ι) (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))

Tactic:
exact hj.choose_spec.symm

Premises used: Exists.choose_spec, Eq.symm
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i
x : R
⊢ (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
      a (Exists.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i) ⋯)
    else 0) =
    a (hj.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))

Tactic:
simp [hj]
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∀ (j : Fin n), (f : (a : Fin n) → ι) j ≠ i
⊢ Eq.{u_2 + 1} (α := R) (∑ _x : Fin n, 0) 0

Tactic:
Finset.sum_const_zero

Premises used: Finset.sum_const_zero
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∀ (j : Fin n), (f : (a : Fin n) → ι) j ≠ i
h₁ :
  ∀ (x : Fin n),
    Membership.mem (γ := Finset (Fin n)) Finset.univ x →
      (if i = (f : (a : Fin n) → ι) x then
          Exists.choose (p := fun (c : R) ↦ g ((f : (a : Fin n) → ι) x) = a x * c) ⋯ • a x
        else 0) =
        0
h₂ : g i = 0
⊢ (∑ x : Fin n,
      if i = (f : (a : Fin n) → ι) x then
        Exists.choose (p := fun (c : R) ↦ g ((f : (a : Fin n) → ι) x) = a x * c) ⋯ • a x
      else 0) =
    g i

Tactic:
convert! Finset.sum_const_zero with x

Premises used: Finset.sum_const_zero
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
hj : ∀ (j : Fin n), (f : (a : Fin n) → ι) j ≠ i
x : Fin n
h_1 : Membership.mem (γ := Finset (Fin n)) Finset.univ x
⊢ (f : (a : Fin n) → ι) x ≠ i

Tactic:
specialize hj x
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
x : Fin n
h_1 : Membership.mem (γ := Finset (Fin n)) Finset.univ x
hj : (f : (a : Fin n) → ι) x ≠ i
⊢ i ≠ (f : (a : Fin n) → ι) x

Tactic:
rw [ne_comm] at hj

Premises used: ne_comm
-- Module: Mathlib.LinearAlgebra.FreeModule.Int
Goal:
ι : Type u_1
R : Type u_2
M : Type u_3
n : ℕ
inst : CommRing R
inst_1 : AddCommGroup M
inst_2 : Fintype ι
inst_3 : Module R M
N : Submodule R M
bM : Basis ι R M
bN : Basis.{0, u_2, u_3} (Fin n) R ↥N
f : Fin n ↪ ι
a : Fin n → R
snf :
  ∀ (i : Fin n),
    (↑((bN : (a : Fin n) → ↥N) i) : M) =
      HSMul.hSMul (β := M) (a i) ((bM : (a : ι) → M) ((f : (a : Fin n) → ι) i : ι) : M)
N' : Submodule R (ι → R) := Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
hN' : N' = Submodule.map (↑bM.equivFun : M →ₗ[R] ι → R) N
bN' : Basis (Fin n) R ↥N' := bN.map (bM.equivFun.submoduleMap N)
snf' :
  ∀ (i : Fin n),
    Eq (α := ι → R) ((↑((bN' : (a : Fin n) → ↥N') i) : ι → R) : ι → R)
      (Pi.single (M := fun (j : ι) ↦ R) ((f : (a : Fin n) → ι) i) (a i) : (j : ι) → R)
hNN' : N.toAddSubgroup.index = AddSubgroup.index (G := ι → R) N'.toAddSubgroup
g : ι → R
h :
  ∀ (i : ι),
    (if h : ∃ (j : Fin n), (f : (a : Fin n) → ι) j = i then
        a (h.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = i))
      else 0) ∣
      g i
i : ι
x : Fin n
h_1 : Membership.mem (γ := Finset (Fin n)) Finset.univ x
hj : i ≠ (f : (a : Fin n) → ι) x
⊢ (if i = (f : (a : Fin n) → ι) x then Exists.choose (p := fun (c : R) ↦ g ((f : (a : Fin n) → ι) x) = a x * c) ⋯ • a x
    else 0) =
    0

Tactic:
simp [hj]