Theorem: List.Perm.bagInter_right
File: Mathlib/Data/List/Perm.lean

tactic: induction' h with x _ _ _ _ x y _ _ _ _ _ _ ih_1 ih_2 generalizing t
state_before: α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ t : List α
h : l₁ ~ l₂
⊢ l₁.bagInter t ~ l₂.bagInter t
state_after: case nil
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ t : List α
⊢ [].bagInter t ~ [].bagInter t

case cons
α : Type u_1
β : Type u_2
l l₁✝¹ l₂✝¹ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : ∀ (t : List α), l₁✝.bagInter t ~ l₂✝.bagInter t
t : List α
⊢ (x :: l₁✝).bagInter t ~ (x :: l₂✝).bagInter t

case swap
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

case trans
α : Type u_1
β : Type u_2
l l₁✝¹ l₂✝¹ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih_1 : ∀ (t : List α), l₁✝.bagInter t ~ l₂✝.bagInter t
ih_2 : ∀ (t : List α), l₂✝.bagInter t ~ l₃✝.bagInter t
t : List α
⊢ l₁✝.bagInter t ~ l₃✝.bagInter t

tactic: simp
state_before: case nil
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ t : List α
⊢ [].bagInter t ~ [].bagInter t
state_after: no goals

tactic: by_cases x ∈ t <;> simp [*, Perm.cons]
state_before: case cons
α : Type u_1
β : Type u_2
l l₁✝¹ l₂✝¹ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : ∀ (t : List α), l₁✝.bagInter t ~ l₂✝.bagInter t
t : List α
⊢ (x :: l₁✝).bagInter t ~ (x :: l₂✝).bagInter t
state_after: no goals

tactic: by_cases h : x = y
state_before: case swap
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : x = y
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

tactic: by_cases xt : x ∈ t <;> by_cases yt : y ∈ t
state_before: case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∈ t
yt : y ∈ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∈ t
yt : y ∉ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∉ t
yt : y ∈ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∉ t
yt : y ∉ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t

tactic: simp [h]
state_before: case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : x = y
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: no goals

tactic: simp [xt, yt, mem_erase_of_ne h, mem_erase_of_ne (Ne.symm h), erase_comm, swap]
state_before: case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∈ t
yt : y ∈ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: no goals

tactic: simp [xt, yt, mt mem_of_mem_erase, Perm.cons]
state_before: case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∈ t
yt : y ∉ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: no goals

tactic: simp [xt, yt, mt mem_of_mem_erase, Perm.cons]
state_before: case pos
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∉ t
yt : y ∈ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: no goals

tactic: simp [xt, yt]
state_before: case neg
α : Type u_1
β : Type u_2
l l₁✝ l₂✝ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ : List α
x y : α
l✝ t : List α
h : ¬x = y
xt : x ∉ t
yt : y ∉ t
⊢ (y :: x :: l✝).bagInter t ~ (x :: y :: l✝).bagInter t
state_after: no goals

tactic: exact (ih_1 _).trans (ih_2 _)
state_before: case trans
α : Type u_1
β : Type u_2
l l₁✝¹ l₂✝¹ : List α
a : α
inst✝ : DecidableEq α
l₁ l₂ l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih_1 : ∀ (t : List α), l₁✝.bagInter t ~ l₂✝.bagInter t
ih_2 : ∀ (t : List α), l₂✝.bagInter t ~ l₃✝.bagInter t
t : List α
⊢ l₁✝.bagInter t ~ l₃✝.bagInter t
state_after: no goals