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

tactic: let indep : Set ι → Prop := fun I => LinearIndependent R (s ∘ (↑) : I → M)
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => s ↑x) → I = J

tactic: let X := { I : Set ι // indep I }
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
⊢ ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => s ↑x) → I = J

tactic: let r : X → X → Prop := fun I J => I.1 ⊆ J.1
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
⊢ ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => s ↑x) → I = J

tactic: have trans : Transitive r := fun I J K => Set.Subset.trans
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 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 : X) (_ : I ∈ c), ↑I)
⊢ ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => 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 _ r
    (fun c hc => ⟨⟨⋃ I ∈ c, (I : Set ι), key c hc⟩, fun I => Set.subset_biUnion_of_mem⟩) @trans
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 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 : X) (_ : I ∈ c), ↑I)
trans : Transitive r
⊢ ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => s ↑x) → I = J

tactic: exact ⟨I, hli, fun J hsub hli => Set.Subset.antisymm hsub (hmax ⟨J, hli⟩ hsub)⟩
state_before: case intro.mk
ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 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 : X) (_ : I ∈ c), ↑I)
trans : Transitive r
I : Set ι
hli : indep I
hmax : ∀ (a : X), r { val := I, property := hli } a → r a { val := I, property := hli }
⊢ ∃ I, (LinearIndependent R fun x => s ↑x) ∧ ∀ (J : Set ι), I ⊆ J → (LinearIndependent R fun x => s ↑x) → I = J

tactic: intro c hc
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
⊢ ∀ (c : Set X), IsChain r c → indep (⋃ (I : X) (_ : I ∈ c), ↑I)

tactic: dsimp
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
⊢ indep (⋃ (I : X) (_ : I ∈ c), ↑I)

tactic: rw [linearIndependent_comp_subtype]
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
⊢ LinearIndependent R (s ∘ Subtype.val)

tactic: intro f hsupport hsum
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
⊢ ∀ (l : ι →₀ R),
    l ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ c), ↑I) →
      ↑(Finsupp.total ι M R s) l = 0 → l = 0

tactic: rcases eq_empty_or_nonempty c with (rfl | hn)
state_before: ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
f : ι →₀ R
hsupport : f ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ c), ↑I)
hsum : ↑(Finsupp.total ι M R s) f = 0
⊢ f = 0

tactic: haveI : IsRefl X r := ⟨fun _ => Set.Subset.refl _⟩
state_before: case inr
ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
f : ι →₀ R
hsupport : f ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ c), ↑I)
hsum : ↑(Finsupp.total ι M R s) f = 0
hn : Set.Nonempty c
⊢ f = 0

tactic: obtain ⟨I, _I_mem, hI⟩ : ∃ I ∈ c, (f.support : Set ι) ⊆ I :=
  hc.directedOn.exists_mem_subset_of_finset_subset_biUnion hn hsupport
state_before: case inr
ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
f : ι →₀ R
hsupport : f ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ c), ↑I)
hsum : ↑(Finsupp.total ι M R s) f = 0
hn : Set.Nonempty c
this : IsRefl X r
⊢ f = 0

tactic: exact linearIndependent_comp_subtype.mp I.2 f hI hsum
state_before: case inr.intro.intro
ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
c : Set X
hc : IsChain r c
f : ι →₀ R
hsupport : f ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ c), ↑I)
hsum : ↑(Finsupp.total ι M R s) f = 0
hn : Set.Nonempty c
this : IsRefl X r
I : X
_I_mem : I ∈ c
hI : ↑f.support ⊆ ↑I
⊢ f = 0

tactic: simpa using hsupport
state_before: case inl
ι : Type u'
ι' : Type ?u.501528
R : Type u_1
K : Type ?u.501534
M : Type u_2
M' : Type ?u.501540
M'' : Type ?u.501543
V : Type u
V' : Type ?u.501548
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 R (s ∘ Subtype.val)
X : Type u' := { I // indep I }
r : X → X → Prop := fun I J => ↑I ⊆ ↑J
f : ι →₀ R
hsum : ↑(Finsupp.total ι M R s) f = 0
hc : IsChain r ∅
hsupport : f ∈ Finsupp.supported R R (⋃ (I : { I // LinearIndependent R (s ∘ Subtype.val) }) (_ : I ∈ ∅), ↑I)
⊢ f = 0