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

tactic: have : ∃ ϕ : M →ₗ[R] R, ∀ ψ : M →ₗ[R] R, ¬ϕ.submoduleImage N < ψ.submoduleImage N := by
  obtain ⟨P, P_eq, P_max⟩ :=
    set_has_maximal_iff_noetherian.mpr (inferInstance : IsNoetherian R R) _
      (show (Set.range fun ψ : M →ₗ[R] R ↦ ψ.submoduleImage N).Nonempty from
        ⟨_, Set.mem_range.mpr ⟨0, rfl⟩⟩)
  obtain ⟨ϕ, rfl⟩ := Set.mem_range.mp P_eq
  exact ⟨ϕ, fun ψ hψ ↦ P_max _ ⟨_, rfl⟩ hψ⟩
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: let ϕ := this.choose
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have ϕ_max := this.choose_spec
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: let a := generator (ϕ.submoduleImage N)
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have a_mem : a ∈ ϕ.submoduleImage N := generator_mem _
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: by_cases a_zero : a = 0
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: obtain ⟨y, yN, ϕy_eq⟩ := (LinearMap.mem_submoduleImage_of_le N_le_M).mp a_mem
state_before: case neg
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have _ϕy_ne_zero : ϕ ⟨y, N_le_M yN⟩ ≠ 0 := fun h ↦ a_zero (ϕy_eq.symm.trans h)
state_before: case neg.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have hdvd : ∀ i, a ∣ b'M.coord i ⟨y, N_le_M yN⟩ := fun i ↦
  generator_maximal_submoduleImage_dvd N_le_M ϕ_max y yN ϕy_eq (b'M.coord i)
state_before: case neg.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: choose c hc using hdvd
state_before: case neg.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
hdvd : ∀ (i : ι), a ∣ ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) }
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: cases nonempty_fintype ι
state_before: case neg.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: let y' : O := ∑ i, c i • b'M i
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have y'M : y' ∈ M := M.sum_mem fun i _ ↦ M.smul_mem (c i) (b'M i).2
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have mk_y' : (⟨y', y'M⟩ : M) = ∑ i, c i • b'M i :=
  Subtype.ext
    (show y' = M.subtype _ by
      simp only [LinearMap.map_sum, LinearMap.map_smul]
      rfl)
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have a_smul_y' : a • y' = y := by
  refine Subtype.mk_eq_mk.mp (show (a • ⟨y', y'M⟩ : M) = ⟨y, N_le_M yN⟩ from ?_)
  rw [← b'M.sum_repr ⟨y, N_le_M yN⟩, mk_y', Finset.smul_sum]
  refine' Finset.sum_congr rfl fun i _ ↦ _
  rw [← mul_smul, ← hc]
  rfl
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: refine' ⟨y', y'M, a, a_smul_y'.symm ▸ yN, _⟩
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: have ϕy'_eq : ϕ ⟨y', y'M⟩ = 1 :=
  mul_left_cancel₀ a_zero
    (calc
      a • ϕ ⟨y', y'M⟩ = ϕ ⟨a • y', _⟩ := (ϕ.map_smul a ⟨y', y'M⟩).symm
      _ = ϕ ⟨y, N_le_M yN⟩ := by simp only [a_smul_y']
      _ = a := ϕy_eq
      _ = a * 1 := (mul_one a).symm
      )
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: have ϕy'_ne_zero : ϕ ⟨y', y'M⟩ ≠ 0 := by simpa only [ϕy'_eq] using one_ne_zero
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: let M' : Submodule R O := ϕ.ker.map M.subtype
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: let N' : Submodule R O := (ϕ.comp (ofLe N_le_M)).ker.map N.subtype
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: have M'_le_M : M' ≤ M := M.map_subtype_le (LinearMap.ker ϕ)
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: have N'_le_M' : N' ≤ M' := by
  intro x hx
  simp only [mem_map, LinearMap.mem_ker] at hx⊢
  obtain ⟨⟨x, xN⟩, hx, rfl⟩ := hx
  exact ⟨⟨x, N_le_M xN⟩, hx, rfl⟩
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: have N'_le_N : N' ≤ N := N.map_subtype_le (LinearMap.ker (ϕ.comp (ofLe N_le_M)))
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: refine' ⟨M', M'_le_M, N', N'_le_N, N'_le_M', _⟩
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
⊢ ∃ M',
    M' ≤ M ∧
      ∃ N',
        N' ≤ N ∧
          ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
            ∀ (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))

