Theorem: List.Perm.permutations'
File: Mathlib/Data/List/Perm.lean

tactic: induction' p with a s t _ IH a b l s t u _ _ IH₁ IH₂
state_before: α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a : α
s t : List α
p : s ~ t
⊢ s.permutations' ~ t.permutations'
state_after: case nil
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a : α
s t : List α
⊢ [].permutations' ~ [].permutations'

case cons
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a✝¹ : α
s✝ t✝ : List α
a : α
s t : List α
a✝ : s ~ t
IH : s.permutations' ~ t.permutations'
⊢ (a :: s).permutations' ~ (a :: t).permutations'

case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (b :: a :: l).permutations' ~ (a :: b :: l).permutations'

case trans
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a : α
s✝ t✝ s t u : List α
a✝¹ : s ~ t
a✝ : t ~ u
IH₁ : s.permutations' ~ t.permutations'
IH₂ : t.permutations' ~ u.permutations'
⊢ s.permutations' ~ u.permutations'

tactic: simp
state_before: case nil
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a : α
s t : List α
⊢ [].permutations' ~ [].permutations'
state_after: no goals

tactic: exact IH.bind_right _
state_before: case cons
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a✝¹ : α
s✝ t✝ : List α
a : α
s t : List α
a✝ : s ~ t
IH : s.permutations' ~ t.permutations'
⊢ (a :: s).permutations' ~ (a :: t).permutations'
state_after: no goals

tactic: dsimp
state_before: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (b :: a :: l).permutations' ~ (a :: b :: l).permutations'
state_after: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (l.permutations'.bind (permutations'Aux a)).bind (permutations'Aux b) ~
    (l.permutations'.bind (permutations'Aux b)).bind (permutations'Aux a)

tactic: rw [bind_assoc, bind_assoc]
state_before: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (l.permutations'.bind (permutations'Aux a)).bind (permutations'Aux b) ~
    (l.permutations'.bind (permutations'Aux b)).bind (permutations'Aux a)
state_after: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (l.permutations'.bind fun x => (permutations'Aux a x).bind (permutations'Aux b)) ~
    l.permutations'.bind fun x => (permutations'Aux b x).bind (permutations'Aux a)

tactic: apply Perm.bind_left
state_before: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ (l.permutations'.bind fun x => (permutations'Aux a x).bind (permutations'Aux b)) ~
    l.permutations'.bind fun x => (permutations'Aux b x).bind (permutations'Aux a)
state_after: case swap.h
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ ∀ a_1 ∈ l.permutations',
    (permutations'Aux a a_1).bind (permutations'Aux b) ~ (permutations'Aux b a_1).bind (permutations'Aux a)

tactic: intro l' _
state_before: case swap.h
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝ : α
s t : List α
a b : α
l : List α
⊢ ∀ a_1 ∈ l.permutations',
    (permutations'Aux a a_1).bind (permutations'Aux b) ~ (permutations'Aux b a_1).bind (permutations'Aux a)
state_after: case swap.h
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝¹ : α
s t : List α
a b : α
l l' : List α
a✝ : l' ∈ l.permutations'
⊢ (permutations'Aux a l').bind (permutations'Aux b) ~ (permutations'Aux b l').bind (permutations'Aux a)

tactic: apply perm_permutations'Aux_comm
state_before: case swap.h
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a✝¹ : α
s t : List α
a b : α
l l' : List α
a✝ : l' ∈ l.permutations'
⊢ (permutations'Aux a l').bind (permutations'Aux b) ~ (permutations'Aux b l').bind (permutations'Aux a)
state_after: no goals

tactic: exact IH₁.trans IH₂
state_before: case trans
α : Type u_1
β : Type u_2
l l₁ l₂ : List α
a : α
s✝ t✝ s t u : List α
a✝¹ : s ~ t
a✝ : t ~ u
IH₁ : s.permutations' ~ t.permutations'
IH₂ : t.permutations' ~ u.permutations'
⊢ s.permutations' ~ u.permutations'
state_after: no goals