awhecmu/canonical-drafter-extract-mathlib huggingface dataset:
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
⊢ Nat.card R ^ Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} *
      ∏ x ∈ Finset.attach {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x},
        AddSubgroup.index.{u_2} (G := R)
          (Submodule.toAddSubgroup
            (Ideal.span {a (⋯.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = (↑x : ι)))})) =
    Nat.card R ^ (Fintype.card ι - n) *
      ∏ i : Fin n, AddSubgroup.index.{u_2} (G := R) (Submodule.toAddSubgroup (Ideal.span {a i}))
have e_a : Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} = Fintype.card ι - n
Tactic: congr
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
e_a : Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} = Fintype.card ι - n
⊢ Nat.card R ^ Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} *
      ∏ x ∈ Finset.attach {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x},
        AddSubgroup.index.{u_2} (G := R)
          (Submodule.toAddSubgroup
            (Ideal.span {a (⋯.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = (↑x : ι)))})) =
    Nat.card R ^ (Fintype.card ι - n) *
      ∏ i : Fin n, AddSubgroup.index.{u_2} (G := R) (Submodule.toAddSubgroup (Ideal.span {a i}))
have e_a₁ : Eq (α := ℕ)
  (∏ x ∈ Finset.attach {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x},
    AddSubgroup.index.{u_2} (G := R)
      (Submodule.toAddSubgroup (Ideal.span {a (sorry.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = (↑x : ι)))})))
  (∏ i : Fin n, AddSubgroup.index.{u_2} (G := R) (Submodule.toAddSubgroup (Ideal.span {a i})))
Tactic: congr
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
⊢ Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} = Fintype.card ι - n
have h : Eq.{u_1 + 1} (α := Finset ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
  {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}ᶜ
Tactic: convert! Finset.card_compl {x | ∃ j, f j = x} using 2
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
h :
  Eq.{u_1 + 1} (α := Finset ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
    {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}ᶜ
⊢ Finset.card.{u_1} (α := ι) {x : ι | ¬∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} = Fintype.card ι - n
have h₁ : n = Finset.card.{u_1} (α := ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
Tactic: convert! Finset.card_compl {x | ∃ j, f j = x} using 2
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
⊢ n = Finset.card.{u_1} (α := ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
have h : n = Finset.card (α := Fin n) Finset.univ
Tactic: convert! (Finset.card_image_of_injective Finset.univ f.injective).symm
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
h : n = Finset.card (α := Fin n) Finset.univ
⊢ n = Finset.card.{u_1} (α := ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
have h₁ : Eq (α := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
  (Finset.image (α := Fin n) (⇑f : (a : Fin n) → ι) Finset.univ)
Tactic: convert! (Finset.card_image_of_injective Finset.univ f.injective).symm
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (hypothesis)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
i j : Fin n
hij : f' i = f' j
⊢ i = j
have hij₁ : (↑(f' i) : ι) = (↑(f' j) : ι)
Tactic: rw [Subtype.ext_iff] at hij
Cleared hypotheses: hij
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (hypothesis)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
⊢ Eq (α := ℕ)
    (∏ x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x},
      AddSubgroup.index.{u_2} (G := R)
        (Submodule.toAddSubgroup
          (Ideal.span {a (⋯.choose (p := fun (j : Fin n) ↦ (f : (a : Fin n) → ι) j = (↑x : ι)))})))
    (∏ i : Fin n, AddSubgroup.index.{u_2} (G := R) (Submodule.toAddSubgroup (Ideal.span {a i})))
have hf' : Function.Injective f'
Tactic: have hf' : Function.Injective f' := fun i j hij ↦ by
      rw [Subtype.ext_iff] at hij
      exact f.injective hij
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
hf' : Function.Injective f'
f'' : Fin n ↪ ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} := { toFun := f', inj' := hf' }
⊢ Finset.univ = Finset.map f'' Finset.univ
have h : ∀ (x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}),
  Membership.mem (γ := Finset ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) Finset.univ x ↔
    x ∈ Finset.map f'' Finset.univ
Tactic: ext x
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
hf' : Function.Injective f'
f'' : Fin n ↪ ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} := { toFun := f', inj' := hf' }
x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
⊢ Membership.mem (γ := Finset ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) Finset.univ x ↔
    x ∈ Finset.map f'' Finset.univ
have h : ∃ (a : Fin n), (f'' : (a : Fin n) → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) a = x
Tactic: simp only [Finset.univ_eq_attach, Finset.mem_attach, Finset.mem_map, Finset.mem_univ,
        true_and, true_iff]
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (hypothesis)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
hf' : Function.Injective f'
f'' : Fin n ↪ ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} := { toFun := f', inj' := hf' }
x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
⊢ ∃ (a : Fin n), (f'' : (a : Fin n) → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) a = x
have hx : Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} (↑x : ι)
Tactic: have hx := x.property
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (hypothesis)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
hf' : Function.Injective f'
f'' : Fin n ↪ ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} := { toFun := f', inj' := hf' }
x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
hx : Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} (↑x : ι)
⊢ ∃ (a : Fin n), (f'' : (a : Fin n) → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) a = x
have hx₁ : ∃ (a : Fin n), (f : (a : Fin n) → ι) a = (↑x : ι)
Tactic: simp only [Finset.univ_filter_exists, Finset.mem_image, Finset.mem_univ, true_and] at hx
Cleared hypotheses: hx
-- Lean 4 proof step from Mathlib.LinearAlgebra.FreeModule.Int (goal)
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'_1 : 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
hN' :
  Eq (α := AddSubgroup (ι → R)) N'.toAddSubgroup
    (AddSubgroup.pi (f := fun (i : ι) ↦ R) Set.univ fun (i : ι) ↦
      Submodule.toAddSubgroup
        (Ideal.span
          {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}))
f' : Fin n → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} :=
  fun (i : Fin n) ↦
    Subtype.mk (p := fun (x : ι) ↦
      Membership.mem (γ := Finset ι) {x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} x) ((f : (a : Fin n) → ι) i) ⋯
hf' : Function.Injective f'
f'' : Fin n ↪ ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x} := { toFun := f', inj' := hf' }
x : ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}
hx : ∃ (a : Fin n), (f : (a : Fin n) → ι) a = (↑x : ι)
⊢ ∃ (a : Fin n), (f'' : (a : Fin n) → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) a = x
have h : ∀ (i : Fin n) (hi : (f : (a : Fin n) → ι) i = (↑x : ι)),
  ∃ (a : Fin n), (f'' : (a : Fin n) → ↥{x : ι | ∃ (j : Fin n), (f : (a : Fin n) → ι) j = x}) a = x
Tactic: rcases hx with ⟨i, hi⟩
Cleared hypotheses: hx