[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
hs : LinearIndependent K Subtype.val
⊢ ↑⊤ ⊆ ↑(span K (range (restrict (LinearIndependent.extend hs (_ : s ⊆ univ)) id)))
[PROOFSTEP]
simpa using hs.subset_span_extend (subset_univ s)
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
hs : LinearIndependent K Subtype.val
⊢ range ↑(extend hs) = LinearIndependent.extend hs (_ : s ⊆ univ)
[PROOFSTEP]
rw [coe_extend, Subtype.range_coe_subtype, setOf_mem_eq]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x✝ y z : V
x : ↑(ofVectorSpaceIndex K V)
⊢ ↑(ofVectorSpace K V) x = ↑x
[PROOFSTEP]
unfold ofVectorSpace
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x✝ y z : V
x : ↑(ofVectorSpaceIndex K V)
⊢ ↑(extend (_ : LinearIndependent K fun x => ↑x)) x = ↑x
[PROOFSTEP]
exact Basis.mk_apply _ _ _
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
⊢ LinearIndependent K Subtype.val
[PROOFSTEP]
convert (ofVectorSpace K V).linearIndependent
[GOAL]
case h.e'_4
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
⊢ Subtype.val = ↑(ofVectorSpace K V)
[PROOFSTEP]
ext x
[GOAL]
case h.e'_4.h
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x✝ y z : V
x : { x // x ∈ ofVectorSpaceIndex K V }
⊢ ↑x = ↑(ofVectorSpace K V) x
[PROOFSTEP]
rw [ofVectorSpace_apply_self]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : AddCommGroup V'
inst✝³ : Module K V
inst✝² : Module K V'
v : ι → V
s t : Set V
x y z : V
inst✝¹ : Fintype K
inst✝ : Fintype V
⊢ ∃ n, card V = card K ^ n
[PROOFSTEP]
classical exact ⟨card (Basis.ofVectorSpaceIndex K V), Module.card_fintype (Basis.ofVectorSpace K V)⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : AddCommGroup V'
inst✝³ : Module K V
inst✝² : Module K V'
v : ι → V
s t : Set V
x y z : V
inst✝¹ : Fintype K
inst✝ : Fintype V
⊢ ∃ n, card V = card K ^ n
[PROOFSTEP]
exact ⟨card (Basis.ofVectorSpaceIndex K V), Module.card_fintype (Basis.ofVectorSpace K V)⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
⊢ IsAtom (span K {v})
[PROOFSTEP]
constructor
[GOAL]
case left
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
⊢ span K {v} ≠ ⊥
[PROOFSTEP]
rw [Submodule.ne_bot_iff]
[GOAL]
case left
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
⊢ ∃ x, x ∈ span K {v} ∧ x ≠ 0
[PROOFSTEP]
exact ⟨v, ⟨mem_span_singleton_self v, hv⟩⟩
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
⊢ ∀ (b : Submodule K V), b < span K {v} → b = ⊥
[PROOFSTEP]
intro T hT
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
⊢ T = ⊥
[PROOFSTEP]
by_contra h
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
h : ¬T = ⊥
⊢ False
[PROOFSTEP]
apply hT.2
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
h : ¬T = ⊥
⊢ ↑(span K {v}) ⊆ ↑T
[PROOFSTEP]
change span K { v } ≤ T
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
h : ¬T = ⊥
⊢ span K {v} ≤ T
[PROOFSTEP]
simp_rw [span_singleton_le_iff_mem, ← Ne.def, Submodule.ne_bot_iff] at *
[GOAL]
case right
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
h : ∃ x, x ∈ T ∧ x ≠ 0
⊢ v ∈ T
[PROOFSTEP]
rcases h with ⟨s, ⟨hs, hz⟩⟩
[GOAL]
case right.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s✝ t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
s : V
hs : s ∈ T
hz : s ≠ 0
⊢ v ∈ T
[PROOFSTEP]
rcases mem_span_singleton.1 (hT.1 hs) with ⟨a, rfl⟩
[GOAL]
case right.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
a : K
hs : a • v ∈ T
hz : a • v ≠ 0
⊢ v ∈ T
[PROOFSTEP]
rcases eq_or_ne a 0 with rfl | h
[GOAL]
case right.intro.intro.intro.inl
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
hs : 0 • v ∈ T
hz : 0 • v ≠ 0
⊢ v ∈ T
[PROOFSTEP]
simp only [zero_smul, ne_eq, not_true] at hz
[GOAL]
case right.intro.intro.intro.inr
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
T : Submodule K V
hT : T < span K {v}
a : K
hs : a • v ∈ T
hz : a • v ≠ 0
h : a ≠ 0
⊢ v ∈ T
[PROOFSTEP]
rwa [T.smul_mem_iff h] at hs
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
⊢ IsAtom W ↔ ∃ v x, W = span K {v}
[PROOFSTEP]
refine' ⟨fun h => _, fun h => _⟩
[GOAL]
case refine'_1
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
h : IsAtom W
⊢ ∃ v x, W = span K {v}
[PROOFSTEP]
cases' h with hbot h
[GOAL]
case refine'_1.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
h : ∀ (b : Submodule K V), b < W → b = ⊥
⊢ ∃ v x, W = span K {v}
[PROOFSTEP]
rcases(Submodule.ne_bot_iff W).1 hbot with ⟨v, ⟨hW, hv⟩⟩
[GOAL]
case refine'_1.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
h : ∀ (b : Submodule K V), b < W → b = ⊥
v : V
hW : v ∈ W
hv : v ≠ 0
⊢ ∃ v x, W = span K {v}
[PROOFSTEP]
refine' ⟨v, ⟨hv, _⟩⟩
[GOAL]
case refine'_1.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
h : ∀ (b : Submodule K V), b < W → b = ⊥
v : V
hW : v ∈ W
hv : v ≠ 0
⊢ W = span K {v}
[PROOFSTEP]
by_contra heq
[GOAL]
case refine'_1.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
h : ∀ (b : Submodule K V), b < W → b = ⊥
v : V
hW : v ∈ W
hv : v ≠ 0
heq : ¬W = span K {v}
⊢ False
[PROOFSTEP]
specialize h (span K { v })
[GOAL]
case refine'_1.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
v : V
hW : v ∈ W
hv : v ≠ 0
heq : ¬W = span K {v}
h : span K {v} < W → span K {v} = ⊥
⊢ False
[PROOFSTEP]
rw [span_singleton_eq_bot, lt_iff_le_and_ne] at h
[GOAL]
case refine'_1.intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
W : Submodule K V
hbot : W ≠ ⊥
v : V
hW : v ∈ W
hv : v ≠ 0
heq : ¬W = span K {v}
h : span K {v} ≤ W ∧ span K {v} ≠ W → v = 0
⊢ False
[PROOFSTEP]
exact hv (h ⟨(span_singleton_le_iff_mem v W).2 hW, Ne.symm heq⟩)
[GOAL]
case refine'_2
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
h : ∃ v x, W = span K {v}
⊢ IsAtom W
[PROOFSTEP]
rcases h with ⟨v, ⟨hv, rfl⟩⟩
[GOAL]
case refine'_2.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z v : V
hv : v ≠ 0
⊢ IsAtom (span K {v})
[PROOFSTEP]
exact nonzero_span_atom v hv
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
⊢ ∃ s, W = sSup s ∧ ∀ (a : Submodule K V), a ∈ s → IsAtom a
[PROOFSTEP]
refine ⟨_, submodule_eq_sSup_le_nonzero_spans W, ?_⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
⊢ ∀ (a : Submodule K V), a ∈ {T | ∃ m x x, T = span K {m}} → IsAtom a
[PROOFSTEP]
rintro _ ⟨w, ⟨_, ⟨hw, rfl⟩⟩⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
W : Submodule K V
w : V
w✝ : w ∈ W
hw : w ≠ 0
⊢ IsAtom (span K {w})
[PROOFSTEP]
exact nonzero_span_atom w hw
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
⊢ ∃ g, comp g f = id
[PROOFSTEP]
let B := Basis.ofVectorSpaceIndex K V
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
⊢ ∃ g, comp g f = id
[PROOFSTEP]
let hB := Basis.ofVectorSpace K V
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
⊢ ∃ g, comp g f = id
[PROOFSTEP]
have hB₀ : _ := hB.linearIndependent.to_subtype_range
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
⊢ ∃ g, comp g f = id
[PROOFSTEP]
have : LinearIndependent K (fun x => x : f '' B → V') :=
  by
  have h₁ : LinearIndependent K ((↑) : ↥(f '' Set.range (Basis.ofVectorSpace K V)) → V') :=
    @LinearIndependent.image_subtype _ _ _ _ _ _ _ _ _ f hB₀ (show Disjoint _ _ by simp [hf_inj])
  rwa [Basis.range_ofVectorSpace K V] at h₁
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
⊢ LinearIndependent K fun x => ↑x
[PROOFSTEP]
have h₁ : LinearIndependent K ((↑) : ↥(f '' Set.range (Basis.ofVectorSpace K V)) → V') :=
  @LinearIndependent.image_subtype _ _ _ _ _ _ _ _ _ f hB₀ (show Disjoint _ _ by simp [hf_inj])
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
⊢ Disjoint (span K (Set.range ↑(Basis.ofVectorSpace K V))) (ker f)
[PROOFSTEP]
simp [hf_inj]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
h₁ : LinearIndependent K Subtype.val
⊢ LinearIndependent K fun x => ↑x
[PROOFSTEP]
rwa [Basis.range_ofVectorSpace K V] at h₁
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
⊢ ∃ g, comp g f = id
[PROOFSTEP]
let C := this.extend (subset_univ _)
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
⊢ ∃ g, comp g f = id
[PROOFSTEP]
have BC := this.subset_extend (subset_univ _)
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : ↑f '' B ⊆ LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
⊢ ∃ g, comp g f = id
[PROOFSTEP]
let hC := Basis.extend this
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : ↑f '' B ⊆ LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
⊢ ∃ g, comp g f = id
[PROOFSTEP]
haveI Vinh : Inhabited V := ⟨0⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : ↑f '' B ⊆ LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
⊢ ∃ g, comp g f = id
[PROOFSTEP]
refine' ⟨(hC.constr ℕ : _ → _) (C.restrict (invFun f)), hB.ext fun b => _⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : ↑f '' B ⊆ LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
⊢ ↑(comp (↑(Basis.constr hC ℕ) (Set.restrict C (invFun ↑f))) f) (↑hB b) = ↑id (↑hB b)
[PROOFSTEP]
rw [image_subset_iff] at BC
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
⊢ ↑(comp (↑(Basis.constr hC ℕ) (Set.restrict C (invFun ↑f))) f) (↑hB b) = ↑id (↑hB b)
[PROOFSTEP]
have fb_eq : f b = hC ⟨f b, BC b.2⟩ := by
  change f b = Basis.extend this _
  simp_rw [Basis.extend_apply_self]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
⊢ ↑f ↑b = ↑hC { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) }
[PROOFSTEP]
change f b = Basis.extend this _
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
⊢ ↑f ↑b =
    ↑(Basis.extend this)
      { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) }
[PROOFSTEP]
simp_rw [Basis.extend_apply_self]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
fb_eq : ↑f ↑b = ↑hC { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) }
⊢ ↑(comp (↑(Basis.constr hC ℕ) (Set.restrict C (invFun ↑f))) f) (↑hB b) = ↑id (↑hB b)
[PROOFSTEP]
dsimp []
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
fb_eq : ↑f ↑b = ↑hC { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) }
⊢ ↑(↑(Basis.constr (Basis.extend this) ℕ)
          (Set.restrict (LinearIndependent.extend this (_ : ↑f '' Basis.ofVectorSpaceIndex K V ⊆ univ)) (invFun ↑f)))
      (↑f (↑(Basis.ofVectorSpace K V) b)) =
    ↑(Basis.ofVectorSpace K V) b
[PROOFSTEP]
rw [Basis.ofVectorSpace_apply_self, fb_eq, hC.constr_basis]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_inj : ker f = ⊥
B : Set V := Basis.ofVectorSpaceIndex K V
hB : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hB₀ : LinearIndependent K Subtype.val
this : LinearIndependent K fun x => ↑x
C : Set V' := LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
BC : B ⊆ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)
hC : Basis (↑(LinearIndependent.extend this (_ : ↑f '' B ⊆ univ))) K V' := Basis.extend this
Vinh : Inhabited V
b : ↑(Basis.ofVectorSpaceIndex K V)
fb_eq : ↑f ↑b = ↑hC { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) }
⊢ Set.restrict (LinearIndependent.extend this (_ : ↑f '' Basis.ofVectorSpaceIndex K V ⊆ univ)) (invFun ↑f)
      { val := ↑f ↑b, property := (_ : ↑b ∈ ↑f ⁻¹' LinearIndependent.extend this (_ : ↑f '' B ⊆ univ)) } =
    ↑b
[PROOFSTEP]
exact leftInverse_invFun (LinearMap.ker_eq_bot.1 hf_inj) _
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
⊢ ∃ g, comp f g = id
[PROOFSTEP]
let C := Basis.ofVectorSpaceIndex K V'
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
C : Set V' := Basis.ofVectorSpaceIndex K V'
⊢ ∃ g, comp f g = id
[PROOFSTEP]
let hC := Basis.ofVectorSpace K V'
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
C : Set V' := Basis.ofVectorSpaceIndex K V'
hC : Basis (↑(Basis.ofVectorSpaceIndex K V')) K V' := Basis.ofVectorSpace K V'
⊢ ∃ g, comp f g = id
[PROOFSTEP]
haveI : Inhabited V := ⟨0⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
C : Set V' := Basis.ofVectorSpaceIndex K V'
hC : Basis (↑(Basis.ofVectorSpaceIndex K V')) K V' := Basis.ofVectorSpace K V'
this : Inhabited V
⊢ ∃ g, comp f g = id
[PROOFSTEP]
refine' ⟨(hC.constr ℕ : _ → _) (C.restrict (invFun f)), hC.ext fun c => _⟩
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
C : Set V' := Basis.ofVectorSpaceIndex K V'
hC : Basis (↑(Basis.ofVectorSpaceIndex K V')) K V' := Basis.ofVectorSpace K V'
this : Inhabited V
c : ↑(Basis.ofVectorSpaceIndex K V')
⊢ ↑(comp f (↑(Basis.constr hC ℕ) (Set.restrict C (invFun ↑f)))) (↑hC c) = ↑id (↑hC c)
[PROOFSTEP]
rw [LinearMap.comp_apply, hC.constr_basis]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
f : V →ₗ[K] V'
hf_surj : range f = ⊤
C : Set V' := Basis.ofVectorSpaceIndex K V'
hC : Basis (↑(Basis.ofVectorSpaceIndex K V')) K V' := Basis.ofVectorSpace K V'
this : Inhabited V
c : ↑(Basis.ofVectorSpaceIndex K V')
⊢ ↑f (Set.restrict C (invFun ↑f) c) = ↑id (↑hC c)
[PROOFSTEP]
simp [rightInverse_invFun (LinearMap.range_eq_top.1 hf_surj) c]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
p : Submodule K V
f : { x // x ∈ p } →ₗ[K] V'
g : V →ₗ[K] { x // x ∈ p }
hg : comp g (Submodule.subtype p) = id
⊢ comp (comp f g) (Submodule.subtype p) = f
[PROOFSTEP]
rw [LinearMap.comp_assoc, hg, f.comp_id]
[GOAL]
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
p : Submodule K V
hp : p < ⊤
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f
[PROOFSTEP]
rcases SetLike.exists_of_lt hp with ⟨v, -, hpv⟩
[GOAL]
case intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
hp : p < ⊤
v : V
hpv : ¬v ∈ p
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f
[PROOFSTEP]
clear hp
[GOAL]
case intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f
[PROOFSTEP]
rcases(LinearPMap.supSpanSingleton ⟨p, 0⟩ v (1 : K) hpv).toFun.exists_extend with ⟨f, hf⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f
[PROOFSTEP]
refine' ⟨f, _, _⟩
[GOAL]
case intro.intro.intro.refine'_1
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ f ≠ 0
[PROOFSTEP]
rintro rfl
[GOAL]
case intro.intro.intro.refine'_1
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf :
  LinearMap.comp 0 (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ False
[PROOFSTEP]
rw [LinearMap.zero_comp] at hf
[GOAL]
case intro.intro.intro.refine'_1
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf : 0 = (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ False
[PROOFSTEP]
have := LinearPMap.supSpanSingleton_apply_mk ⟨p, 0⟩ v (1 : K) hpv 0 p.zero_mem 1
[GOAL]
case intro.intro.intro.refine'_1
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf : 0 = (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
this :
  ↑(LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv)
      { val := 0 + 1 • v,
        property :=
          (_ :
            0 + 1 • v ∈
              { domain := p, toFun := 0 }.domain ⊔ (LinearPMap.mkSpanSingleton v 1 (_ : v = 0 → False)).domain) } =
    ↑{ domain := p, toFun := 0 } { val := 0, property := (_ : 0 ∈ p) } + 1 • 1
⊢ False
[PROOFSTEP]
simpa using (LinearMap.congr_fun hf _).trans this
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ p ≤ ker f
[PROOFSTEP]
refine' fun x hx => mem_ker.2 _
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x✝ y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
x : V
hx : x ∈ p
⊢ ↑f x = 0
[PROOFSTEP]
have := LinearPMap.supSpanSingleton_apply_mk ⟨p, 0⟩ v (1 : K) hpv x hx 0
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
ι' : Type u_2
K : Type u_3
V : Type u_4
V' : Type u_5
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x✝ y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
x : V
hx : x ∈ p
this :
  ↑(LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv)
      { val := x + 0 • v,
        property :=
          (_ :
            x + 0 • v ∈
              { domain := p, toFun := 0 }.domain ⊔ (LinearPMap.mkSpanSingleton v 1 (_ : v = 0 → False)).domain) } =
    ↑{ domain := p, toFun := 0 } { val := x, property := hx } + 0 • 1
⊢ ↑f x = 0
[PROOFSTEP]
simpa using (LinearMap.congr_fun hf _).trans this


[GOAL]
C : Type u₁
inst✝² : Category.{v, u₁} C
D : Type u₂
inst✝¹ : Category.{v, u₂} D
e : C ≌ D
inst✝ : WellPowered C
X : D
⊢ EssentiallySmall (MonoOver ((Equivalence.symm e).functor.obj X))
[PROOFSTEP]
infer_instance


[GOAL]
α : Type u_1
s✝ t✝ s t : Finset α
⊢ s ∈ powerset t ↔ s ⊆ t
[PROOFSTEP]
cases s
[GOAL]
case mk
α : Type u_1
s t✝ t : Finset α
val✝ : Multiset α
nodup✝ : Nodup val✝
⊢ { val := val✝, nodup := nodup✝ } ∈ powerset t ↔ { val := val✝, nodup := nodup✝ } ⊆ t
[PROOFSTEP]
simp [powerset, mem_mk, mem_pmap, mk.injEq, mem_powerset, exists_prop, exists_eq_right, ← val_le_iff]
[GOAL]
α : Type u_1
s✝ t s : Finset α
⊢ ↑(powerset s) = toSet ⁻¹' 𝒫↑s
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
s✝ t s x✝ : Finset α
⊢ x✝ ∈ ↑(powerset s) ↔ x✝ ∈ toSet ⁻¹' 𝒫↑s
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
s t : Finset α
⊢ powerset s = {∅} ↔ s = ∅
[PROOFSTEP]
rw [← powerset_empty, powerset_inj]
[GOAL]
α : Type u_1
s✝ t✝ s t : Finset α
a : α
ht : t ∈ powerset s
h : ¬a ∈ s
⊢ ¬a ∈ t
[PROOFSTEP]
apply mt _ h
[GOAL]
α : Type u_1
s✝ t✝ s t : Finset α
a : α
ht : t ∈ powerset s
h : ¬a ∈ s
⊢ a ∈ t → a ∈ s
[PROOFSTEP]
apply mem_powerset.1 ht
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
⊢ powerset (insert a s) = powerset s ∪ image (insert a) (powerset s)
[PROOFSTEP]
ext t
[GOAL]
case a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
⊢ t ∈ powerset (insert a s) ↔ t ∈ powerset s ∪ image (insert a) (powerset s)
[PROOFSTEP]
simp only [exists_prop, mem_powerset, mem_image, mem_union, subset_insert_iff]
[GOAL]
case a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
⊢ erase t a ⊆ s ↔ t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
[PROOFSTEP]
by_cases h : a ∈ t
[GOAL]
case pos
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
⊢ erase t a ⊆ s ↔ t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
[PROOFSTEP]
constructor
[GOAL]
case pos.mp
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
⊢ erase t a ⊆ s → t ⊆ s ∨ ∃ a_2, a_2 ⊆ s ∧ insert a a_2 = t
[PROOFSTEP]
exact fun H => Or.inr ⟨_, H, insert_erase h⟩
[GOAL]
case pos.mpr
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
⊢ (t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t) → erase t a ⊆ s
[PROOFSTEP]
intro H
[GOAL]
case pos.mpr
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
H : t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
⊢ erase t a ⊆ s
[PROOFSTEP]
cases' H with H H
[GOAL]
case pos.mpr.inl
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
H : t ⊆ s
⊢ erase t a ⊆ s
[PROOFSTEP]
exact Subset.trans (erase_subset a t) H
[GOAL]
case pos.mpr.inr
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
H : ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
⊢ erase t a ⊆ s
[PROOFSTEP]
rcases H with ⟨u, hu⟩
[GOAL]
case pos.mpr.inr.intro
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
u : Finset α
hu : u ⊆ s ∧ insert a u = t
⊢ erase t a ⊆ s
[PROOFSTEP]
rw [← hu.2]
[GOAL]
case pos.mpr.inr.intro
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : a ∈ t
u : Finset α
hu : u ⊆ s ∧ insert a u = t
⊢ erase (insert a u) a ⊆ s
[PROOFSTEP]
exact Subset.trans (erase_insert_subset a u) hu.1
[GOAL]
case neg
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : ¬a ∈ t
⊢ erase t a ⊆ s ↔ t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
[PROOFSTEP]
have : ¬∃ u : Finset α, u ⊆ s ∧ insert a u = t := by simp [Ne.symm (ne_insert_of_not_mem _ _ h)]
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : ¬a ∈ t
⊢ ¬∃ u, u ⊆ s ∧ insert a u = t
[PROOFSTEP]
simp [Ne.symm (ne_insert_of_not_mem _ _ h)]
[GOAL]
case neg
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s : Finset α
a : α
t : Finset α
h : ¬a ∈ t
this : ¬∃ u, u ⊆ s ∧ insert a u = t
⊢ erase t a ⊆ s ↔ t ⊆ s ∨ ∃ a_1, a_1 ⊆ s ∧ insert a a_1 = t
[PROOFSTEP]
simp [Finset.erase_eq_of_not_mem h, this]
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
s t : Finset α
⊢ t ∈ ssubsets s ↔ t ⊂ s
[PROOFSTEP]
rw [ssubsets, mem_erase, mem_powerset, ssubset_iff_subset_ne, and_comm]
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
s : Finset α
h : Finset.Nonempty s
⊢ ∅ ∈ ssubsets s
[PROOFSTEP]
rw [mem_ssubsets, ssubset_iff_subset_ne]
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
s : Finset α
h : Finset.Nonempty s
⊢ ∅ ⊆ s ∧ ∅ ≠ s
[PROOFSTEP]
exact ⟨empty_subset s, h.ne_empty.symm⟩
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
n : ℕ
s t : Finset α
⊢ s ∈ powersetLen n t ↔ s ⊆ t ∧ card s = n
[PROOFSTEP]
cases s
[GOAL]
case mk
α : Type u_1
s t✝ : Finset α
n : ℕ
t : Finset α
val✝ : Multiset α
nodup✝ : Nodup val✝
⊢ { val := val✝, nodup := nodup✝ } ∈ powersetLen n t ↔
    { val := val✝, nodup := nodup✝ } ⊆ t ∧ card { val := val✝, nodup := nodup✝ } = n
[PROOFSTEP]
simp [powersetLen, val_le_iff.symm]
[GOAL]
α : Type u_1
s✝ t s : Finset α
⊢ powersetLen 0 s = {∅}
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ ∈ powersetLen 0 s ↔ a✝ ∈ {∅}
[PROOFSTEP]
rw [mem_powersetLen, mem_singleton, card_eq_zero]
[GOAL]
case a
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ ⊆ s ∧ a✝ = ∅ ↔ a✝ = ∅
[PROOFSTEP]
refine'
  ⟨fun h => h.2, fun h => by
    rw [h]
    exact ⟨empty_subset s, rfl⟩⟩
[GOAL]
α : Type u_1
s✝ t s a✝ : Finset α
h : a✝ = ∅
⊢ a✝ ⊆ s ∧ a✝ = ∅
[PROOFSTEP]
rw [h]
[GOAL]
α : Type u_1
s✝ t s a✝ : Finset α
h : a✝ = ∅
⊢ ∅ ⊆ s ∧ ∅ = ∅
[PROOFSTEP]
exact ⟨empty_subset s, rfl⟩
[GOAL]
α : Type u_1
s✝ t : Finset α
n : ℕ
s : Finset α
h : card s < n
⊢ card (powersetLen n s) = 0
[PROOFSTEP]
rw [card_powersetLen, Nat.choose_eq_zero_of_lt h]
[GOAL]
α : Type u_1
s✝ t : Finset α
n : ℕ
s : Finset α
⊢ powersetLen n s = filter (fun x => card x = n) (powerset s)
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
s✝ t : Finset α
n : ℕ
s a✝ : Finset α
⊢ a✝ ∈ powersetLen n s ↔ a✝ ∈ filter (fun x => card x = n) (powerset s)
[PROOFSTEP]
simp [mem_powersetLen]
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
⊢ powersetLen (Nat.succ n) (insert x s) = powersetLen (Nat.succ n) s ∪ image (insert x) (powersetLen n s)
[PROOFSTEP]
rw [powersetLen_eq_filter, powerset_insert, filter_union, ← powersetLen_eq_filter]
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
⊢ powersetLen (Nat.succ n) s ∪ filter (fun x => card x = Nat.succ n) (image (insert x) (powerset s)) =
    powersetLen (Nat.succ n) s ∪ image (insert x) (powersetLen n s)
[PROOFSTEP]
congr
[GOAL]
case e_a
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
⊢ filter (fun x => card x = Nat.succ n) (image (insert x) (powerset s)) = image (insert x) (powersetLen n s)
[PROOFSTEP]
rw [powersetLen_eq_filter, image_filter]
[GOAL]
case e_a
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
⊢ image (insert x) (filter ((fun x => card x = Nat.succ n) ∘ insert x) (powerset s)) =
    image (insert x) (filter (fun x => card x = n) (powerset s))
[PROOFSTEP]
congr 1
[GOAL]
case e_a.e_s
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
⊢ filter ((fun x => card x = Nat.succ n) ∘ insert x) (powerset s) = filter (fun x => card x = n) (powerset s)
[PROOFSTEP]
ext t
[GOAL]
case e_a.e_s.a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
t : Finset α
⊢ t ∈ filter ((fun x => card x = Nat.succ n) ∘ insert x) (powerset s) ↔ t ∈ filter (fun x => card x = n) (powerset s)
[PROOFSTEP]
simp only [mem_powerset, mem_filter, Function.comp_apply, and_congr_right_iff]
[GOAL]
case e_a.e_s.a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
t : Finset α
⊢ t ⊆ s → (card (insert x t) = Nat.succ n ↔ card t = n)
[PROOFSTEP]
intro ht
[GOAL]
case e_a.e_s.a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
t : Finset α
ht : t ⊆ s
⊢ card (insert x t) = Nat.succ n ↔ card t = n
[PROOFSTEP]
have : x ∉ t := fun H => h (ht H)
[GOAL]
case e_a.e_s.a
α : Type u_1
s✝ t✝ : Finset α
inst✝ : DecidableEq α
x : α
s : Finset α
h : ¬x ∈ s
n : ℕ
t : Finset α
ht : t ⊆ s
this : ¬x ∈ t
⊢ card (insert x t) = Nat.succ n ↔ card t = n
[PROOFSTEP]
simp [card_insert_of_not_mem this, Nat.succ_inj']
[GOAL]
α : Type u_1
s✝ t : Finset α
n : ℕ
s : Finset α
h : n ≤ card s
⊢ Finset.Nonempty (powersetLen n s)
[PROOFSTEP]
classical
induction' s using Finset.induction_on with x s hx IH generalizing n
· rw [card_empty, le_zero_iff] at h
  rw [h, powersetLen_zero]
  exact Finset.singleton_nonempty _
· cases n
  · simp
  · rw [card_insert_of_not_mem hx, Nat.succ_le_succ_iff] at h
    rw [powersetLen_succ_insert hx]
    refine' Nonempty.mono _ ((IH h).image (insert x))
    exact subset_union_right _ _
[GOAL]
α : Type u_1
s✝ t : Finset α
n : ℕ
s : Finset α
h : n ≤ card s
⊢ Finset.Nonempty (powersetLen n s)
[PROOFSTEP]
induction' s using Finset.induction_on with x s hx IH generalizing n
[GOAL]
case empty
α : Type u_1
s✝ t : Finset α
n✝ : ℕ
s : Finset α
h✝ : n✝ ≤ card s
n : ℕ
h : n ≤ card ∅
⊢ Finset.Nonempty (powersetLen n ∅)
[PROOFSTEP]
rw [card_empty, le_zero_iff] at h
[GOAL]
case empty
α : Type u_1
s✝ t : Finset α
n✝ : ℕ
s : Finset α
h✝ : n✝ ≤ card s
n : ℕ
h : n = 0
⊢ Finset.Nonempty (powersetLen n ∅)
[PROOFSTEP]
rw [h, powersetLen_zero]
[GOAL]
case empty
α : Type u_1
s✝ t : Finset α
n✝ : ℕ
s : Finset α
h✝ : n✝ ≤ card s
n : ℕ
h : n = 0
⊢ Finset.Nonempty {∅}
[PROOFSTEP]
exact Finset.singleton_nonempty _
[GOAL]
case insert
α : Type u_1
s✝¹ t : Finset α
n✝ : ℕ
s✝ : Finset α
h✝ : n✝ ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
n : ℕ
h : n ≤ card (insert x s)
⊢ Finset.Nonempty (powersetLen n (insert x s))
[PROOFSTEP]
cases n
[GOAL]
case insert.zero
α : Type u_1
s✝¹ t : Finset α
n : ℕ
s✝ : Finset α
h✝ : n ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
h : Nat.zero ≤ card (insert x s)
⊢ Finset.Nonempty (powersetLen Nat.zero (insert x s))
[PROOFSTEP]
simp
[GOAL]
case insert.succ
α : Type u_1
s✝¹ t : Finset α
n : ℕ
s✝ : Finset α
h✝ : n ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
n✝ : ℕ
h : Nat.succ n✝ ≤ card (insert x s)
⊢ Finset.Nonempty (powersetLen (Nat.succ n✝) (insert x s))
[PROOFSTEP]
rw [card_insert_of_not_mem hx, Nat.succ_le_succ_iff] at h
[GOAL]
case insert.succ
α : Type u_1
s✝¹ t : Finset α
n : ℕ
s✝ : Finset α
h✝ : n ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
n✝ : ℕ
h : n✝ ≤ card s
⊢ Finset.Nonempty (powersetLen (Nat.succ n✝) (insert x s))
[PROOFSTEP]
rw [powersetLen_succ_insert hx]
[GOAL]
case insert.succ
α : Type u_1
s✝¹ t : Finset α
n : ℕ
s✝ : Finset α
h✝ : n ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
n✝ : ℕ
h : n✝ ≤ card s
⊢ Finset.Nonempty (powersetLen (Nat.succ n✝) s ∪ image (insert x) (powersetLen n✝ s))
[PROOFSTEP]
refine' Nonempty.mono _ ((IH h).image (insert x))
[GOAL]
case insert.succ
α : Type u_1
s✝¹ t : Finset α
n : ℕ
s✝ : Finset α
h✝ : n ≤ card s✝
x : α
s : Finset α
hx : ¬x ∈ s
IH : ∀ {n : ℕ}, n ≤ card s → Finset.Nonempty (powersetLen n s)
n✝ : ℕ
h : n✝ ≤ card s
⊢ image (insert x) (powersetLen n✝ s) ⊆ powersetLen (Nat.succ n✝) s ∪ image (insert x) (powersetLen n✝ s)
[PROOFSTEP]
exact subset_union_right _ _
[GOAL]
α : Type u_1
s✝ t s : Finset α
⊢ powersetLen (card s) s = {s}
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ ∈ powersetLen (card s) s ↔ a✝ ∈ {s}
[PROOFSTEP]
rw [mem_powersetLen, mem_singleton]
[GOAL]
case a
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ ⊆ s ∧ card a✝ = card s ↔ a✝ = s
[PROOFSTEP]
constructor
[GOAL]
case a.mp
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ ⊆ s ∧ card a✝ = card s → a✝ = s
[PROOFSTEP]
exact fun ⟨hs, hc⟩ => eq_of_subset_of_card_le hs hc.ge
[GOAL]
case a.mpr
α : Type u_1
s✝ t s a✝ : Finset α
⊢ a✝ = s → a✝ ⊆ s ∧ card a✝ = card s
[PROOFSTEP]
rintro rfl
[GOAL]
case a.mpr
α : Type u_1
s t a✝ : Finset α
⊢ a✝ ⊆ a✝ ∧ card a✝ = card a✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
s✝ t s : Finset α
⊢ powerset s =
    disjiUnion (range (card s + 1)) (fun i => powersetLen i s)
      (_ : Set.Pairwise ↑(range (card s + 1)) fun i j => _root_.Disjoint (powersetLen i s) (powersetLen j s))
[PROOFSTEP]
refine' ext fun a => ⟨fun ha => _, fun ha => _⟩
[GOAL]
case refine'_1
α : Type u_1
s✝ t s a : Finset α
ha : a ∈ powerset s
⊢ a ∈
    disjiUnion (range (card s + 1)) (fun i => powersetLen i s)
      (_ : Set.Pairwise ↑(range (card s + 1)) fun i j => _root_.Disjoint (powersetLen i s) (powersetLen j s))
[PROOFSTEP]
rw [mem_disjiUnion]
[GOAL]
case refine'_1
α : Type u_1
s✝ t s a : Finset α
ha : a ∈ powerset s
⊢ ∃ a_1, a_1 ∈ range (card s + 1) ∧ a ∈ powersetLen a_1 s
[PROOFSTEP]
exact
  ⟨a.card, mem_range.mpr (Nat.lt_succ_of_le (card_le_of_subset (mem_powerset.mp ha))),
    mem_powersetLen.mpr ⟨mem_powerset.mp ha, rfl⟩⟩
[GOAL]
case refine'_2
α : Type u_1
s✝ t s a : Finset α
ha :
  a ∈
    disjiUnion (range (card s + 1)) (fun i => powersetLen i s)
      (_ : Set.Pairwise ↑(range (card s + 1)) fun i j => _root_.Disjoint (powersetLen i s) (powersetLen j s))
⊢ a ∈ powerset s
[PROOFSTEP]
rcases mem_disjiUnion.mp ha with ⟨i, _hi, ha⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
s✝ t s a : Finset α
ha✝ :
  a ∈
    disjiUnion (range (card s + 1)) (fun i => powersetLen i s)
      (_ : Set.Pairwise ↑(range (card s + 1)) fun i j => _root_.Disjoint (powersetLen i s) (powersetLen j s))
i : ℕ
_hi : i ∈ range (card s + 1)
ha : a ∈ powersetLen i s
⊢ a ∈ powerset s
[PROOFSTEP]
exact mem_powerset.mpr (mem_powersetLen.mp ha).1
[GOAL]
α : Type u_1
s✝ t : Finset α
inst✝ : DecidableEq (Finset α)
s : Finset α
⊢ powerset s = Finset.biUnion (range (card s + 1)) fun i => powersetLen i s
[PROOFSTEP]
simpa only [disjiUnion_eq_biUnion] using powerset_card_disjiUnion s
[GOAL]
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
⊢ sup (powersetLen (Nat.succ n) u) id = u
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
⊢ sup (powersetLen (Nat.succ n) u) id ≤ u
[PROOFSTEP]
simp_rw [Finset.sup_le_iff, mem_powersetLen]
[GOAL]
case a
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
⊢ ∀ (b : Finset α), b ⊆ u ∧ card b = Nat.succ n → id b ≤ u
[PROOFSTEP]
rintro x ⟨h, -⟩
[GOAL]
case a.intro
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
x : Finset α
h : x ⊆ u
⊢ id x ≤ u
[PROOFSTEP]
exact h
[GOAL]
case a
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
⊢ u ≤ sup (powersetLen (Nat.succ n) u) id
[PROOFSTEP]
rw [sup_eq_biUnion, le_iff_subset, subset_iff]
[GOAL]
case a
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
⊢ ∀ ⦃x : α⦄, x ∈ u → x ∈ Finset.biUnion (powersetLen (Nat.succ n) u) id
[PROOFSTEP]
cases' (Nat.succ_le_of_lt hn).eq_or_lt with h' h'
[GOAL]
case a.inl
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n = card u
⊢ ∀ ⦃x : α⦄, x ∈ u → x ∈ Finset.biUnion (powersetLen (Nat.succ n) u) id
[PROOFSTEP]
simp [h']
[GOAL]
case a.inr
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
⊢ ∀ ⦃x : α⦄, x ∈ u → x ∈ Finset.biUnion (powersetLen (Nat.succ n) u) id
[PROOFSTEP]
intro x hx
[GOAL]
case a.inr
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
x : α
hx : x ∈ u
⊢ x ∈ Finset.biUnion (powersetLen (Nat.succ n) u) id
[PROOFSTEP]
simp only [mem_biUnion, exists_prop, id.def]
[GOAL]
case a.inr
α : Type u_1
s t : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
x : α
hx : x ∈ u
⊢ ∃ a, a ∈ powersetLen (Nat.succ n) u ∧ x ∈ a
[PROOFSTEP]
obtain ⟨t, ht⟩ : ∃ t, t ∈ powersetLen n (u.erase x) :=
  powersetLen_nonempty (le_trans (Nat.le_pred_of_lt hn) pred_card_le_card_erase)
[GOAL]
case a.inr.intro
α : Type u_1
s t✝ : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
x : α
hx : x ∈ u
t : Finset α
ht : t ∈ powersetLen n (erase u x)
⊢ ∃ a, a ∈ powersetLen (Nat.succ n) u ∧ x ∈ a
[PROOFSTEP]
refine' ⟨insert x t, _, mem_insert_self _ _⟩
[GOAL]
case a.inr.intro
α : Type u_1
s t✝ : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
x : α
hx : x ∈ u
t : Finset α
ht : t ∈ powersetLen n (erase u x)
⊢ insert x t ∈ powersetLen (Nat.succ n) u
[PROOFSTEP]
rw [← insert_erase hx, powersetLen_succ_insert (not_mem_erase _ _)]
[GOAL]
case a.inr.intro
α : Type u_1
s t✝ : Finset α
inst✝ : DecidableEq α
u : Finset α
n : ℕ
hn : n < card u
h' : Nat.succ n < card u
x : α
hx : x ∈ u
t : Finset α
ht : t ∈ powersetLen n (erase u x)
⊢ insert x t ∈ powersetLen (Nat.succ n) (erase u x) ∪ image (insert x) (powersetLen n (erase u x))
[PROOFSTEP]
exact mem_union_right _ (mem_image_of_mem _ ht)
[GOAL]
α : Type u_1
s✝ t s : Finset α
i : ℕ
⊢ Multiset.map val (powersetLen i s).val = Multiset.powersetLen i s.val
[PROOFSTEP]
simp [Finset.powersetLen, map_pmap, pmap_eq_map, map_id']
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
⊢ t ∈ powersetLen n (map f s) ↔ t ∈ map (mapEmbedding f).toEmbedding (powersetLen n s)
[PROOFSTEP]
simp only [card_map, mem_powersetLen, le_eq_subset, gt_iff_lt, mem_map, mapEmbedding_apply]
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
⊢ t ⊆ map f s ∧ card t = n ↔ ∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
⊢ t ⊆ map f s ∧ card t = n → ∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t
[PROOFSTEP]
classical
intro h
have : map f (filter (fun x => (f x ∈ t)) s) = t := by
  ext x
  simp only [mem_map, mem_filter, decide_eq_true_eq]
  exact
    ⟨fun ⟨_y, ⟨_hy₁, hy₂⟩, hy₃⟩ => hy₃ ▸ hy₂, fun hx =>
      let ⟨y, hy⟩ := mem_map.1 (h.1 hx);
      ⟨y, ⟨hy.1, hy.2 ▸ hx⟩, hy.2⟩⟩
refine' ⟨_, _, this⟩
rw [← card_map f, this, h.2]; simp
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
⊢ t ⊆ map f s ∧ card t = n → ∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t
[PROOFSTEP]
intro h
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
⊢ ∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t
[PROOFSTEP]
have : map f (filter (fun x => (f x ∈ t)) s) = t := by
  ext x
  simp only [mem_map, mem_filter, decide_eq_true_eq]
  exact
    ⟨fun ⟨_y, ⟨_hy₁, hy₂⟩, hy₃⟩ => hy₃ ▸ hy₂, fun hx =>
      let ⟨y, hy⟩ := mem_map.1 (h.1 hx);
      ⟨y, ⟨hy.1, hy.2 ▸ hx⟩, hy.2⟩⟩
[GOAL]
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
⊢ map f (filter (fun x => ↑f x ∈ t) s) = t
[PROOFSTEP]
ext x
[GOAL]
case a
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
x : β
⊢ x ∈ map f (filter (fun x => ↑f x ∈ t) s) ↔ x ∈ t
[PROOFSTEP]
simp only [mem_map, mem_filter, decide_eq_true_eq]
[GOAL]
case a
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
x : β
⊢ (∃ a, (a ∈ s ∧ ↑f a ∈ t) ∧ ↑f a = x) ↔ x ∈ t
[PROOFSTEP]
exact
  ⟨fun ⟨_y, ⟨_hy₁, hy₂⟩, hy₃⟩ => hy₃ ▸ hy₂, fun hx =>
    let ⟨y, hy⟩ := mem_map.1 (h.1 hx);
    ⟨y, ⟨hy.1, hy.2 ▸ hx⟩, hy.2⟩⟩
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
this : map f (filter (fun x => ↑f x ∈ t) s) = t
⊢ ∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t
[PROOFSTEP]
refine' ⟨_, _, this⟩
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
this : map f (filter (fun x => ↑f x ∈ t) s) = t
⊢ filter (fun x => ↑f x ∈ t) s ⊆ s ∧ card (filter (fun x => ↑f x ∈ t) s) = n
[PROOFSTEP]
rw [← card_map f, this, h.2]
[GOAL]
case mp
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
h : t ⊆ map f s ∧ card t = n
this : map f (filter (fun x => ↑f x ∈ t) s) = t
⊢ filter (fun x => ↑f x ∈ t) s ⊆ s ∧ n = n
[PROOFSTEP]
simp
[GOAL]
case mpr
α : Type u_1
s✝ t✝ : Finset α
β : Type u_2
f : α ↪ β
n : ℕ
s : Finset α
t : Finset β
⊢ (∃ a, (a ⊆ s ∧ card a = n) ∧ ↑(mapEmbedding f).toEmbedding a = t) → t ⊆ map f s ∧ card t = n
[PROOFSTEP]
rintro ⟨a, ⟨has, rfl⟩, rfl⟩
[GOAL]
case mpr.intro.intro.intro
α : Type u_1
s✝ t : Finset α
β : Type u_2
f : α ↪ β
s a : Finset α
has : a ⊆ s
⊢ ↑(mapEmbedding f).toEmbedding a ⊆ map f s ∧ card (↑(mapEmbedding f).toEmbedding a) = card a
[PROOFSTEP]
dsimp [RelEmbedding.coe_toEmbedding]
  --Porting note: Why is `rw` required here and not `simp`?
[GOAL]
case mpr.intro.intro.intro
α : Type u_1
s✝ t : Finset α
β : Type u_2
f : α ↪ β
s a : Finset α
has : a ⊆ s
⊢ ↑(mapEmbedding f) a ⊆ map f s ∧ card (↑(mapEmbedding f) a) = card a
[PROOFSTEP]
rw [mapEmbedding_apply]
[GOAL]
case mpr.intro.intro.intro
α : Type u_1
s✝ t : Finset α
β : Type u_2
f : α ↪ β
s a : Finset α
has : a ⊆ s
⊢ map f a ⊆ map f s ∧ card (map f a) = card a
[PROOFSTEP]
simp [has]


[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
⊢ Linear k (FdRep k G)
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ AddCommGroup (CoeSort.coe V)
[PROOFSTEP]
change AddCommGroup ((forget₂ (FdRep k G) (FGModuleCat k)).obj V).obj
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ AddCommGroup ↑((forget₂ (FdRep k G) (FGModuleCat k)).obj V).obj
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ Module k (CoeSort.coe V)
[PROOFSTEP]
change Module k ((forget₂ (FdRep k G) (FGModuleCat k)).obj V).obj
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ Module k ↑((forget₂ (FdRep k G) (FGModuleCat k)).obj V).obj
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ FiniteDimensional k (CoeSort.coe V)
[PROOFSTEP]
change FiniteDimensional k ((forget₂ (FdRep k G) (FGModuleCat k)).obj V)
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ FiniteDimensional k ↑((forget₂ (FdRep k G) (FGModuleCat k)).obj V)
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V W : FdRep k G
i : V ≅ W
g : G
⊢ ↑(ρ W) g = ↑(LinearEquiv.conj (isoToLinearEquiv i)) (↑(ρ V) g)
[PROOFSTEP]
erw [FdRep.isoToLinearEquiv, ← FGModuleCat.Iso.conj_eq_conj, Iso.conj_apply]
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V W : FdRep k G
i : V ≅ W
g : G
⊢ ↑(ρ W) g =
    ((Action.forget (FGModuleCat k) (MonCat.of G)).mapIso i).inv ≫
      ↑(ρ V) g ≫ ((Action.forget (FGModuleCat k) (MonCat.of G)).mapIso i).hom
[PROOFSTEP]
rw [Iso.eq_inv_comp ((Action.forget (FGModuleCat k) (MonCat.of G)).mapIso i)]
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V W : FdRep k G
i : V ≅ W
g : G
⊢ ((Action.forget (FGModuleCat k) (MonCat.of G)).mapIso i).hom ≫ ↑(ρ W) g =
    ↑(ρ V) g ≫ ((Action.forget (FGModuleCat k) (MonCat.of G)).mapIso i).hom
[PROOFSTEP]
exact (i.hom.comm g).symm
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
⊢ Rep.ρ ((forget₂ (FdRep k G) (Rep k G)).obj V) = ρ V
[PROOFSTEP]
ext g v
[GOAL]
case h.h
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
V : FdRep k G
g : G
v : CoeSort.coe ((forget₂ (FdRep k G) (Rep k G)).obj V)
⊢ ↑(↑(Rep.ρ ((forget₂ (FdRep k G) (Rep k G)).obj V)) g) v = ↑(↑(ρ V) g) v
[PROOFSTEP]
rfl
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
⊢ MonoidalCategory (FdRep k G)
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
⊢ MonoidalPreadditive (FdRep k G)
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
⊢ MonoidalLinear k (FdRep k G)
[PROOFSTEP]
infer_instance
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
⊢ HasKernels (FdRep k G)
[PROOFSTEP]
infer_instance
  -- Verify that Schur's lemma applies out of the box.
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
X Y : FdRep k G
x✝ : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y
⊢ (fun f => Action.Hom.mk ((forget₂ (FGModuleCat k) (ModuleCat k)).map f.hom))
      (AddHom.toFun
        {
            toAddHom :=
              { toFun := fun f => Action.Hom.mk f.hom,
                map_add' :=
                  (_ :
                    ∀ (x x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                      (fun f => Action.Hom.mk f.hom) (x + x_1) = (fun f => Action.Hom.mk f.hom) (x + x_1)) },
            map_smul' :=
              (_ :
                ∀ (x : k) (x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                  AddHom.toFun
                      { toFun := fun f => Action.Hom.mk f.hom,
                        map_add' :=
                          (_ :
                            ∀ (x x_2 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                              (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                      (x • x_1) =
                    AddHom.toFun
                      { toFun := fun f => Action.Hom.mk f.hom,
                        map_add' :=
                          (_ :
                            ∀ (x x_2 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                              (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                      (x • x_1)) }.toAddHom
        x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case h.h
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
X Y : FdRep k G
x✝¹ : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y
x✝ : ↑((forget₂ (FdRep k G) (Rep k G)).obj X).V
⊢ ↑((fun f => Action.Hom.mk ((forget₂ (FGModuleCat k) (ModuleCat k)).map f.hom))
            (AddHom.toFun
              {
                  toAddHom :=
                    { toFun := fun f => Action.Hom.mk f.hom,
                      map_add' :=
                        (_ :
                          ∀ (x x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                            (fun f => Action.Hom.mk f.hom) (x + x_1) = (fun f => Action.Hom.mk f.hom) (x + x_1)) },
                  map_smul' :=
                    (_ :
                      ∀ (x : k) (x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                        AddHom.toFun
                            { toFun := fun f => Action.Hom.mk f.hom,
                              map_add' :=
                                (_ :
                                  ∀
                                    (x x_2 :
                                      (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                                    (fun f => Action.Hom.mk f.hom) (x + x_2) =
                                      (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                            (x • x_1) =
                          AddHom.toFun
                            { toFun := fun f => Action.Hom.mk f.hom,
                              map_add' :=
                                (_ :
                                  ∀
                                    (x x_2 :
                                      (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                                    (fun f => Action.Hom.mk f.hom) (x + x_2) =
                                      (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                            (x • x_1)) }.toAddHom
              x✝¹)).hom
      x✝ =
    ↑x✝¹.hom x✝
[PROOFSTEP]
rfl
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
X Y : FdRep k G
x✝ : X ⟶ Y
⊢ AddHom.toFun
      {
          toAddHom :=
            { toFun := fun f => Action.Hom.mk f.hom,
              map_add' :=
                (_ :
                  ∀ (x x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                    (fun f => Action.Hom.mk f.hom) (x + x_1) = (fun f => Action.Hom.mk f.hom) (x + x_1)) },
          map_smul' :=
            (_ :
              ∀ (x : k) (x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                AddHom.toFun
                    { toFun := fun f => Action.Hom.mk f.hom,
                      map_add' :=
                        (_ :
                          ∀ (x x_2 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                            (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                    (x • x_1) =
                  AddHom.toFun
                    { toFun := fun f => Action.Hom.mk f.hom,
                      map_add' :=
                        (_ :
                          ∀ (x x_2 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                            (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                    (x • x_1)) }.toAddHom
      ((fun f => Action.Hom.mk ((forget₂ (FGModuleCat k) (ModuleCat k)).map f.hom)) x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case h.w
k G : Type u
inst✝¹ : Field k
inst✝ : Monoid G
X Y : FdRep k G
x✝¹ : X ⟶ Y
x✝ : (forget (FGModuleCat k)).obj X.V
⊢ ↑(AddHom.toFun
            {
                toAddHom :=
                  { toFun := fun f => Action.Hom.mk f.hom,
                    map_add' :=
                      (_ :
                        ∀ (x x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                          (fun f => Action.Hom.mk f.hom) (x + x_1) = (fun f => Action.Hom.mk f.hom) (x + x_1)) },
                map_smul' :=
                  (_ :
                    ∀ (x : k) (x_1 : (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                      AddHom.toFun
                          { toFun := fun f => Action.Hom.mk f.hom,
                            map_add' :=
                              (_ :
                                ∀
                                  (x x_2 :
                                    (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                                  (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                          (x • x_1) =
                        AddHom.toFun
                          { toFun := fun f => Action.Hom.mk f.hom,
                            map_add' :=
                              (_ :
                                ∀
                                  (x x_2 :
                                    (forget₂ (FdRep k G) (Rep k G)).obj X ⟶ (forget₂ (FdRep k G) (Rep k G)).obj Y),
                                  (fun f => Action.Hom.mk f.hom) (x + x_2) = (fun f => Action.Hom.mk f.hom) (x + x_2)) }
                          (x • x_1)) }.toAddHom
            ((fun f => Action.Hom.mk ((forget₂ (FGModuleCat k) (ModuleCat k)).map f.hom)) x✝¹)).hom
      x✝ =
    ↑x✝¹.hom x✝
[PROOFSTEP]
rfl
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Group G
⊢ RightRigidCategory (FdRep k G)
[PROOFSTEP]
change RightRigidCategory (Action (FGModuleCat k) (GroupCat.of G))
[GOAL]
k G : Type u
inst✝¹ : Field k
inst✝ : Group G
⊢ RightRigidCategory (Action (FGModuleCat k) ((forget₂ GroupCat MonCat).obj (GroupCat.of G)))
[PROOFSTEP]
infer_instance
[GOAL]
k G V : Type u
inst✝⁴ : Field k
inst✝³ : Group G
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : FiniteDimensional k V
ρV : Representation k G V
W : FdRep k G
⊢ of (dual ρV) ⊗ W ≅ of (linHom ρV (ρ W))
[PROOFSTEP]
refine Action.mkIso (dualTensorIsoLinHomAux ρV W) ?_
[GOAL]
k G V : Type u
inst✝⁴ : Field k
inst✝³ : Group G
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : FiniteDimensional k V
ρV : Representation k G V
W : FdRep k G
⊢ ∀ (g : ↑(MonCat.of G)),
    ↑(of (dual ρV) ⊗ W).ρ g ≫ (dualTensorIsoLinHomAux ρV W).hom =
      (dualTensorIsoLinHomAux ρV W).hom ≫ ↑(of (linHom ρV (ρ W))).ρ g
[PROOFSTEP]
convert dualTensorHom_comm ρV W.ρ