Theorem: Finsupp.lmapDomain_supported
File: Mathlib/LinearAlgebra/Finsupp.lean

tactic: inhabit α
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
⊢ map (lmapDomain M R f) (supported M R s) = supported M R (f '' s)

tactic: refine
  le_antisymm
    (map_le_iff_le_comap.2 <|
      le_trans (supported_mono <| Set.subset_preimage_image _ _)
        (supported_comap_lmapDomain M R _ _))
    ?_
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
⊢ map (lmapDomain M R f) (supported M R s) = supported M R (f '' s)

tactic: intro l hl
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
⊢ supported M R (f '' s) ≤ map (lmapDomain M R f) (supported M R s)

tactic: refine' ⟨(lmapDomain M R (Function.invFunOn f s) : (α' →₀ M) →ₗ[R] α →₀ M) l, fun x hx => _, _⟩
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
⊢ l ∈ map (lmapDomain M R f) (supported M R s)

tactic: rcases Finset.mem_image.1 (mapDomain_support hx) with ⟨c, hc, rfl⟩
state_before: case refine'_1
α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
x : α
hx : x ∈ ↑(↑(lmapDomain M R (Function.invFunOn f s)) l).support
⊢ x ∈ s

tactic: exact Function.invFunOn_mem (by simpa using hl hc)
state_before: case refine'_1.intro.intro
α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
c : α'
hc : c ∈ l.support
hx : Function.invFunOn f s c ∈ ↑(↑(lmapDomain M R (Function.invFunOn f s)) l).support
⊢ Function.invFunOn f s c ∈ s

tactic: simpa using hl hc
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
c : α'
hc : c ∈ l.support
hx : Function.invFunOn f s c ∈ ↑(↑(lmapDomain M R (Function.invFunOn f s)) l).support
⊢ ∃ a, a ∈ s ∧ f a = c

tactic: rw [← LinearMap.comp_apply, ← lmapDomain_comp]
state_before: case refine'_2
α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
⊢ ↑(lmapDomain M R f) (↑(lmapDomain M R (Function.invFunOn f s)) l) = l

tactic: refine' (mapDomain_congr fun c hc => _).trans mapDomain_id
state_before: case refine'_2
α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
⊢ ↑(lmapDomain M R (f ∘ Function.invFunOn f s)) l = l

tactic: exact Function.invFunOn_eq (by simpa using hl hc)
state_before: case refine'_2
α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
c : α'
hc : c ∈ l.support
⊢ (f ∘ Function.invFunOn f s) c = _root_.id c

tactic: simpa using hl hc
state_before: α : Type u_1
M : Type u_2
N : Type ?u.245586
P : Type ?u.245589
R : Type u_4
S : Type ?u.245595
inst✝⁸ : Semiring R
inst✝⁷ : Semiring S
inst✝⁶ : AddCommMonoid M
inst✝⁵ : Module R M
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
inst✝² : AddCommMonoid P
inst✝¹ : Module R P
α' : Type u_3
α'' : Type ?u.245690
inst✝ : Nonempty α
f : α → α'
s : Set α
inhabited_h : Inhabited α
l : α' →₀ M
hl : l ∈ supported M R (f '' s)
c : α'
hc : c ∈ l.support
⊢ ∃ a, a ∈ s ∧ f a = c