Theorem: Submodule.nonempty_basis_of_pid
File: Mathlib/LinearAlgebra/FreeModule/PID.lean

tactic: haveI := Classical.decEq M
state_before: ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

tactic: cases nonempty_fintype ι
state_before: ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

tactic: induction' N using inductionOnRank with N ih
state_before: case intro
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

tactic: let b' := (b.reindex (Fintype.equivFin ι)).map (LinearEquiv.ofTop _ rfl).symm
state_before: case intro.ih
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: by_cases N_bot : N = ⊥
state_before: case intro.ih
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: obtain ⟨y, -, a, hay, M', -, N', N'_le_N, -, -, ay_ortho, h'⟩ :=
  Submodule.basis_of_pid_aux ⊤ N b' N_bot le_top
state_before: case neg
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: obtain ⟨n', ⟨bN'⟩⟩ := ih N' N'_le_N _ hay ay_ortho
state_before: case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (↑(Fin.castLE hnm) i))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: obtain ⟨bN, _hbN⟩ := h' n' bN'
state_before: case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (↑(Fin.castLE hnm) i))
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: exact ⟨n' + 1, ⟨bN⟩⟩
state_before: case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (↑(Fin.castLE hnm) i))
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
bN : Basis (Fin (n' + 1)) R { x // x ∈ N }
_hbN :
  ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
    ∃ hnm bM,
      ∀ (as : Fin n' → R),
        (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))) →
          ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (↑(Fin.castLE hnm) i))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: infer_instance
state_before: case intro.inst
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι

tactic: exact b
state_before: case intro.b
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Basis ?m.132088 R M

tactic: subst N_bot
state_before: case pos
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : N = ⊥
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })

tactic: exact ⟨0, ⟨Basis.empty _⟩⟩
state_before: case pos
ι✝ : Type ?u.130175
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
ih :
  ∀ (N' : Submodule R M),
    N' ≤ ⊥ →
      ∀ (x : M),
        x ∈ ⊥ → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ ⊥ })