Theorem: exists_maximal_independent'
File: Mathlib/LinearAlgebra/LinearIndependent.lean

Proof steps:
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
tactic: let indep : Set ι → Prop := fun I => LinearIndependent R (s ∘ (↑) : I → M)
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
tactic: let X := { I : Set ι // indep I }
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
tactic: let r : X → X → Prop := fun I J => I.1 ⊆ J.1
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
key : ∀ (c : Set X), IsChain r c → indep (⋃ I ∈ c, ↑I)
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
key : ∀ (c : Set X), IsChain r c → indep (⋃ I ∈ c, ↑I)
trans : Transitive r
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
tactic: have trans : Transitive r := fun I J K => Set.Subset.trans
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
key : ∀ (c : Set X), IsChain r c → indep (⋃ I ∈ c, ↑I)
trans : Transitive r
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: case intro.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
key : ∀ (c : Set X), IsChain r c → indep (⋃ I ∈ c, ↑I)
trans : Transitive r
I : Set ι
hli : indep I
hmax : ∀ (a : X), r ⟨I, hli⟩ a → r a ⟨I, hli⟩
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
tactic: obtain ⟨⟨I, hli : indep I⟩, hmax : ∀ a, r ⟨I, hli⟩ a → r a ⟨I, hli⟩⟩ :=
    exists_maximal_of_chains_bounded
      (fun c hc => ⟨⟨⋃ I ∈ c, (I : Set ι), key c hc⟩, fun I => Set.subset_biUnion_of_mem⟩) @trans
state_before: case intro.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
hv : LinearIndependent R v
s : ι → M
indep : Set ι → Prop := fun I => LinearIndependent (ι := ↑I) R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
key : ∀ (c : Set X), IsChain r c → indep (⋃ I ∈ c, ↑I)
trans : Transitive r
I : Set ι
hli : indep I
hmax : ∀ (a : X), r ⟨I, hli⟩ a → r a ⟨I, hli⟩
⊢ ∃ I,
    (LinearIndependent R fun (x : ↑I) => s ↑x) ∧
      ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun (x : ↑J) => s ↑x) → I = J
state_after: no goals
tactic: exact ⟨I, hli, fun J hsub hli => Set.Subset.antisymm hsub (hmax ⟨J, hli⟩ hsub)⟩