Module docstring
{"# Preimage of a Finset under an injective map.
"}
{"# Preimage of a Finset under an injective map.
"}
Finset.preimage
definition
(s : Finset β) (f : α → β) (hf : Set.InjOn f (f ⁻¹' ↑s)) : Finset α
Finset.mem_preimage
theorem
{f : α → β} {s : Finset β} {hf : Set.InjOn f (f ⁻¹' ↑s)} {x : α} : x ∈ preimage s f hf ↔ f x ∈ s
@[simp]
theorem mem_preimage {f : α → β} {s : Finset β} {hf : Set.InjOn f (f ⁻¹' ↑s)} {x : α} :
x ∈ preimage s f hfx ∈ preimage s f hf ↔ f x ∈ s :=
Set.Finite.mem_toFinset _
Finset.coe_preimage
theorem
{f : α → β} (s : Finset β) (hf : Set.InjOn f (f ⁻¹' ↑s)) : (↑(preimage s f hf) : Set α) = f ⁻¹' ↑s
@[simp, norm_cast]
theorem coe_preimage {f : α → β} (s : Finset β) (hf : Set.InjOn f (f ⁻¹' ↑s)) :
(↑(preimage s f hf) : Set α) = f ⁻¹' ↑s :=
Set.Finite.coe_toFinset _
Finset.preimage_empty
theorem
{f : α → β} : preimage ∅ f (by simp [InjOn]) = ∅
@[simp]
theorem preimage_empty {f : α → β} : preimage ∅ f (by simp [InjOn]) = ∅ :=
Finset.coe_injective (by simp)
Finset.preimage_univ
theorem
{f : α → β} [Fintype α] [Fintype β] (hf) : preimage univ f hf = univ
@[simp]
theorem preimage_univ {f : α → β} [Fintype α] [Fintype β] (hf) : preimage univ f hf = univ :=
Finset.coe_injective (by simp)
Finset.preimage_inter
theorem
[DecidableEq α] [DecidableEq β] {f : α → β} {s t : Finset β} (hs : Set.InjOn f (f ⁻¹' ↑s))
(ht : Set.InjOn f (f ⁻¹' ↑t)) :
(preimage (s ∩ t) f fun _ hx₁ _ hx₂ => hs (mem_of_mem_inter_left hx₁) (mem_of_mem_inter_left hx₂)) =
preimage s f hs ∩ preimage t f ht
@[simp]
theorem preimage_inter [DecidableEq α] [DecidableEq β] {f : α → β} {s t : Finset β}
(hs : Set.InjOn f (f ⁻¹' ↑s)) (ht : Set.InjOn f (f ⁻¹' ↑t)) :
(preimage (s ∩ t) f fun _ hx₁ _ hx₂ =>
hs (mem_of_mem_inter_left hx₁) (mem_of_mem_inter_left hx₂)) =
preimagepreimage s f hs ∩ preimage t f ht :=
Finset.coe_injective (by simp)
Finset.preimage_union
theorem
[DecidableEq α] [DecidableEq β] {f : α → β} {s t : Finset β} (hst) :
preimage (s ∪ t) f hst =
(preimage s f fun _ hx₁ _ hx₂ => hst (mem_union_left _ hx₁) (mem_union_left _ hx₂)) ∪
preimage t f fun _ hx₁ _ hx₂ => hst (mem_union_right _ hx₁) (mem_union_right _ hx₂)
@[simp]
theorem preimage_union [DecidableEq α] [DecidableEq β] {f : α → β} {s t : Finset β} (hst) :
preimage (s ∪ t) f hst =
(preimage s f fun _ hx₁ _ hx₂ => hst (mem_union_left _ hx₁) (mem_union_left _ hx₂)) ∪
preimage t f fun _ hx₁ _ hx₂ => hst (mem_union_right _ hx₁) (mem_union_right _ hx₂) :=
Finset.coe_injective (by simp)
Finset.preimage_compl'
theorem
[DecidableEq α] [DecidableEq β] [Fintype α] [Fintype β] {f : α → β} (s : Finset β) (hfc : InjOn f (f ⁻¹' ↑sᶜ))
(hf : InjOn f (f ⁻¹' ↑s)) : preimage sᶜ f hfc = (preimage s f hf)ᶜ
@[simp]
theorem preimage_compl' [DecidableEq α] [DecidableEq β] [Fintype α] [Fintype β] {f : α → β}
(s : Finset β) (hfc : InjOn f (f ⁻¹' ↑sᶜ)) (hf : InjOn f (f ⁻¹' ↑s)) :
preimage sᶜ f hfc = (preimage s f hf)ᶜ :=
Finset.coe_injective (by simp)
Finset.preimage_compl
theorem
[DecidableEq α] [DecidableEq β] [Fintype α] [Fintype β] {f : α → β} (s : Finset β) (hf : Function.Injective f) :
preimage sᶜ f hf.injOn = (preimage s f hf.injOn)ᶜ
theorem preimage_compl [DecidableEq α] [DecidableEq β] [Fintype α] [Fintype β] {f : α → β}
(s : Finset β) (hf : Function.Injective f) :
preimage sᶜ f hf.injOn = (preimage s f hf.injOn)ᶜ :=
preimage_compl' _ _ _
Finset.preimage_map
theorem
(f : α ↪ β) (s : Finset α) : (s.map f).preimage f f.injective.injOn = s
@[simp]
lemma preimage_map (f : α ↪ β) (s : Finset α) : (s.map f).preimage f f.injective.injOn = s :=
coe_injective <| by simp only [coe_preimage, coe_map, Set.preimage_image_eq _ f.injective]
Finset.monotone_preimage
theorem
{f : α → β} (h : Injective f) : Monotone fun s => preimage s f h.injOn
theorem monotone_preimage {f : α → β} (h : Injective f) :
Monotone fun s => preimage s f h.injOn := fun _ _ H _ hx =>
mem_preimage.2 (H <| mem_preimage.1 hx)
Finset.image_subset_iff_subset_preimage
theorem
[DecidableEq β] {f : α → β} {s : Finset α} {t : Finset β} (hf : Set.InjOn f (f ⁻¹' ↑t)) :
s.image f ⊆ t ↔ s ⊆ t.preimage f hf
theorem image_subset_iff_subset_preimage [DecidableEq β] {f : α → β} {s : Finset α} {t : Finset β}
(hf : Set.InjOn f (f ⁻¹' ↑t)) : s.image f ⊆ ts.image f ⊆ t ↔ s ⊆ t.preimage f hf :=
image_subset_iff.trans <| by simp only [subset_iff, mem_preimage]
Finset.map_subset_iff_subset_preimage
theorem
{f : α ↪ β} {s : Finset α} {t : Finset β} : s.map f ⊆ t ↔ s ⊆ t.preimage f f.injective.injOn
theorem map_subset_iff_subset_preimage {f : α ↪ β} {s : Finset α} {t : Finset β} :
s.map f ⊆ ts.map f ⊆ t ↔ s ⊆ t.preimage f f.injective.injOn := by
classical rw [map_eq_image, image_subset_iff_subset_preimage]
Finset.card_preimage
theorem
(s : Finset β) (f : α → β) (hf) [DecidablePred (· ∈ Set.range f)] :
(s.preimage f hf).card = {x ∈ s | x ∈ Set.range f}.card
lemma card_preimage (s : Finset β) (f : α → β) (hf) [DecidablePred (· ∈ Set.range f)] :
(s.preimage f hf).card = {x ∈ s | x ∈ Set.range f}.card :=
card_nbij f (by simp) (by simpa) (fun b hb ↦ by aesop)
Finset.image_preimage
theorem
[DecidableEq β] (f : α → β) (s : Finset β) [∀ x, Decidable (x ∈ Set.range f)] (hf : Set.InjOn f (f ⁻¹' ↑s)) :
image f (preimage s f hf) = {x ∈ s | x ∈ Set.range f}
theorem image_preimage [DecidableEq β] (f : α → β) (s : Finset β) [∀ x, Decidable (x ∈ Set.range f)]
(hf : Set.InjOn f (f ⁻¹' ↑s)) : image f (preimage s f hf) = {x ∈ s | x ∈ Set.range f} :=
Finset.coe_inj.1 <| by
simp only [coe_image, coe_preimage, coe_filter, Set.image_preimage_eq_inter_range,
← Set.sep_mem_eq]; rfl
Finset.image_preimage_of_bij
theorem
[DecidableEq β] (f : α → β) (s : Finset β) (hf : Set.BijOn f (f ⁻¹' ↑s) ↑s) : image f (preimage s f hf.injOn) = s
theorem image_preimage_of_bij [DecidableEq β] (f : α → β) (s : Finset β)
(hf : Set.BijOn f (f ⁻¹' ↑s) ↑s) : image f (preimage s f hf.injOn) = s :=
Finset.coe_inj.1 <| by simpa using hf.image_eq
Finset.preimage_subset_of_subset_image
theorem
[DecidableEq β] {f : α → β} {s : Finset β} {t : Finset α} (hs : s ⊆ t.image f) {hf} : s.preimage f hf ⊆ t
lemma preimage_subset_of_subset_image [DecidableEq β] {f : α → β} {s : Finset β} {t : Finset α}
(hs : s ⊆ t.image f) {hf} : s.preimage f hf ⊆ t := by
rw [← coe_subset, coe_preimage]; exact Set.preimage_subset (mod_cast hs) hf
Finset.preimage_subset
theorem
{f : α ↪ β} {s : Finset β} {t : Finset α} (hs : s ⊆ t.map f) : s.preimage f f.injective.injOn ⊆ t
theorem preimage_subset {f : α ↪ β} {s : Finset β} {t : Finset α} (hs : s ⊆ t.map f) :
s.preimage f f.injective.injOn ⊆ t := fun _ h => (mem_map' f).1 (hs (mem_preimage.1 h))
Finset.subset_map_iff
theorem
{f : α ↪ β} {s : Finset β} {t : Finset α} : s ⊆ t.map f ↔ ∃ u ⊆ t, s = u.map f
theorem subset_map_iff {f : α ↪ β} {s : Finset β} {t : Finset α} :
s ⊆ t.map fs ⊆ t.map f ↔ ∃ u ⊆ t, s = u.map f := by
classical
simp_rw [map_eq_image, subset_image_iff, eq_comm]
Finset.sigma_preimage_mk
theorem
{β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a)) (t : Finset α) :
t.sigma (fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) = {a ∈ s | a.1 ∈ t}
theorem sigma_preimage_mk {β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a)) (t : Finset α) :
t.sigma (fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) = {a ∈ s | a.1 ∈ t} := by
ext x
simp [and_comm]
Finset.sigma_preimage_mk_of_subset
theorem
{β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a)) {t : Finset α} (ht : s.image Sigma.fst ⊆ t) :
(t.sigma fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) = s
theorem sigma_preimage_mk_of_subset {β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a))
{t : Finset α} (ht : s.image Sigma.fst ⊆ t) :
(t.sigma fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) = s := by
rw [sigma_preimage_mk, filter_true_of_mem <| image_subset_iff.1 ht]
Finset.sigma_image_fst_preimage_mk
theorem
{β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a)) :
((s.image Sigma.fst).sigma fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) = s
theorem sigma_image_fst_preimage_mk {β : α → Type*} [DecidableEq α] (s : Finset (Σ a, β a)) :
((s.image Sigma.fst).sigma fun a => s.preimage (Sigma.mk a) sigma_mk_injective.injOn) =
s :=
s.sigma_preimage_mk_of_subset (Subset.refl _)
Finset.preimage_inl
theorem
(s : Finset (α ⊕ β)) : s.preimage Sum.inl Sum.inl_injective.injOn = s.toLeft
@[simp] lemma preimage_inl (s : Finset (α ⊕ β)) :
s.preimage Sum.inl Sum.inl_injective.injOn = s.toLeft := by
ext x; simp
Finset.preimage_inr
theorem
(s : Finset (α ⊕ β)) : s.preimage Sum.inr Sum.inr_injective.injOn = s.toRight
@[simp] lemma preimage_inr (s : Finset (α ⊕ β)) :
s.preimage Sum.inr Sum.inr_injective.injOn = s.toRight := by
ext x; simp
Equiv.restrictPreimageFinset
definition
(e : α ≃ β) (s : Finset β) : (s.preimage e e.injective.injOn) ≃ s
/-- Given an equivalence `e : α ≃ β` and `s : Finset β`, restrict `e` to an equivalence
from `e ⁻¹' s` to `s`. -/
@[simps]
def restrictPreimageFinset (e : α ≃ β) (s : Finset β) : (s.preimage e e.injective.injOn) ≃ s where
toFun a := ⟨e a, Finset.mem_preimage.1 a.2⟩
invFun b := ⟨e.symm b, by simp⟩
left_inv _ := by simp
right_inv _ := by simp
Finset.restrict_comp_piCongrLeft
theorem
{π : β → Type*} (s : Finset β) (e : α ≃ β) :
s.restrict ∘ ⇑(e.piCongrLeft π) =
⇑((e.restrictPreimageFinset s).piCongrLeft (fun b : s ↦ (π b))) ∘ (s.preimage e e.injective.injOn).restrict
/-- Reindexing and then restricting to a `Finset` is the same as first restricting to the preimage
of this `Finset` and then reindexing. -/
lemma Finset.restrict_comp_piCongrLeft {π : β → Type*} (s : Finset β) (e : α ≃ β) :
s.restrict ∘ ⇑(e.piCongrLeft π) =
⇑((e.restrictPreimageFinset s).piCongrLeft (fun b : s ↦ (π b))) ∘
(s.preimage e e.injective.injOn).restrict := by
ext x b
simp only [comp_apply, restrict, Equiv.piCongrLeft_apply_eq_cast, cast_inj,
Equiv.restrictPreimageFinset_symm_apply_coe]