[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬map ϕ N < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
⊢ N = ⊥
[PROOFSTEP]
rw [Submodule.eq_bot_iff]
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬map ϕ N < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
⊢ ∀ (x : M), x ∈ N → x = 0
[PROOFSTEP]
intro x hx
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬map ϕ N < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
x : M
hx : x ∈ N
⊢ x = 0
[PROOFSTEP]
refine' b.ext_elem fun i ↦ _
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬map ϕ N < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr x) i = ↑(↑b.repr 0) i
[PROOFSTEP]
rw [(eq_bot_iff_generator_eq_zero _).mpr hgen] at hϕ 
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬⊥ < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr x) i = ↑(↑b.repr 0) i
[PROOFSTEP]
rw [LinearEquiv.map_zero, Finsupp.zero_apply]
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ b : Basis ι R M
N : Submodule R M
ϕ : M →ₗ[R] R
hϕ : ∀ (ψ : M →ₗ[R] R), ¬⊥ < map ψ N
inst✝ : IsPrincipal (map ϕ N)
hgen : generator (map ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr x) i = 0
[PROOFSTEP]
exact (Submodule.eq_bot_iff _).mp (not_bot_lt_iff.1 <| hϕ (Finsupp.lapply i ∘ₗ ↑b.repr)) _ ⟨x, hx, rfl⟩
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
⊢ N = ⊥
[PROOFSTEP]
rw [Submodule.eq_bot_iff]
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
⊢ ∀ (x : M), x ∈ N → x = 0
[PROOFSTEP]
intro x hx
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
x : M
hx : x ∈ N
⊢ x = 0
[PROOFSTEP]
refine (mk_eq_zero _ _).mp (show (⟨x, hNO hx⟩ : O) = 0 from b.ext_elem fun i ↦ ?_)
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr { val := x, property := (_ : x ∈ O) }) i = ↑(↑b.repr 0) i
[PROOFSTEP]
rw [(eq_bot_iff_generator_eq_zero _).mpr hgen] at hϕ 
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬⊥ < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr { val := x, property := (_ : x ∈ O) }) i = ↑(↑b.repr 0) i
[PROOFSTEP]
rw [LinearEquiv.map_zero, Finsupp.zero_apply]
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬⊥ < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr { val := x, property := (_ : x ∈ O) }) i = 0
[PROOFSTEP]
refine (Submodule.eq_bot_iff _).mp (not_bot_lt_iff.1 <| hϕ (Finsupp.lapply i ∘ₗ ↑b.repr)) _ ?_
[GOAL]
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_1
b✝ : Basis ι R M
N O : Submodule R M
b : Basis ι R { x // x ∈ O }
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬⊥ < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
hgen : generator (LinearMap.submoduleImage ϕ N) = 0
x : M
hx : x ∈ N
i : ι
⊢ ↑(↑b.repr { val := x, property := (_ : x ∈ O) }) i ∈
    LinearMap.submoduleImage (LinearMap.comp (Finsupp.lapply i) ↑b.repr) N
[PROOFSTEP]
exact (LinearMap.mem_submoduleImage_of_le hNO).mpr ⟨x, hx, rfl⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
⊢ x ∣ generator I ↔ I = Ideal.span {x}
[PROOFSTEP]
conv_rhs => rw [← span_singleton_generator I]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
| I = Ideal.span {x}
[PROOFSTEP]
rw [← span_singleton_generator I]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
| I = Ideal.span {x}
[PROOFSTEP]
rw [← span_singleton_generator I]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
| I = Ideal.span {x}
[PROOFSTEP]
rw [← span_singleton_generator I]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
⊢ x ∣ generator I ↔ span R {generator I} = Ideal.span {x}
[PROOFSTEP]
rw [Ideal.submodule_span_eq, Ideal.span_singleton_eq_span_singleton, ← dvd_dvd_iff_associated, ← mem_iff_generator_dvd]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁴ : CommRing R
inst✝³ : IsDomain R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
I : Ideal R
inst✝ : IsPrincipal I
x : R
hx : x ∈ I
⊢ x ∣ generator I ↔ x ∈ I ∧ x ∣ generator I
[PROOFSTEP]
exact ⟨fun h ↦ ⟨hx, h⟩, fun h ↦ h.2⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
let a : R := generator (ϕ.submoduleImage N)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
let d : R := IsPrincipal.generator (Submodule.span R {a, ψ ⟨y, hNO yN⟩})
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
have d_dvd_left : d ∣ a := (mem_iff_generator_dvd _).mp (subset_span (mem_insert _ _))
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
have d_dvd_right : d ∣ ψ ⟨y, hNO yN⟩ :=
  (mem_iff_generator_dvd _).mp (subset_span (mem_insert_of_mem _ (mem_singleton _)))
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
refine' dvd_trans _ d_dvd_right
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∣ d
[PROOFSTEP]
rw [dvd_generator_iff, Ideal.span, ← span_singleton_generator (Submodule.span R {a, ψ ⟨y, hNO yN⟩})]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ span R {generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})} =
    span R {generator (LinearMap.submoduleImage ϕ N)}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
obtain ⟨r₁, r₂, d_eq⟩ : ∃ r₁ r₂ : R, d = r₁ * a + r₂ * ψ ⟨y, hNO yN⟩ :=
  by
  obtain ⟨r₁, r₂', hr₂', hr₁⟩ := mem_span_insert.mp (IsPrincipal.generator_mem (Submodule.span R {a, ψ ⟨y, hNO yN⟩}))
  obtain ⟨r₂, rfl⟩ := mem_span_singleton.mp hr₂'
  exact ⟨r₁, r₂, hr₁⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ ∃ r₁ r₂, d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
obtain ⟨r₁, r₂', hr₂', hr₁⟩ := mem_span_insert.mp (IsPrincipal.generator_mem (Submodule.span R {a, ψ ⟨y, hNO yN⟩}))
[GOAL]
case intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂' : R
hr₂' : r₂' ∈ span R {↑ψ { val := y, property := (_ : y ∈ O) }}
hr₁ : generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}) = r₁ • a + r₂'
⊢ ∃ r₁ r₂, d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
obtain ⟨r₂, rfl⟩ := mem_span_singleton.mp hr₂'
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
hr₂' : r₂ • ↑ψ { val := y, property := (_ : y ∈ O) } ∈ span R {↑ψ { val := y, property := (_ : y ∈ O) }}
hr₁ :
  generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}) =
    r₁ • a + r₂ • ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ ∃ r₁ r₂, d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
