Theorem: Finset.exists_equiv_extend_of_card_eq
File: Mathlib/Data/Fintype/Sum.lean

tactic: induction' s using Finset.induction with a s has H generalizing f
state_before: α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f : α → β
hfst : image f s ⊆ t
hfs : Set.InjOn f ↑s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i

tactic: have hfst' : Finset.image f s ⊆ t := (Finset.image_mono _ (s.subset_insert a)).trans hfst
state_before: case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i

tactic: have hfs' : Set.InjOn f s := hfs.mono (s.subset_insert a)
state_before: case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i

tactic: obtain ⟨g', hg'⟩ := H hfst' hfs'
state_before: case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i

tactic: have hfat : f a ∈ t := hfst (mem_image_of_mem _ (s.mem_insert_self a))
state_before: case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i

tactic: use g'.trans (Equiv.swap (⟨f a, hfat⟩ : t) (g' a))
state_before: case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i

tactic: simp_rw [mem_insert]
state_before: case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∀ (i : α), i ∈ insert a s → ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i

tactic: rintro i (rfl | hi)
state_before: case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∀ (i : α), i = a ∨ i ∈ s → ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i

tactic: rw [Equiv.trans_apply, Equiv.swap_apply_of_ne_of_ne, hg' _ hi]
state_before: case insert.intro.inr
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i

tactic: obtain ⟨e⟩ : Nonempty (α ≃ ↥t) := by rwa [← Fintype.card_eq, Fintype.card_coe]
state_before: case empty
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
⊢ ∃ g, ∀ (i : α), i ∈ ∅ → ↑(↑g i) = f i

tactic: use e
state_before: case empty.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
e : α ≃ { x // x ∈ t }
⊢ ∃ g, ∀ (i : α), i ∈ ∅ → ↑(↑g i) = f i

tactic: simp
state_before: case empty.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
e : α ≃ { x // x ∈ t }
⊢ ∀ (i : α), i ∈ ∅ → ↑(↑e i) = f i

tactic: rwa [← Fintype.card_eq, Fintype.card_coe]
state_before: α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
⊢ Nonempty (α ≃ { x // x ∈ t })

tactic: simp
state_before: case insert.intro.inl
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
s : Finset α
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
i : α
has : ¬i ∈ s
hfst : image f (insert i s) ⊆ t
hfs : Set.InjOn f ↑(insert i s)
hfat : f i ∈ t
⊢ ↑(↑(g'.trans (Equiv.swap { val := f i, property := hfat } (↑g' i))) i) = f i

tactic: exact
  ne_of_apply_ne Subtype.val
    (ne_of_eq_of_ne (hg' _ hi) <|
      hfs.ne (subset_insert _ _ hi) (mem_insert_self _ _) <| ne_of_mem_of_not_mem hi has)
state_before: case insert.intro.inr.a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑g' i ≠ { val := f a, property := hfat }

tactic: exact g'.injective.ne (ne_of_mem_of_not_mem hi has)
state_before: case insert.intro.inr.a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑g' i ≠ ↑g' a