Theorem: Multiset.map_eq_cons
File: Mathlib/Data/Multiset/Basic.lean

tactic: constructor
state_before: α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
⊢ (∃ a ∈ s, f a = b ∧ map f (s.erase a) = t) ↔ map f s = b ::ₘ t
state_after: case mp
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
⊢ (∃ a ∈ s, f a = b ∧ map f (s.erase a) = t) → map f s = b ::ₘ t

case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
⊢ map f s = b ::ₘ t → ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t

tactic: rintro ⟨a, ha, rfl, rfl⟩
state_before: case mp
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
⊢ (∃ a ∈ s, f a = b ∧ map f (s.erase a) = t) → map f s = b ::ₘ t
state_after: case mp.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
a : α
ha : a ∈ s
⊢ map f s = f a ::ₘ map f (s.erase a)

tactic: rw [← map_cons, Multiset.cons_erase ha]
state_before: case mp.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
a : α
ha : a ∈ s
⊢ map f s = f a ::ₘ map f (s.erase a)
state_after: no goals

tactic: intro h
state_before: case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
⊢ map f s = b ::ₘ t → ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t
state_after: case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
⊢ ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t

tactic: have : b ∈ s.map f := by
  rw [h]
  exact mem_cons_self _ _
state_before: case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
⊢ ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t
state_after: case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
this : b ∈ map f s
⊢ ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t

tactic: obtain ⟨a, h1, rfl⟩ := mem_map.mp this
state_before: case mpr
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
this : b ∈ map f s
⊢ ∃ a ∈ s, f a = b ∧ map f (s.erase a) = t
state_after: case mpr.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
a : α
h1 : a ∈ s
h : map f s = f a ::ₘ t
this : f a ∈ map f s
⊢ ∃ a_1 ∈ s, f a_1 = f a ∧ map f (s.erase a_1) = t

tactic: obtain ⟨u, rfl⟩ := exists_cons_of_mem h1
state_before: case mpr.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
a : α
h1 : a ∈ s
h : map f s = f a ::ₘ t
this : f a ∈ map f s
⊢ ∃ a_1 ∈ s, f a_1 = f a ∧ map f (s.erase a_1) = t
state_after: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f (a ::ₘ u) = f a ::ₘ t
this : f a ∈ map f (a ::ₘ u)
⊢ ∃ a_1 ∈ a ::ₘ u, f a_1 = f a ∧ map f ((a ::ₘ u).erase a_1) = t

tactic: rw [map_cons, cons_inj_right] at h
state_before: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f (a ::ₘ u) = f a ::ₘ t
this : f a ∈ map f (a ::ₘ u)
⊢ ∃ a_1 ∈ a ::ₘ u, f a_1 = f a ∧ map f ((a ::ₘ u).erase a_1) = t
state_after: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f u = t
this : f a ∈ map f (a ::ₘ u)
⊢ ∃ a_1 ∈ a ::ₘ u, f a_1 = f a ∧ map f ((a ::ₘ u).erase a_1) = t

tactic: refine ⟨a, mem_cons_self _ _, rfl, ?_⟩
state_before: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f u = t
this : f a ∈ map f (a ::ₘ u)
⊢ ∃ a_1 ∈ a ::ₘ u, f a_1 = f a ∧ map f ((a ::ₘ u).erase a_1) = t
state_after: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f u = t
this : f a ∈ map f (a ::ₘ u)
⊢ map f ((a ::ₘ u).erase a) = t

tactic: rw [Multiset.erase_cons_head, h]
state_before: case mpr.intro.intro.intro
α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
t : Multiset β
a : α
u : Multiset α
h1 : a ∈ a ::ₘ u
h : map f u = t
this : f a ∈ map f (a ::ₘ u)
⊢ map f ((a ::ₘ u).erase a) = t
state_after: no goals

tactic: rw [h]
state_before: α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
⊢ b ∈ map f s
state_after: α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
⊢ b ∈ b ::ₘ t

tactic: exact mem_cons_self _ _
state_before: α : Type u_1
β : Type v
γ : Type u_2
inst✝ : DecidableEq α
f : α → β
s : Multiset α
t : Multiset β
b : β
h : map f s = b ::ₘ t
⊢ b ∈ b ::ₘ t
state_after: no goals