[PROOFSTEP]
exact ⟨r₁, r₂, hr₁⟩
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ span R {generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})} =
    span R {generator (LinearMap.submoduleImage ϕ N)}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
let ψ' : O →ₗ[R] R := r₁ • ϕ + r₂ • ψ
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
⊢ span R {generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})} =
    span R {generator (LinearMap.submoduleImage ϕ N)}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
have : span R { d } ≤ ψ'.submoduleImage N :=
  by
  rw [span_le, singleton_subset_iff, SetLike.mem_coe, LinearMap.mem_submoduleImage_of_le hNO]
  refine' ⟨y, yN, _⟩
  change r₁ * ϕ ⟨y, hNO yN⟩ + r₂ * ψ ⟨y, hNO yN⟩ = d
  rw [d_eq, ϕy_eq]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
⊢ span R {d} ≤ LinearMap.submoduleImage ψ' N
[PROOFSTEP]
rw [span_le, singleton_subset_iff, SetLike.mem_coe, LinearMap.mem_submoduleImage_of_le hNO]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
⊢ ∃ y yN, ↑ψ' { val := y, property := (_ : y ∈ O) } = d
[PROOFSTEP]
refine' ⟨y, yN, _⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
⊢ ↑ψ' { val := y, property := (_ : y ∈ O) } = d
[PROOFSTEP]
change r₁ * ϕ ⟨y, hNO yN⟩ + r₂ * ψ ⟨y, hNO yN⟩ = d
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
⊢ r₁ * ↑ϕ { val := y, property := (_ : y ∈ O) } + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) } = d
[PROOFSTEP]
rw [d_eq, ϕy_eq]
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
this : span R {d} ≤ LinearMap.submoduleImage ψ' N
⊢ span R {generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})} =
    span R {generator (LinearMap.submoduleImage ϕ N)}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
refine' le_antisymm (this.trans (le_of_eq _)) (Ideal.span_singleton_le_span_singleton.mpr d_dvd_left)
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
this : span R {d} ≤ LinearMap.submoduleImage ψ' N
⊢ LinearMap.submoduleImage ψ' N = span R {generator (LinearMap.submoduleImage ϕ N)}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
rw [span_singleton_generator]
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
this : span R {d} ≤ LinearMap.submoduleImage ψ' N
⊢ LinearMap.submoduleImage ψ' N = LinearMap.submoduleImage ϕ N
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
apply (le_trans _ this).eq_of_not_gt (hϕ ψ')
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
this : span R {d} ≤ LinearMap.submoduleImage ψ' N
⊢ LinearMap.submoduleImage ϕ N ≤ span R {d}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
rw [← span_singleton_generator (ϕ.submoduleImage N)]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
r₁ r₂ : R
d_eq : d = r₁ * a + r₂ * ↑ψ { val := y, property := (_ : y ∈ O) }
ψ' : { x // x ∈ O } →ₗ[R] R := r₁ • ϕ + r₂ • ψ
this : span R {d} ≤ LinearMap.submoduleImage ψ' N
⊢ span R {generator (LinearMap.submoduleImage ϕ N)} ≤ span R {d}
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
exact Ideal.span_singleton_le_span_singleton.mpr d_dvd_left
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : ι → M
N O : Submodule R M
hNO : N ≤ O
ϕ : { x // x ∈ O } →ₗ[R] R
hϕ : ∀ (ψ : { x // x ∈ O } →ₗ[R] R), ¬LinearMap.submoduleImage ϕ N < LinearMap.submoduleImage ψ N
inst✝ : IsPrincipal (LinearMap.submoduleImage ϕ N)
y : M
yN : y ∈ N
ϕy_eq : ↑ϕ { val := y, property := (_ : y ∈ O) } = generator (LinearMap.submoduleImage ϕ N)
ψ : { x // x ∈ O } →ₗ[R] R
a : R := generator (LinearMap.submoduleImage ϕ N)
d : R := generator (span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }})
d_dvd_left : d ∣ a
d_dvd_right : d ∣ ↑ψ { val := y, property := (_ : y ∈ O) }
⊢ generator (LinearMap.submoduleImage ϕ N) ∈ span R {a, ↑ψ { val := y, property := (_ : y ∈ O) }}
[PROOFSTEP]
exact subset_span (mem_insert _ _)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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ψ⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
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⟩⟩)
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
obtain ⟨ϕ, rfl⟩ := Set.mem_range.mp P_eq
[GOAL]
case intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
exact ⟨ϕ, fun ψ hψ ↦ P_max _ ⟨_, rfl⟩ hψ⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
let ϕ := this.choose
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have ϕ_max := this.choose_spec
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
let a := generator (ϕ.submoduleImage N)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have a_mem : a ∈ ϕ.submoduleImage N :=
  generator_mem
    _
      -- If `a` is zero, then the submodule is trivial. So let's assume `a ≠ 0`, `N ≠ ⊥`.
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
by_cases a_zero : a = 0
[GOAL]
case pos
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have := eq_bot_of_generator_maximal_submoduleImage_eq_zero b'M N_le_M ϕ_max a_zero
[GOAL]
case pos
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
contradiction
  -- We claim that `ϕ⁻¹ a = y` can be taken as basis element of `N`.
[GOAL]
case neg
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
obtain ⟨y, yN, ϕy_eq⟩ := (LinearMap.mem_submoduleImage_of_le N_le_M).mp a_mem
[GOAL]
case neg.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have _ϕy_ne_zero : ϕ ⟨y, N_le_M yN⟩ ≠ 0 := fun h ↦
  a_zero
    (ϕy_eq.symm.trans h)
      -- Write `y` as `a • y'` for some `y'`.
[GOAL]
case neg.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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)
[GOAL]
case neg.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
choose c hc using hdvd
[GOAL]
case neg.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
let y' : O := ∑ i, c i • b'M i
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have y'M : y' ∈ M := M.sum_mem fun i _ ↦ M.smul_mem (c i) (b'M i).2
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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)
[PROOFSTEP]
simp only [LinearMap.map_sum, LinearMap.map_smul]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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)
[PROOFSTEP]
rfl
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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
    -- We found a `y` and an `a`!
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
refine Subtype.mk_eq_mk.mp (show (a • ⟨y', y'M⟩ : M) = ⟨y, N_le_M yN⟩ from ?_)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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) }
[PROOFSTEP]
rw [← b'M.sum_repr ⟨y, N_le_M yN⟩, mk_y', Finset.smul_sum]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
refine' Finset.sum_congr rfl fun i _ ↦ _
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rw [← mul_smul, ← hc]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rfl
  -- We found a `y` and an `a`!
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' ⟨y', y'M, a, a_smul_y'.symm ▸ yN, _⟩
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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) }
[PROOFSTEP]
simp only [a_smul_y']
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have ϕy'_ne_zero : ϕ ⟨y', y'M⟩ ≠ 0 := by simpa only [ϕy'_eq] using one_ne_zero
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
simpa only [ϕy'_eq] using one_ne_zero
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
let M' : Submodule R O := ϕ.ker.map M.subtype
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
let N' : Submodule R O := (ϕ.comp (ofLe N_le_M)).ker.map N.subtype
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have M'_le_M : M' ≤ M := M.map_subtype_le (LinearMap.ker ϕ)
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
simp only [mem_map, LinearMap.mem_ker] at hx ⊢
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
obtain ⟨⟨x, xN⟩, hx, rfl⟩ := hx
[GOAL]
case intro.mk.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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 }
[PROOFSTEP]
exact ⟨⟨x, N_le_M xN⟩, hx, rfl⟩
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
have N'_le_N : N' ≤ N :=
  N.map_subtype_le
    (LinearMap.ker (ϕ.comp (ofLe N_le_M)))
      -- So fill in those results as well.
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine'
  ⟨M', M'_le_M, N', N'_le_N, N'_le_M', _⟩
    -- Note that `y'` is orthogonal to `M'`.
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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' _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))
[PROOFSTEP]
have y'_ortho_M' : ∀ (c : R), ∀ z ∈ M', c • y' + z = 0 → c = 0 :=
  by
  intro c x xM' hc
  obtain ⟨⟨x, xM⟩, hx', rfl⟩ := Submodule.mem_map.mp xM'
  rw [LinearMap.mem_ker] at hx' 
  have hc' : (c • ⟨y', y'M⟩ + ⟨x, xM⟩ : M) = 0 := by exact @Subtype.coe_injective O (· ∈ M) _ _ hc
  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'
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
intro c x xM' hc
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
obtain ⟨⟨x, xM⟩, hx', rfl⟩ := Submodule.mem_map.mp xM'
[GOAL]
case intro.mk.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rw [LinearMap.mem_ker] at hx' 
[GOAL]
case intro.mk.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
⊢ c = 0
[PROOFSTEP]
have hc' : (c • ⟨y', y'M⟩ + ⟨x, xM⟩ : M) = 0 := by exact @Subtype.coe_injective O (· ∈ M) _ _ hc
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
⊢ c • { val := y', property := y'M } + { val := x, property := xM } = 0
[PROOFSTEP]
exact @Subtype.coe_injective O (· ∈ M) _ _ hc
[GOAL]
case intro.mk.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
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'
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
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]
    -- So we can extend a basis for `N'` with `y`
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
intro c z zN' hc
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
refine' (mul_eq_zero.mp (y'_ortho_M' (a * c) z (N'_le_M' zN') _)).resolve_left a_zero
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rw [mul_comm, mul_smul, hc]
  -- So we can extend a basis for `N'` with `y`
