Theorem: Set.surjOn_iff_exists_bijOn_subset
File: Mathlib/Data/Set/Function.lean

tactic: constructor
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
⊢ SurjOn f s t ↔ ∃ s' ⊆ s, BijOn f s' t
state_after: case mp
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
⊢ SurjOn f s t → ∃ s' ⊆ s, BijOn f s' t

case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
⊢ (∃ s' ⊆ s, BijOn f s' t) → SurjOn f s t

tactic: rcases eq_empty_or_nonempty t with (rfl | ht)
state_before: case mp
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
⊢ SurjOn f s t → ∃ s' ⊆ s, BijOn f s' t
state_after: case mp.inl
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
f : α → β
⊢ SurjOn f s ∅ → ∃ s' ⊆ s, BijOn f s' ∅

case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
⊢ SurjOn f s t → ∃ s' ⊆ s, BijOn f s' t

tactic: exact fun _ => ⟨∅, empty_subset _, bijOn_empty f⟩
state_before: case mp.inl
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
f : α → β
⊢ SurjOn f s ∅ → ∃ s' ⊆ s, BijOn f s' ∅
state_after: no goals

tactic: intro h
state_before: case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
⊢ SurjOn f s t → ∃ s' ⊆ s, BijOn f s' t
state_after: case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
h : SurjOn f s t
⊢ ∃ s' ⊆ s, BijOn f s' t

tactic: haveI : Nonempty α := ⟨Classical.choose (h.comap_nonempty ht)⟩
state_before: case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
h : SurjOn f s t
⊢ ∃ s' ⊆ s, BijOn f s' t
state_after: case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
h : SurjOn f s t
this : Nonempty α
⊢ ∃ s' ⊆ s, BijOn f s' t

tactic: exact ⟨_, h.mapsTo_invFunOn.image_subset, h.bijOn_subset⟩
state_before: case mp.inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
ht : t.Nonempty
h : SurjOn f s t
this : Nonempty α
⊢ ∃ s' ⊆ s, BijOn f s' t
state_after: no goals

tactic: rintro ⟨s', hs', hfs'⟩
state_before: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
⊢ (∃ s' ⊆ s, BijOn f s' t) → SurjOn f s t
state_after: case mpr.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
s' : Set α
hs' : s' ⊆ s
hfs' : BijOn f s' t
⊢ SurjOn f s t

tactic: exact hfs'.surjOn.mono hs' (Subset.refl _)
state_before: case mpr.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Sort u_4
π : α → Type u_5
s s₁ s₂ : Set α
t : Set β
f : α → β
s' : Set α
hs' : s' ⊆ s
hfs' : BijOn f s' t
⊢ SurjOn f s t
state_after: no goals