tactic: have ay'_ortho_N' : ∀ (c : R), ∀ z ∈ N', c • a • y' + z = 0 → c = 0 := by
  intro c z zN' hc
  refine' (mul_eq_zero.mp (y'_ortho_M' (a * c) z (N'_le_M' zN') _)).resolve_left a_zero
  rw [mul_comm, mul_smul, hc]
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
⊢ ∃ _y_ortho_M' _ay_ortho_N',
    ∀ (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))

tactic: refine' ⟨y'_ortho_M', ay'_ortho_N', fun n' bN' ↦ ⟨_, _⟩⟩
state_before: case neg.intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
⊢ ∃ _y_ortho_M' _ay_ortho_N',
    ∀ (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))

tactic: intro m' hn'm' bM'
state_before: case neg.intro.intro.intro.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ ∀ (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)),
              ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
                        (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
                    i) =
                as' i • ↑(↑bM (↑(Fin.castLE hnm) i))

tactic: refine' ⟨Nat.succ_le_succ hn'm', _, _⟩
state_before: case neg.intro.intro.intro.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
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)),
            ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
                      (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
                  i) =
              as' i • ↑(↑bM (↑(Fin.castLE hnm) i))

tactic: intro as h
state_before: case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
⊢ ∀ (as : Fin n' → R),
    (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))) →
      ∃ as',
        ∀ (i : Fin (n' + 1)),
          ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
                    (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
                i) =
            as' i •
              ↑(↑(Basis.mkFinConsOfLe y' y'M bM' M'_le_M y'_ortho_M' (_ : ∀ (z : O), z ∈ M → ∃ c, z + c • y' ∈ M'))
                  (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) i))

tactic: refine' ⟨Fin.cons a as, _⟩
state_before: case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
⊢ ∃ as',
    ∀ (i : Fin (n' + 1)),
      ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
                (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
            i) =
        as' i •
          ↑(↑(Basis.mkFinConsOfLe y' y'M bM' M'_le_M y'_ortho_M' (_ : ∀ (z : O), z ∈ M → ∃ c, z + c • y' ∈ M'))
              (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) i))

tactic: intro i
state_before: case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
⊢ ∀ (i : Fin (n' + 1)),
    ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
              (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
          i) =
      Fin.cons a as i •
        ↑(↑(Basis.mkFinConsOfLe y' y'M bM' M'_le_M y'_ortho_M' (_ : ∀ (z : O), z ∈ M → ∃ c, z + c • y' ∈ M'))
            (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) i))

tactic: rw [Basis.coe_mkFinConsOfLe, Basis.coe_mkFinConsOfLe]
state_before: case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i : Fin (n' + 1)
⊢ ↑(↑(Basis.mkFinConsOfLe y yN bN' N'_le_N (_ : ∀ (c : R) (z : O), z ∈ N' → c • y + z = 0 → c = 0)
            (_ : ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'))
        i) =
    Fin.cons a as i •
      ↑(↑(Basis.mkFinConsOfLe y' y'M bM' M'_le_M y'_ortho_M' (_ : ∀ (z : O), z ∈ M → ∃ c, z + c • y' ∈ M'))
          (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) i))

tactic: refine' Fin.cases _ (fun i ↦ _) i
state_before: case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i : Fin (n' + 1)
⊢ ↑(Fin.cons { val := y, property := yN } (↑(ofLe N'_le_N) ∘ ↑bN') i) =
    Fin.cons a as i •
      ↑(Fin.cons { val := y', property := y'M } (↑(ofLe M'_le_M) ∘ ↑bM')
          (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) i))

tactic: obtain ⟨P, P_eq, P_max⟩ :=
  set_has_maximal_iff_noetherian.mpr (inferInstance : IsNoetherian R R) _
    (show (Set.range fun ψ : M →ₗ[R] R ↦ ψ.submoduleImage N).Nonempty from
      ⟨_, Set.mem_range.mpr ⟨0, rfl⟩⟩)
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
⊢ ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N

tactic: obtain ⟨ϕ, rfl⟩ := Set.mem_range.mp P_eq
state_before: case intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
P : Submodule R R
P_eq : P ∈ range fun ψ => LinearMap.submoduleImage ψ N
P_max : ∀ (I : Submodule R R), (I ∈ range fun ψ => LinearMap.submoduleImage ψ N) → ¬P < I
⊢ ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N

tactic: exact ⟨ϕ, fun ψ hψ ↦ P_max _ ⟨_, rfl⟩ hψ⟩
state_before: case intro.intro.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
ϕ : { x // x ∈ M } →ₗ[R] R
P_eq : LinearMap.submoduleImage ϕ N ∈ range fun ψ => LinearMap.submoduleImage ψ N
P_max : ∀ (I : Submodule R R), (I ∈ range fun ψ => LinearMap.submoduleImage ψ N) → ¬LinearMap.submoduleImage ϕ N < I
⊢ ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N

tactic: have := eq_bot_of_generator_maximal_submoduleImage_eq_zero b'M N_le_M ϕ_max a_zero
state_before: case pos
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : a = 0
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: contradiction
state_before: case pos
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this✝ : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this✝
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this✝) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : a = 0
this : N = ⊥
⊢ ∃ y,
    y ∈ M ∧
      ∃ a x M',
        M' ≤ M ∧
          ∃ N',
            N' ≤ N ∧
              ∃ _N'_le_M' _y_ortho_M' _ay_ortho_N',
                ∀ (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))

tactic: simp only [LinearMap.map_sum, LinearMap.map_smul]
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
⊢ y' = ↑(Submodule.subtype M) (∑ i : ι, c i • ↑b'M i)

tactic: rfl
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
⊢ ∑ x : ι, ↑(c x • ↑b'M x) = ∑ x : ι, c x • ↑(Submodule.subtype M) (↑b'M x)

tactic: refine Subtype.mk_eq_mk.mp (show (a • ⟨y', y'M⟩ : M) = ⟨y, N_le_M yN⟩ from ?_)
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
⊢ a • y' = y

tactic: rw [← b'M.sum_repr ⟨y, N_le_M yN⟩, mk_y', Finset.smul_sum]
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
⊢ a • { val := y', property := y'M } = { val := y, property := (_ : y ∈ M) }

tactic: refine' Finset.sum_congr rfl fun i _ ↦ _
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
⊢ ∑ x : ι, a • c x • ↑b'M x = ∑ i : ι, ↑(↑b'M.repr { val := y, property := (_ : y ∈ M) }) i • ↑b'M i

tactic: rw [← mul_smul, ← hc]
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
i : ι
x✝ : i ∈ Finset.univ
⊢ a • c i • ↑b'M i = ↑(↑b'M.repr { val := y, property := (_ : y ∈ M) }) i • ↑b'M i

tactic: rfl
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
i : ι
x✝ : i ∈ Finset.univ
⊢ ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } • ↑b'M i =
    ↑(↑b'M.repr { val := y, property := (_ : y ∈ M) }) i • ↑b'M i

tactic: simp only [a_smul_y']
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
⊢ ↑ϕ { val := a • y', property := (_ : a • ↑{ val := y', property := y'M } ∈ M) } =
    ↑ϕ { val := y, property := (_ : y ∈ M) }

tactic: simpa only [ϕy'_eq] using one_ne_zero
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
⊢ ↑ϕ { val := y', property := y'M } ≠ 0

tactic: intro x hx
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
⊢ N' ≤ M'

tactic: simp only [mem_map, LinearMap.mem_ker] at hx⊢
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
x : O
hx : x ∈ N'
⊢ x ∈ M'

tactic: obtain ⟨⟨x, xN⟩, hx, rfl⟩ := hx
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
x : O
hx : ∃ y, ↑(LinearMap.comp (Exists.choose this) (ofLe N_le_M)) y = 0 ∧ ↑(Submodule.subtype N) y = x
⊢ ∃ y, ↑(Exists.choose this) y = 0 ∧ ↑(Submodule.subtype M) y = x

tactic: exact ⟨⟨x, N_le_M xN⟩, hx, rfl⟩
state_before: case intro.mk.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
x : O
xN : x ∈ N
hx : ↑(LinearMap.comp (Exists.choose this) (ofLe N_le_M)) { val := x, property := xN } = 0
⊢ ∃ y, ↑(Exists.choose this) y = 0 ∧ ↑(Submodule.subtype M) y = ↑(Submodule.subtype N) { val := x, property := xN }

tactic: intro c x xM' hc
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
⊢ ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0

tactic: obtain ⟨⟨x, xM⟩, hx', rfl⟩ := Submodule.mem_map.mp xM'
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
c : R
x : O
xM' : x ∈ M'
hc : c • y' + x = 0
⊢ c = 0

tactic: rw [LinearMap.mem_ker] at hx'
state_before: case intro.mk.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
c : R
x : O
xM : x ∈ M
hx' : { val := x, property := xM } ∈ LinearMap.ker ϕ
xM' : ↑(Submodule.subtype M) { val := x, property := xM } ∈ M'
hc : c • y' + ↑(Submodule.subtype M) { val := x, property := xM } = 0
⊢ c = 0

tactic: simpa only [LinearMap.map_add, LinearMap.map_zero, LinearMap.map_smul, smul_eq_mul, add_zero,
  mul_eq_zero, ϕy'_ne_zero, hx', or_false_iff] using congr_arg ϕ hc'
state_before: case intro.mk.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
c : R
x : O
xM : x ∈ M
hx' : ↑ϕ { val := x, property := xM } = 0
xM' : ↑(Submodule.subtype M) { val := x, property := xM } ∈ M'
hc : c • y' + ↑(Submodule.subtype M) { val := x, property := xM } = 0
hc' : c • { val := y', property := y'M } + { val := x, property := xM } = 0
⊢ c = 0

tactic: intro c z zN' hc
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
⊢ ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0

tactic: refine' (mul_eq_zero.mp (y'_ortho_M' (a * c) z (N'_le_M' zN') _)).resolve_left a_zero
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
c : R
z : O
zN' : z ∈ N'
hc : c • a • y' + z = 0
⊢ c = 0

tactic: rw [mul_comm, mul_smul, hc]
state_before: ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
c : R
z : O
zN' : z ∈ N'
hc : c • a • y' + z = 0
⊢ (a * c) • y' + z = 0

tactic: refine' Basis.mkFinConsOfLe y yN bN' N'_le_N _ _
state_before: case neg.intro.intro.intro.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ Basis (Fin (n' + 1)) R { x // x ∈ N }

tactic: intro c z zN' hc
state_before: case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ ∀ (c : R) (x : O), x ∈ N' → c • y + x = 0 → c = 0

tactic: refine' ay'_ortho_N' c z zN' _
state_before: case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
c : R
z : O
zN' : z ∈ N'
hc : c • y + z = 0
⊢ c = 0

tactic: rwa [← a_smul_y'] at hc
state_before: case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c✝ : ι → R
hc✝ : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c✝ i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c✝ i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c✝ i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
c : R
z : O
zN' : z ∈ N'
hc : c • y + z = 0
⊢ c • a • y' + z = 0

tactic: intro z zN
state_before: case neg.intro.intro.intro.refine'_1.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ ∀ (z : O), z ∈ N → ∃ c, z + c • y ∈ N'

tactic: obtain ⟨b, hb⟩ : _ ∣ ϕ ⟨z, N_le_M zN⟩ := generator_submoduleImage_dvd_of_mem N_le_M ϕ zN
state_before: case neg.intro.intro.intro.refine'_1.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
z : O
zN : z ∈ N
⊢ ∃ c, z + c • y ∈ N'

tactic: refine' ⟨-b, Submodule.mem_map.mpr ⟨⟨_, N.sub_mem zN (N.smul_mem b yN)⟩, _, _⟩⟩
state_before: case neg.intro.intro.intro.refine'_1.refine'_2.intro
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
z : O
zN : z ∈ N
b : R
hb : ↑ϕ { val := z, property := (_ : z ∈ M) } = generator (LinearMap.submoduleImage ϕ N) * b
⊢ ∃ c, z + c • y ∈ N'

tactic: refine' LinearMap.mem_ker.mpr (show ϕ (⟨z, N_le_M zN⟩ - b • ⟨y, N_le_M yN⟩) = 0 from _)
state_before: case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
z : O
zN : z ∈ N
b : R
hb : ↑ϕ { val := z, property := (_ : z ∈ M) } = generator (LinearMap.submoduleImage ϕ N) * b
⊢ { val := z - b • y, property := (_ : z - b • y ∈ N) } ∈ LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M))

tactic: rw [LinearMap.map_sub, LinearMap.map_smul, hb, ϕy_eq, smul_eq_mul, mul_comm, sub_self]
state_before: case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
z : O
zN : z ∈ N
b : R
hb : ↑ϕ { val := z, property := (_ : z ∈ M) } = generator (LinearMap.submoduleImage ϕ N) * b
⊢ ↑ϕ ({ val := z, property := (_ : z ∈ M) } - b • { val := y, property := (_ : y ∈ M) }) = 0

tactic: simp only [sub_eq_add_neg, neg_smul, coeSubtype]
state_before: case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
z : O
zN : z ∈ N
b : R
hb : ↑ϕ { val := z, property := (_ : z ∈ M) } = generator (LinearMap.submoduleImage ϕ N) * b
⊢ ↑(Submodule.subtype N) { val := z - b • y, property := (_ : z - b • y ∈ N) } = z + -b • y

tactic: refine' Basis.mkFinConsOfLe y' y'M bM' M'_le_M y'_ortho_M' _
state_before: case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
⊢ Basis (Fin (m' + 1)) R { x // x ∈ M }

tactic: intro z zM
state_before: case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
⊢ ∀ (z : O), z ∈ M → ∃ c, z + c • y' ∈ M'

tactic: refine' ⟨-ϕ ⟨z, zM⟩, ⟨⟨z, zM⟩ - ϕ ⟨z, zM⟩ • ⟨y', y'M⟩, LinearMap.mem_ker.mpr _, _⟩⟩
state_before: case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
z : O
zM : z ∈ M
⊢ ∃ c, z + c • y' ∈ M'

tactic: rw [LinearMap.map_sub, LinearMap.map_smul, ϕy'_eq, smul_eq_mul, mul_one, sub_self]
state_before: case neg.intro.intro.intro.refine'_2.refine'_1.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
z : O
zM : z ∈ M
⊢ ↑ϕ ({ val := z, property := zM } - ↑ϕ { val := z, property := zM } • { val := y', property := y'M }) = 0

tactic: rw [LinearMap.map_sub, LinearMap.map_smul, sub_eq_add_neg, neg_smul]
state_before: case neg.intro.intro.intro.refine'_2.refine'_1.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
z : O
zM : z ∈ M
⊢ ↑(Submodule.subtype M)
      ({ val := z, property := zM } - ↑ϕ { val := z, property := zM } • { val := y', property := y'M }) =
    z + -↑ϕ { val := z, property := zM } • y'

tactic: rfl
state_before: case neg.intro.intro.intro.refine'_2.refine'_1.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
z : O
zM : z ∈ M
⊢ ↑(Submodule.subtype M) { val := z, property := zM } +
      -(↑ϕ { val := z, property := zM } • ↑(Submodule.subtype M) { val := y', property := y'M }) =
    z + -(↑ϕ { val := z, property := zM } • y')

tactic: simp only [Fin.cons_zero, Fin.castLE_zero]
state_before: case neg.intro.intro.intro.refine'_2.refine'_2.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i : Fin (n' + 1)
⊢ ↑(Fin.cons { val := y, property := yN } (↑(ofLe N'_le_N) ∘ ↑bN') 0) =
    Fin.cons a as 0 •
      ↑(Fin.cons { val := y', property := y'M } (↑(ofLe M'_le_M) ∘ ↑bM')
          (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) 0))

tactic: exact a_smul_y'.symm
state_before: case neg.intro.intro.intro.refine'_2.refine'_2.refine'_1
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i : Fin (n' + 1)
⊢ y = generator (LinearMap.submoduleImage (Exists.choose this) N) • ∑ x : ι, ↑(c x • ↑b'M x)

tactic: rw [Fin.castLE_succ]
state_before: case neg.intro.intro.intro.refine'_2.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i✝ : Fin (n' + 1)
i : Fin n'
⊢ ↑(Fin.cons { val := y, property := yN } (↑(ofLe N'_le_N) ∘ ↑bN') (Fin.succ i)) =
    Fin.cons a as (Fin.succ i) •
      ↑(Fin.cons { val := y', property := y'M } (↑(ofLe M'_le_M) ∘ ↑bM')
          (↑(Fin.castLE (_ : Nat.succ n' ≤ Nat.succ m')) (Fin.succ i)))

tactic: simp only [Fin.cons_succ, Function.comp_apply, coe_ofLe, map_coe, coeSubtype, h i]
state_before: case neg.intro.intro.intro.refine'_2.refine'_2.refine'_2
ι : Type u_1
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type ?u.43078
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_2
inst✝¹ : AddCommGroup O
inst✝ : Module R O
M N : Submodule R O
b'M : Basis ι R { x // x ∈ M }
N_bot : N ≠ ⊥
N_le_M : N ≤ M
this : ∃ ϕ, ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
ϕ : { x // x ∈ M } →ₗ[R] R := Exists.choose this
ϕ_max : ∀ (ψ : { x // x ∈ M } →ₗ[R] R), ¬LinearMap.submoduleImage (Exists.choose this) N < LinearMap.submoduleImage ψ N
a : R := generator (LinearMap.submoduleImage ϕ N)
a_mem : a ∈ LinearMap.submoduleImage ϕ N
a_zero : ¬a = 0
y : O
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ M) } = a
_ϕy_ne_zero : ↑ϕ { val := y, property := (_ : y ∈ M) } ≠ 0
c : ι → R
hc : ∀ (i : ι), ↑(Basis.coord b'M i) { val := y, property := (_ : y ∈ M) } = a * c i
val✝ : Fintype ι
y' : O := ∑ i : ι, ↑(c i • ↑b'M i)
y'M : y' ∈ M
mk_y' : { val := y', property := y'M } = ∑ i : ι, c i • ↑b'M i
a_smul_y' : a • y' = y
ϕy'_eq : ↑ϕ { val := y', property := y'M } = 1
ϕy'_ne_zero : ↑ϕ { val := y', property := y'M } ≠ 0
M' : Submodule R O := map (Submodule.subtype M) (LinearMap.ker ϕ)
N' : Submodule R O := map (Submodule.subtype N) (LinearMap.ker (LinearMap.comp ϕ (ofLe N_le_M)))
M'_le_M : M' ≤ M
N'_le_M' : N' ≤ M'
N'_le_N : N' ≤ N
y'_ortho_M' : ∀ (c : R) (z : O), z ∈ M' → c • y' + z = 0 → c = 0
ay'_ortho_N' : ∀ (c : R) (z : O), z ∈ N' → c • a • y' + z = 0 → c = 0
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
as : Fin n' → R
h : ∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (↑(Fin.castLE hn'm') i))
i✝ : Fin (n' + 1)
i : Fin n'
⊢ ↑(Fin.cons { val := y, property := yN } (↑(ofLe N'_le_N) ∘ ↑bN') (Fin.succ i)) =
    Fin.cons a as (Fin.succ i) •
      ↑(Fin.cons { val := y', property := y'M } (↑(ofLe M'_le_M) ∘ ↑bM') (Fin.succ (↑(Fin.castLE (_ : n' ≤ m')) i)))