[GOAL]
case neg.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' ⟨y'_ortho_M', ay'_ortho_N', fun n' bN' ↦ ⟨_, _⟩⟩
[GOAL]
case neg.intro.intro.intro.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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 }
[PROOFSTEP]
refine' Basis.mkFinConsOfLE y yN bN' N'_le_N _ _
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
intro c z zN' hc
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
refine' ay'_ortho_N' c z zN' _
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rwa [← a_smul_y'] at hc 
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
intro z zN
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
obtain ⟨b, hb⟩ : _ ∣ ϕ ⟨z, N_le_M zN⟩ := generator_submoduleImage_dvd_of_mem N_le_M ϕ zN
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2.intro
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
refine' ⟨-b, Submodule.mem_map.mpr ⟨⟨_, N.sub_mem zN (N.smul_mem b yN)⟩, _, _⟩⟩
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' LinearMap.mem_ker.mpr (show ϕ (⟨z, N_le_M zN⟩ - b • ⟨y, N_le_M yN⟩) = 0 from _)
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rw [LinearMap.map_sub, LinearMap.map_smul, hb, ϕy_eq, smul_eq_mul, mul_comm, sub_self]
[GOAL]
case neg.intro.intro.intro.refine'_1.refine'_2.intro.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b✝ : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
simp only [sub_eq_add_neg, neg_smul, coeSubtype]
  -- And extend a basis for `M'` with `y'`
[GOAL]
case neg.intro.intro.intro.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
intro m' hn'm' bM'
[GOAL]
case neg.intro.intro.intro.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' ⟨Nat.succ_le_succ hn'm', _, _⟩
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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 }
[PROOFSTEP]
refine' Basis.mkFinConsOfLE y' y'M bM' M'_le_M y'_ortho_M' _
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
intro z zM
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
refine' ⟨-ϕ ⟨z, zM⟩, ⟨⟨z, zM⟩ - ϕ ⟨z, zM⟩ • ⟨y', y'M⟩, LinearMap.mem_ker.mpr _, _⟩⟩
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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
[PROOFSTEP]
rw [LinearMap.map_sub, LinearMap.map_smul, ϕy'_eq, smul_eq_mul, mul_one, sub_self]
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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'
[PROOFSTEP]
rw [LinearMap.map_sub, LinearMap.map_smul, sub_eq_add_neg, neg_smul]
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_1.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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')
[PROOFSTEP]
rfl
  -- It remains to show the extended bases are compatible with each other.
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
intro as h
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' ⟨Fin.cons a as, _⟩
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
intro i
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
rw [Basis.coe_mkFinConsOfLE, Basis.coe_mkFinConsOfLE]
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
refine' Fin.cases _ (fun i ↦ _) i
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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))
[PROOFSTEP]
simp only [Fin.cons_zero, Fin.castLE_zero]
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2.refine'_1
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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)
[PROOFSTEP]
exact a_smul_y'.symm
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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)))
[PROOFSTEP]
rw [Fin.castLE_succ]
[GOAL]
case neg.intro.intro.intro.refine'_2.refine'_2.refine'_2
ι : Type u_1
R : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : IsDomain R
inst✝⁵ : IsPrincipalIdealRing R
M✝ : Type u_3
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
b : ι → M✝
inst✝² : Finite ι
O : Type u_4
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)))
[PROOFSTEP]
simp only [Fin.cons_succ, Function.comp_apply, coe_ofLe, map_coe, coeSubtype, h i]
[GOAL]
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
[PROOFSTEP]
haveI := Classical.decEq M
[GOAL]
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
[PROOFSTEP]
induction' N using inductionOnRank with N ih
[GOAL]
case intro.b
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Basis ?m.114794 R M
[PROOFSTEP]
exact b
[GOAL]
case intro.ih
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
let b' := (b.reindex (Fintype.equivFin ι)).map (LinearEquiv.ofTop _ rfl).symm
[GOAL]
case intro.ih
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
by_cases N_bot : N = ⊥
[GOAL]
case pos
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : N = ⊥
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
[PROOFSTEP]
subst N_bot
[GOAL]
case pos
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
ih :
  ∀ (N' : Submodule R M),
    N' ≤ ⊥ →
      ∀ (x : M),
        x ∈ ⊥ → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ ⊥ })
[PROOFSTEP]
exact ⟨0, ⟨Basis.empty _⟩⟩
[GOAL]
case neg
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨y, -, a, hay, M', -, N', N'_le_N, -, -, ay_ortho, h'⟩ := Submodule.basis_of_pid_aux ⊤ N b' N_bot le_top
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨n', ⟨bN'⟩⟩ := ih N' N'_le_N _ hay ay_ortho
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨bN, _hbN⟩ := h' n' bN'
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
this : DecidableEq M
val✝ : Fintype ι
N : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ N →
      ∀ (x : M),
        x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N' })
b' : Basis (Fin (Fintype.card ι)) R { x // x ∈ ⊤ } :=
  Basis.map (Basis.reindex b (Fintype.equivFin ι)) (LinearEquiv.symm (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤)))
N_bot : ¬N = ⊥
y : M
a : R
hay : a • y ∈ N
M' N' : Submodule R M
N'_le_N : N' ≤ N
ay_ortho : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h' :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' : ℕ
bN' : Basis (Fin n') R { x // x ∈ N' }
bN : Basis (Fin (n' + 1)) R { x // x ∈ N }
_hbN :
  ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
    ∃ hnm bM,
      ∀ (as : Fin n' → R),
        (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
          ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
⊢ ∃ n, Nonempty (Basis (Fin n) R { x // x ∈ N })
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
exact ⟨n' + 1, ⟨bN⟩⟩
[GOAL]
case intro.inst
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
this : DecidableEq M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
infer_instance
[GOAL]
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
⊢ basisOfPid b ⊥ = { fst := 0, snd := Basis.empty { x // x ∈ ⊥ } }
[PROOFSTEP]
obtain ⟨n, b'⟩ := Submodule.basisOfPid b ⊥
[GOAL]
case mk
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
n : ℕ
b' : Basis (Fin n) R { x // x ∈ ⊥ }
⊢ { fst := n, snd := b' } = { fst := 0, snd := Basis.empty { x // x ∈ ⊥ } }
[PROOFSTEP]
let e : Fin n ≃ Fin 0 := b'.indexEquiv (Basis.empty _ : Basis (Fin 0) R (⊥ : Submodule R M))
[GOAL]
case mk
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
n : ℕ
b' : Basis (Fin n) R { x // x ∈ ⊥ }
e : Fin n ≃ Fin 0 := Basis.indexEquiv b' (Basis.empty { x // x ∈ ⊥ })
⊢ { fst := n, snd := b' } = { fst := 0, snd := Basis.empty { x // x ∈ ⊥ } }
[PROOFSTEP]
obtain rfl : n = 0 := by simpa using Fintype.card_eq.mpr ⟨e⟩
[GOAL]
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
n : ℕ
b' : Basis (Fin n) R { x // x ∈ ⊥ }
e : Fin n ≃ Fin 0 := Basis.indexEquiv b' (Basis.empty { x // x ∈ ⊥ })
⊢ n = 0
[PROOFSTEP]
simpa using Fintype.card_eq.mpr ⟨e⟩
[GOAL]
case mk
ι✝ : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι✝ → M
ι : Type u_4
inst✝ : Finite ι
b : Basis ι R M
b' : Basis (Fin 0) R { x // x ∈ ⊥ }
e : Fin 0 ≃ Fin 0 := Basis.indexEquiv b' (Basis.empty { x // x ∈ ⊥ })
⊢ { fst := 0, snd := b' } = { fst := 0, snd := Basis.empty { x // x ∈ ⊥ } }
[PROOFSTEP]
exact Sigma.eq rfl (Basis.eq_of_apply_eq <| finZeroElim)
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
classical
  -- We define `N` as the submodule spanned by a maximal linear independent subfamily of `s`
have := exists_maximal_independent R s
let I : Set ι := this.choose
obtain
  ⟨indepI : LinearIndependent R (s ∘ (fun x => x) : I → M), hI :
    ∀ (i) (_ : i ∉ I), ∃ a : R, a ≠ 0 ∧ a • s i ∈ span R (s '' I)⟩ :=
  this.choose_spec
let N :=
  span R
    (range <| (s ∘ (fun x => x) : I → M))
      -- same as `span R (s '' I)` but more convenient
let _sI : I → N := fun i ↦
  ⟨s i.1, subset_span (mem_range_self i)⟩
    -- `s` restricted to `I` is a basis of `N`
let sI_basis : Basis I R N := Basis.span indepI
have exists_a : ∀ i : ι, ∃ a : R, a ≠ 0 ∧ a • s i ∈ N :=
  by
  intro i
  by_cases hi : i ∈ I
  · use 1, zero_ne_one.symm
    rw [one_smul]
    exact subset_span (mem_range_self (⟨i, hi⟩ : I))
  · simpa [image_eq_range s I] using hI i hi
choose a ha ha' using exists_a
let A := ∏ i, a i
have hA : A ≠ 0 := by
  rw [Finset.prod_ne_zero_iff]
  simpa using ha
let φ : M →ₗ[R] M := LinearMap.lsmul R M A
have : LinearMap.ker φ = ⊥ := @LinearMap.ker_lsmul R M _ _ _ _ _ hA
let ψ := LinearEquiv.ofInjective φ (LinearMap.ker_eq_bot.mp this)
have : LinearMap.range φ ≤ N := by
  -- as announced, `A • M ⊆ N`
  suffices ∀ i, φ (s i) ∈ N by
    rw [LinearMap.range_eq_map, ← hs, map_span_le]
    rintro _ ⟨i, rfl⟩
    apply this
  intro i
  calc
    (∏ j, a j) • s i = (∏ j in { i }ᶜ, a j) • a i • s i := by rw [Fintype.prod_eq_prod_compl_mul i, mul_smul]
    _ ∈ N :=
      N.smul_mem _
        (ha' i)
          -- Since a submodule of a free `R`-module is free, we get that `A • M` is free
obtain ⟨n, b : Basis (Fin n) R (LinearMap.range φ)⟩ := Submodule.basisOfPidOfLE this sI_basis
exact ⟨n, b.map ψ.symm⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
have := exists_maximal_independent R s
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let I : Set ι := this.choose
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
obtain
  ⟨indepI : LinearIndependent R (s ∘ (fun x => x) : I → M), hI :
    ∀ (i) (_ : i ∉ I), ∃ a : R, a ≠ 0 ∧ a • s i ∈ span R (s '' I)⟩ :=
  this.choose_spec
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let N :=
  span R
    (range <| (s ∘ (fun x => x) : I → M))
      -- same as `span R (s '' I)` but more convenient
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let _sI : I → N := fun i ↦
  ⟨s i.1, subset_span (mem_range_self i)⟩
    -- `s` restricted to `I` is a basis of `N`
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let sI_basis : Basis I R N := Basis.span indepI
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
have exists_a : ∀ i : ι, ∃ a : R, a ≠ 0 ∧ a • s i ∈ N :=
  by
  intro i
  by_cases hi : i ∈ I
  · use 1, zero_ne_one.symm
    rw [one_smul]
    exact subset_span (mem_range_self (⟨i, hi⟩ : I))
  · simpa [image_eq_range s I] using hI i hi
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
⊢ ∀ (i : ι), ∃ a, a ≠ 0 ∧ a • s i ∈ N
[PROOFSTEP]
intro i
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
i : ι
⊢ ∃ a, a ≠ 0 ∧ a • s i ∈ N
[PROOFSTEP]
by_cases hi : i ∈ I
[GOAL]
case pos
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
i : ι
hi : i ∈ I
⊢ ∃ a, a ≠ 0 ∧ a • s i ∈ N
[PROOFSTEP]
use 1, zero_ne_one.symm
[GOAL]
case right
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
i : ι
hi : i ∈ I
⊢ 1 • s i ∈ N
[PROOFSTEP]
rw [one_smul]
[GOAL]
case right
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
i : ι
hi : i ∈ I
⊢ s i ∈ N
[PROOFSTEP]
exact subset_span (mem_range_self (⟨i, hi⟩ : I))
[GOAL]
case neg
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
i : ι
hi : ¬i ∈ I
⊢ ∃ a, a ≠ 0 ∧ a • s i ∈ N
[PROOFSTEP]
simpa [image_eq_range s I] using hI i hi
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
exists_a : ∀ (i : ι), ∃ a, a ≠ 0 ∧ a • s i ∈ N
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
choose a ha ha' using exists_a
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let A := ∏ i, a i
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
have hA : A ≠ 0 := by
  rw [Finset.prod_ne_zero_iff]
  simpa using ha
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
⊢ A ≠ 0
[PROOFSTEP]
rw [Finset.prod_ne_zero_iff]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
⊢ ∀ (a_1 : ι), a_1 ∈ Finset.univ → a a_1 ≠ 0
[PROOFSTEP]
simpa using ha
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let φ : M →ₗ[R] M := LinearMap.lsmul R M A
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
have : LinearMap.ker φ = ⊥ := @LinearMap.ker_lsmul R M _ _ _ _ _ hA
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
let ψ := LinearEquiv.ofInjective φ (LinearMap.ker_eq_bot.mp this)
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
have : LinearMap.range φ ≤ N := by
  -- as announced, `A • M ⊆ N`
  suffices ∀ i, φ (s i) ∈ N by
    rw [LinearMap.range_eq_map, ← hs, map_span_le]
    rintro _ ⟨i, rfl⟩
    apply this
  intro i
  calc
    (∏ j, a j) • s i = (∏ j in { i }ᶜ, a j) • a i • s i := by rw [Fintype.prod_eq_prod_compl_mul i, mul_smul]
    _ ∈ N :=
      N.smul_mem _
        (ha' i)
          -- Since a submodule of a free `R`-module is free, we get that `A • M` is free
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
⊢ LinearMap.range φ ≤ N
[PROOFSTEP]
suffices ∀ i, φ (s i) ∈ N by
  rw [LinearMap.range_eq_map, ← hs, map_span_le]
  rintro _ ⟨i, rfl⟩
  apply this
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝¹ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝¹
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this✝ : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
this : ∀ (i : ι), ↑φ (s i) ∈ N
⊢ LinearMap.range φ ≤ N
[PROOFSTEP]
rw [LinearMap.range_eq_map, ← hs, map_span_le]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝¹ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝¹
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this✝ : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
this : ∀ (i : ι), ↑φ (s i) ∈ N
⊢ ∀ (m : M), m ∈ range s → ↑φ m ∈ N
[PROOFSTEP]
rintro _ ⟨i, rfl⟩
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝¹ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝¹
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this✝ : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
this : ∀ (i : ι), ↑φ (s i) ∈ N
i : ι
⊢ ↑φ (s i) ∈ N
[PROOFSTEP]
apply this
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
⊢ ∀ (i : ι), ↑φ (s i) ∈ N
[PROOFSTEP]
intro i
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
i : ι
⊢ ↑φ (s i) ∈ N
[PROOFSTEP]
calc
  (∏ j, a j) • s i = (∏ j in { i }ᶜ, a j) • a i • s i := by rw [Fintype.prod_eq_prod_compl_mul i, mul_smul]
  _ ∈ N :=
    N.smul_mem _
      (ha' i)
        -- Since a submodule of a free `R`-module is free, we get that `A • M` is free
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
i : ι
⊢ (∏ j : ι, a j) • s i = (∏ j in {i}ᶜ, a j) • a i • s i
[PROOFSTEP]
rw [Fintype.prod_eq_prod_compl_mul i, mul_smul]
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝¹ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝¹
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this✝ : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
this : LinearMap.range φ ≤ N
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
obtain ⟨n, b : Basis (Fin n) R (LinearMap.range φ)⟩ := Submodule.basisOfPidOfLE this sI_basis
[GOAL]
case intro.mk
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b✝ : ι → M
inst✝¹ : Fintype ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
this✝¹ : ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
I : Set ι := Exists.choose this✝¹
indepI : LinearIndependent R (s ∘ fun x => ↑x)
hI : ∀ (i : ι), ¬i ∈ I → ∃ a, a ≠ 0 ∧ a • s i ∈ span R (s '' I)
N : Submodule R M := span R (range (s ∘ fun x => ↑x))
_sI : ↑I → { x // x ∈ N } := fun i => { val := s ↑i, property := (_ : s ↑i ∈ ↑(span R (range (s ∘ fun x => ↑x)))) }
sI_basis : Basis (↑I) R { x // x ∈ N } := Basis.span indepI
a : ι → R
ha : ∀ (i : ι), a i ≠ 0
ha' : ∀ (i : ι), a i • s i ∈ N
A : R := ∏ i : ι, a i
hA : A ≠ 0
φ : M →ₗ[R] M := ↑(LinearMap.lsmul R M) A
this✝ : LinearMap.ker φ = ⊥
ψ : M ≃ₗ[R] { x // x ∈ LinearMap.range φ } := LinearEquiv.ofInjective φ (_ : Function.Injective ↑φ)
this : LinearMap.range φ ≤ N
n : ℕ
b : Basis (Fin n) R { x // x ∈ LinearMap.range φ }
⊢ (n : ℕ) × Basis (Fin n) R M
[PROOFSTEP]
exact ⟨n, b.map ψ.symm⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : _root_.Finite ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
⊢ Free R M
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : _root_.Finite ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
val✝ : Fintype ι
⊢ Free R M
[PROOFSTEP]
obtain ⟨n, b⟩ : Σ n, Basis (Fin n) R M := Module.basisOfFiniteTypeTorsionFree hs
[GOAL]
case intro.mk
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b✝ : ι → M
inst✝¹ : _root_.Finite ι
s : ι → M
hs : span R (range s) = ⊤
inst✝ : NoZeroSMulDivisors R M
val✝ : Fintype ι
n : ℕ
b : Basis (Fin n) R M
⊢ Free R M
[PROOFSTEP]
exact Module.Free.of_basis b
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b : ι → M
inst✝¹ : Finite R M
inst✝ : NoZeroSMulDivisors R M
⊢ Free R M
[PROOFSTEP]
obtain ⟨n, b⟩ : Σ n, Basis (Fin n) R M := Module.basisOfFiniteTypeTorsionFree'
[GOAL]
case mk
ι : Type u_1
R : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type u_3
inst✝³ : AddCommGroup M
inst✝² : Module R M
b✝ : ι → M
inst✝¹ : Finite R M
inst✝ : NoZeroSMulDivisors R M
n : ℕ
b : Basis (Fin n) R M
⊢ Free R M
[PROOFSTEP]
exact Module.Free.of_basis b
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
val✝ : Fintype ι
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
[PROOFSTEP]
revert N
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ ∀ (N : Submodule R M), N ≤ O → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
[PROOFSTEP]
induction' O using inductionOnRank with M0 ih
[GOAL]
case intro.b
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Basis ?m.235193 R M
[PROOFSTEP]
exact b
[GOAL]
case intro.ih
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
⊢ ∀ (N : Submodule R M), N ≤ M0 → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
intro N N_le_M0
[GOAL]
case intro.ih
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨m, b'M⟩ := M0.basisOfPid b
[GOAL]
case intro.ih.mk
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
by_cases N_bot : N = ⊥
[GOAL]
case pos
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : N = ⊥
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
[PROOFSTEP]
subst N_bot
[GOAL]
case pos
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_le_M0 : ⊥ ≤ M0
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
[PROOFSTEP]
exact ⟨0, m, Nat.zero_le _, b'M, Basis.empty _, finZeroElim, finZeroElim⟩
[GOAL]
case neg
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨y, hy, a, _, M', M'_le_M, N', _, N'_le_M', y_ortho, _, h⟩ := Submodule.basis_of_pid_aux M0 N b'M N_bot N_le_M0
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
y : M
hy : y ∈ M0
a : R
w✝¹ : a • y ∈ N
M' : Submodule R M
M'_le_M : M' ≤ M0
N' : Submodule R M
left✝ : N' ≤ N
N'_le_M' : N' ≤ M'
y_ortho : ∀ (c : R) (z : M), z ∈ M' → c • y + z = 0 → c = 0
w✝ : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨n', m', hn'm', bM', bN', as', has'⟩ := ih M' M'_le_M y hy y_ortho N' N'_le_M'
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
y : M
hy : y ∈ M0
a : R
w✝¹ : a • y ∈ N
M' : Submodule R M
M'_le_M : M' ≤ M0
N' : Submodule R M
left✝ : N' ≤ N
N'_le_M' : N' ≤ M'
y_ortho : ∀ (c : R) (z : M), z ∈ M' → c • y + z = 0 → c = 0
w✝ : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
bN' : Basis (Fin n') R { x // x ∈ N' }
as' : Fin n' → R
has' : ∀ (i : Fin n'), ↑(↑bN' i) = ↑(as' i • ↑bM' (Fin.castLE hn'm' i))
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨bN, h'⟩ := h n' bN'
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
y : M
hy : y ∈ M0
a : R
w✝¹ : a • y ∈ N
M' : Submodule R M
M'_le_M : M' ≤ M0
N' : Submodule R M
left✝ : N' ≤ N
N'_le_M' : N' ≤ M'
y_ortho : ∀ (c : R) (z : M), z ∈ M' → c • y + z = 0 → c = 0
w✝ : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
bN' : Basis (Fin n') R { x // x ∈ N' }
as' : Fin n' → R
has' : ∀ (i : Fin n'), ↑(↑bN' i) = ↑(as' i • ↑bM' (Fin.castLE hn'm' i))
bN : Basis (Fin (n' + 1)) R { x // x ∈ N }
h' :
  ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
    ∃ hnm bM,
      ∀ (as : Fin n' → R),
        (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
          ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨hmn, bM, h''⟩ := h' m' hn'm' bM'
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
y : M
hy : y ∈ M0
a : R
w✝¹ : a • y ∈ N
M' : Submodule R M
M'_le_M : M' ≤ M0
N' : Submodule R M
left✝ : N' ≤ N
N'_le_M' : N' ≤ M'
y_ortho : ∀ (c : R) (z : M), z ∈ M' → c • y + z = 0 → c = 0
w✝ : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
bN' : Basis (Fin n') R { x // x ∈ N' }
as' : Fin n' → R
has' : ∀ (i : Fin n'), ↑(↑bN' i) = ↑(as' i • ↑bM' (Fin.castLE hn'm' i))
bN : Basis (Fin (n' + 1)) R { x // x ∈ N }
h' :
  ∀ (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))
hmn : n' + 1 ≤ m' + 1
bM : Basis (Fin (m' + 1)) R { x // x ∈ M0 }
h'' :
  ∀ (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 hmn i))
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
obtain ⟨as, has⟩ := h'' as' has'
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
M0 : Submodule R M
ih :
  ∀ (N' : Submodule R M),
    N' ≤ M0 →
      ∀ (x : M),
        x ∈ M0 →
          (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) →
            ∀ (N : Submodule R M), N ≤ N' → ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
N : Submodule R M
N_le_M0 : N ≤ M0
m : ℕ
b'M : Basis (Fin m) R { x // x ∈ M0 }
N_bot : ¬N = ⊥
y : M
hy : y ∈ M0
a : R
w✝¹ : a • y ∈ N
M' : Submodule R M
M'_le_M : M' ≤ M0
N' : Submodule R M
left✝ : N' ≤ N
N'_le_M' : N' ≤ M'
y_ortho : ∀ (c : R) (z : M), z ∈ M' → c • y + z = 0 → c = 0
w✝ : ∀ (c : R) (z : M), z ∈ N' → c • a • y + z = 0 → c = 0
h :
  ∀ (n' : ℕ) (bN' : Basis (Fin n') R { x // x ∈ N' }),
    ∃ bN,
      ∀ (m' : ℕ) (hn'm' : n' ≤ m') (bM' : Basis (Fin m') R { x // x ∈ M' }),
        ∃ hnm bM,
          ∀ (as : Fin n' → R),
            (∀ (i : Fin n'), ↑(↑bN' i) = as i • ↑(↑bM' (Fin.castLE hn'm' i))) →
              ∃ as', ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as' i • ↑(↑bM (Fin.castLE hnm i))
n' m' : ℕ
hn'm' : n' ≤ m'
bM' : Basis (Fin m') R { x // x ∈ M' }
bN' : Basis (Fin n') R { x // x ∈ N' }
as' : Fin n' → R
has' : ∀ (i : Fin n'), ↑(↑bN' i) = ↑(as' i • ↑bM' (Fin.castLE hn'm' i))
bN : Basis (Fin (n' + 1)) R { x // x ∈ N }
h' :
  ∀ (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))
hmn : n' + 1 ≤ m' + 1
bM : Basis (Fin (m' + 1)) R { x // x ∈ M0 }
h'' :
  ∀ (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 hmn i))
as : Fin (n' + 1) → R
has : ∀ (i : Fin (n' + 1)), ↑(↑bN i) = as i • ↑(↑bM (Fin.castLE hmn i))
⊢ ∃ n o hno bO bN a, ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
exact
  ⟨_, _, hmn, bM, bN, as, has⟩
    -- Porting note: Lean generates a goal Fintype ι for some reason
[GOAL]
case intro.inst
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
O : Submodule R M
val✝ : Fintype ι
⊢ Fintype ι
[PROOFSTEP]
infer_instance
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
⊢ (o : ℕ) × (n : ℕ) × Basis.SmithNormalForm (comap (Submodule.subtype O) N) (Fin o) n
[PROOFSTEP]
choose n o hno bO bN a snf using N.exists_smith_normal_form_of_le b O N_le_O
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
n o : ℕ
hno : n ≤ o
bO : Basis (Fin o) R { x // x ∈ O }
bN : Basis (Fin n) R { x // x ∈ N }
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
⊢ (o : ℕ) × (n : ℕ) × Basis.SmithNormalForm (comap (Submodule.subtype O) N) (Fin o) n
[PROOFSTEP]
refine' ⟨o, n, bO, bN.map (comapSubtypeEquivOfLe N_le_O).symm, (Fin.castLEEmb hno).toEmbedding, a, fun i ↦ _⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
n o : ℕ
hno : n ≤ o
bO : Basis (Fin o) R { x // x ∈ O }
bN : Basis (Fin n) R { x // x ∈ N }
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
i : Fin n
⊢ ↑(↑(Basis.map bN (LinearEquiv.symm (comapSubtypeEquivOfLe N_le_O))) i) =
    a i • ↑bO (↑(Fin.castLEEmb hno).toEmbedding i)
[PROOFSTEP]
ext
[GOAL]
case a
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N O : Submodule R M
N_le_O : N ≤ O
n o : ℕ
hno : n ≤ o
bO : Basis (Fin o) R { x // x ∈ O }
bN : Basis (Fin n) R { x // x ∈ N }
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bN i) = ↑(a i • ↑bO (Fin.castLE hno i))
i : Fin n
⊢ ↑↑(↑(Basis.map bN (LinearEquiv.symm (comapSubtypeEquivOfLe N_le_O))) i) =
    ↑(a i • ↑bO (↑(Fin.castLEEmb hno).toEmbedding i))
[PROOFSTEP]
simp only [snf, Basis.map_apply, Submodule.comapSubtypeEquivOfLe_symm_apply, Submodule.coe_smul_of_tower,
  RelEmbedding.coe_toEmbedding, Fin.castLEEmb_apply]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsPrincipalIdealRing R
M : Type u_3
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b✝ : ι → M
inst✝ : Finite ι
b : Basis ι R M
N : Submodule R M
m n : ℕ
bM : Basis (Fin m) R { x // x ∈ ⊤ }
bN : Basis (Fin n) R { x // x ∈ comap (Submodule.subtype ⊤) N }
f : Fin n ↪ Fin m
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bN i) = a i • ↑bM (↑f i)
bM' : Basis (Fin m) R M := Basis.map bM (LinearEquiv.ofTop ⊤ (_ : ⊤ = ⊤))
e : Fin m ≃ ι := Basis.indexEquiv bM' b
i : Fin n
⊢ ↑(↑(Basis.map bN (comapSubtypeEquivOfLe (_ : N ≤ ⊤))) i) =
    a i • ↑(Basis.reindex bM' e) (↑(Function.Embedding.trans f (Equiv.toEmbedding e)) i)
[PROOFSTEP]
simp only [snf, Basis.map_apply, LinearEquiv.ofTop_apply, Submodule.coe_smul_of_tower,
  Submodule.comapSubtypeEquivOfLe_apply_coe, Basis.reindex_apply, Equiv.toEmbedding_apply,
  Function.Embedding.trans_apply, Equiv.symm_apply_apply]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Fintype ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
n : ℕ
bS : Basis ι R S
bI : Basis (Fin n) R { x // x ∈ restrictScalars R I }
f : Fin n ↪ ι
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bI i) = a i • ↑bS (↑f i)
eq : Fintype.card (Fin n) = Fintype.card ι
⊢ Fintype.card (Fin n) = Fintype.card (Fin (Fintype.card ι))
[PROOFSTEP]
rw [eq, Fintype.card_fin]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Fintype ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
n : ℕ
bS : Basis ι R S
bI : Basis (Fin n) R { x // x ∈ restrictScalars R I }
f : Fin n ↪ ι
a : Fin n → R
snf : ∀ (i : Fin n), ↑(↑bI i) = a i • ↑bS (↑f i)
eq : Fintype.card (Fin n) = Fintype.card ι
e : Fin n ≃ Fin (Fintype.card ι) :=
  Fintype.equivOfCardEq (_ : Fintype.card (Fin n) = Fintype.card (Fin (Fintype.card ι)))
i : Fin (Fintype.card ι)
⊢ ↑(↑(Basis.reindex bI e) i) = (a ∘ ↑e.symm) i • ↑bS (↑(Function.Embedding.trans (Equiv.toEmbedding e.symm) f) i)
[PROOFSTEP]
simp only [snf, Basis.coe_reindex, Function.Embedding.trans_apply, Equiv.toEmbedding_apply, (· ∘ ·)]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
⊢ ∃ b' a ab', ∀ (i : ι), ↑(↑ab' i) = a i • ↑b' i
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
val✝ : Fintype ι
⊢ ∃ b' a ab', ∀ (i : ι), ↑(↑ab' i) = a i • ↑b' i
[PROOFSTEP]
let ⟨bS, bI, f, a, snf⟩ := I.smithNormalForm b hI
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
val✝ : Fintype ι
bS : Basis ι R S
bI : Basis (Fin (Fintype.card ι)) R { x // x ∈ restrictScalars R I }
f : Fin (Fintype.card ι) ↪ ι
a : Fin (Fintype.card ι) → R
snf : ∀ (i : Fin (Fintype.card ι)), ↑(↑bI i) = a i • ↑bS (↑f i)
⊢ ∃ b' a ab', ∀ (i : ι), ↑(↑ab' i) = a i • ↑b' i
[PROOFSTEP]
let e : Fin (Fintype.card ι) ≃ ι :=
  Equiv.ofBijective f ((Fintype.bijective_iff_injective_and_card f).mpr ⟨f.injective, Fintype.card_fin _⟩)
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
val✝ : Fintype ι
bS : Basis ι R S
bI : Basis (Fin (Fintype.card ι)) R { x // x ∈ restrictScalars R I }
f : Fin (Fintype.card ι) ↪ ι
a : Fin (Fintype.card ι) → R
snf : ∀ (i : Fin (Fintype.card ι)), ↑(↑bI i) = a i • ↑bS (↑f i)
e : Fin (Fintype.card ι) ≃ ι := Equiv.ofBijective ↑f (_ : Function.Bijective ↑f)
⊢ ∃ b' a ab', ∀ (i : ι), ↑(↑ab' i) = a i • ↑b' i
[PROOFSTEP]
have fe : ∀ i, f (e.symm i) = i := e.apply_symm_apply
[GOAL]
case intro
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
val✝ : Fintype ι
bS : Basis ι R S
bI : Basis (Fin (Fintype.card ι)) R { x // x ∈ restrictScalars R I }
f : Fin (Fintype.card ι) ↪ ι
a : Fin (Fintype.card ι) → R
snf : ∀ (i : Fin (Fintype.card ι)), ↑(↑bI i) = a i • ↑bS (↑f i)
e : Fin (Fintype.card ι) ≃ ι := Equiv.ofBijective ↑f (_ : Function.Bijective ↑f)
fe : ∀ (i : ι), ↑f (↑e.symm i) = i
⊢ ∃ b' a ab', ∀ (i : ι), ↑(↑ab' i) = a i • ↑b' i
[PROOFSTEP]
exact
  ⟨bS, a ∘ e.symm, (bI.reindex e).map ((restrictScalarsEquiv R S _ _).restrictScalars R), fun i ↦ by
    simp only [snf, fe, Basis.map_apply, LinearEquiv.restrictScalars_apply R, Submodule.restrictScalarsEquiv_apply,
      Basis.coe_reindex, (· ∘ ·)]⟩
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
val✝ : Fintype ι
bS : Basis ι R S
bI : Basis (Fin (Fintype.card ι)) R { x // x ∈ restrictScalars R I }
f : Fin (Fintype.card ι) ↪ ι
a : Fin (Fintype.card ι) → R
snf : ∀ (i : Fin (Fintype.card ι)), ↑(↑bI i) = a i • ↑bS (↑f i)
e : Fin (Fintype.card ι) ≃ ι := Equiv.ofBijective ↑f (_ : Function.Bijective ↑f)
fe : ∀ (i : ι), ↑f (↑e.symm i) = i
i : ι
⊢ ↑(↑(Basis.map (Basis.reindex bI e) (LinearEquiv.restrictScalars R (restrictScalarsEquiv R S S I))) i) =
    (a ∘ ↑e.symm) i • ↑bS i
[PROOFSTEP]
simp only [snf, fe, Basis.map_apply, LinearEquiv.restrictScalars_apply R, Submodule.restrictScalarsEquiv_apply,
  Basis.coe_reindex, (· ∘ ·)]
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
i : ι
⊢ smithCoeffs b I hI i ≠ 0
[PROOFSTEP]
intro hi
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
i : ι
hi : smithCoeffs b I hI i = 0
⊢ False
[PROOFSTEP]
apply Basis.ne_zero (Ideal.selfBasis b I hI) i
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
i : ι
hi : smithCoeffs b I hI i = 0
⊢ ↑(selfBasis b I hI) i = 0
[PROOFSTEP]
refine' Subtype.coe_injective _
[GOAL]
ι : Type u_1
R : Type u_2
inst✝⁸ : CommRing R
inst✝⁷ : IsDomain R
inst✝⁶ : IsPrincipalIdealRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
b✝ : ι → M
S : Type u_4
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Algebra R S
inst✝ : Finite ι
b : Basis ι R S
I : Ideal S
hI : I ≠ ⊥
i : ι
hi : smithCoeffs b I hI i = 0
⊢ (fun a => ↑a) (↑(selfBasis b I hI) i) = (fun a => ↑a) 0
[PROOFSTEP]
simp [hi]
[GOAL]
R : Type u_1
S : Type u_2
M : Type u_3
ι : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid M
inst✝³ : Algebra R S
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
hinj : Function.Injective ↑(algebraMap R S)
v : ι → M
li : LinearIndependent S v
⊢ Function.Injective fun r => r • 1
[PROOFSTEP]
rwa [Algebra.algebraMap_eq_smul_one'] at hinj 
