Theorem: List.formPerm_eq_formPerm_iff
File: Mathlib/GroupTheory/Perm/List.lean

tactic: rcases l with (_ | ⟨x, _ | ⟨y, l⟩⟩)
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l l' : List α
hl : l.Nodup
hl' : l'.Nodup
⊢ l.formPerm = l'.formPerm ↔ l ~r l' ∨ l.length ≤ 1 ∧ l'.length ≤ 1
state_after: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ [].formPerm = l'.formPerm ↔ [] ~r l' ∨ [].length ≤ 1 ∧ l'.length ≤ 1

case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ [x].formPerm = l'.formPerm ↔ [x] ~r l' ∨ [x].length ≤ 1 ∧ l'.length ≤ 1

case cons.cons
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x y : α
l : List α
hl : (x :: y :: l).Nodup
⊢ (x :: y :: l).formPerm = l'.formPerm ↔ (x :: y :: l) ~r l' ∨ (x :: y :: l).length ≤ 1 ∧ l'.length ≤ 1

tactic: suffices l'.length ≤ 1 ↔ l' = nil ∨ l'.length ≤ 1 by
  simpa [eq_comm, formPerm_eq_one_iff, hl, hl', length_eq_zero]
state_before: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ [].formPerm = l'.formPerm ↔ [] ~r l' ∨ [].length ≤ 1 ∧ l'.length ≤ 1
state_after: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ l'.length ≤ 1 ↔ l' = [] ∨ l'.length ≤ 1

tactic: refine ⟨fun h => Or.inr h, ?_⟩
state_before: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ l'.length ≤ 1 ↔ l' = [] ∨ l'.length ≤ 1
state_after: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ l' = [] ∨ l'.length ≤ 1 → l'.length ≤ 1

tactic: rintro (rfl | h)
state_before: case nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
⊢ l' = [] ∨ l'.length ≤ 1 → l'.length ≤ 1
state_after: case nil.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
hl hl' : [].Nodup
⊢ [].length ≤ 1

case nil.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
h : l'.length ≤ 1
⊢ l'.length ≤ 1

tactic: simpa [eq_comm, formPerm_eq_one_iff, hl, hl', length_eq_zero]
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
this : l'.length ≤ 1 ↔ l' = [] ∨ l'.length ≤ 1
⊢ [].formPerm = l'.formPerm ↔ [] ~r l' ∨ [].length ≤ 1 ∧ l'.length ≤ 1
state_after: no goals

tactic: simp
state_before: case nil.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
hl hl' : [].Nodup
⊢ [].length ≤ 1
state_after: no goals

tactic: exact h
state_before: case nil.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x : α
l' : List α
hl' : l'.Nodup
hl : [].Nodup
h : l'.length ≤ 1
⊢ l'.length ≤ 1
state_after: no goals

tactic: suffices l'.length ≤ 1 ↔ [x] ~r l' ∨ l'.length ≤ 1 by
  simpa [eq_comm, formPerm_eq_one_iff, hl, hl', length_eq_zero, le_rfl]
state_before: case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ [x].formPerm = l'.formPerm ↔ [x] ~r l' ∨ [x].length ≤ 1 ∧ l'.length ≤ 1
state_after: case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ l'.length ≤ 1 ↔ [x] ~r l' ∨ l'.length ≤ 1

tactic: refine ⟨fun h => Or.inr h, ?_⟩
state_before: case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ l'.length ≤ 1 ↔ [x] ~r l' ∨ l'.length ≤ 1
state_after: case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ [x] ~r l' ∨ l'.length ≤ 1 → l'.length ≤ 1

tactic: rintro (h | h)
state_before: case cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
⊢ [x] ~r l' ∨ l'.length ≤ 1 → l'.length ≤ 1
state_after: case cons.nil.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
h : [x] ~r l'
⊢ l'.length ≤ 1

case cons.nil.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
h : l'.length ≤ 1
⊢ l'.length ≤ 1

tactic: simpa [eq_comm, formPerm_eq_one_iff, hl, hl', length_eq_zero, le_rfl]
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
this : l'.length ≤ 1 ↔ [x] ~r l' ∨ l'.length ≤ 1
⊢ [x].formPerm = l'.formPerm ↔ [x] ~r l' ∨ [x].length ≤ 1 ∧ l'.length ≤ 1
state_after: no goals

tactic: simp [← h.perm.length_eq]
state_before: case cons.nil.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
h : [x] ~r l'
⊢ l'.length ≤ 1
state_after: no goals

tactic: exact h
state_before: case cons.nil.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x : α
hl : [x].Nodup
h : l'.length ≤ 1
⊢ l'.length ≤ 1
state_after: no goals

tactic: rcases l' with (_ | ⟨x', _ | ⟨y', l'⟩⟩)
state_before: case cons.cons
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l' : List α
hl' : l'.Nodup
x y : α
l : List α
hl : (x :: y :: l).Nodup
⊢ (x :: y :: l).formPerm = l'.formPerm ↔ (x :: y :: l) ~r l' ∨ (x :: y :: l).length ≤ 1 ∧ l'.length ≤ 1
state_after: case cons.cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
hl' : [].Nodup
⊢ (x :: y :: l).formPerm = [].formPerm ↔ (x :: y :: l) ~r [] ∨ (x :: y :: l).length ≤ 1 ∧ [].length ≤ 1

case cons.cons.cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
x' : α
hl' : [x'].Nodup
⊢ (x :: y :: l).formPerm = [x'].formPerm ↔ (x :: y :: l) ~r [x'] ∨ (x :: y :: l).length ≤ 1 ∧ [x'].length ≤ 1

case cons.cons.cons.cons
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
x' y' : α
l' : List α
hl' : (x' :: y' :: l').Nodup
⊢ (x :: y :: l).formPerm = (x' :: y' :: l').formPerm ↔
    (x :: y :: l) ~r (x' :: y' :: l') ∨ (x :: y :: l).length ≤ 1 ∧ (x' :: y' :: l').length ≤ 1

tactic: simp [formPerm_eq_one_iff _ hl, -formPerm_cons_cons]
state_before: case cons.cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
hl' : [].Nodup
⊢ (x :: y :: l).formPerm = [].formPerm ↔ (x :: y :: l) ~r [] ∨ (x :: y :: l).length ≤ 1 ∧ [].length ≤ 1
state_after: no goals

tactic: simp [formPerm_eq_one_iff _ hl, -formPerm_cons_cons]
state_before: case cons.cons.cons.nil
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
x' : α
hl' : [x'].Nodup
⊢ (x :: y :: l).formPerm = [x'].formPerm ↔ (x :: y :: l) ~r [x'] ∨ (x :: y :: l).length ≤ 1 ∧ [x'].length ≤ 1
state_after: no goals

tactic: simp [-formPerm_cons_cons, formPerm_ext_iff hl hl', Nat.succ_le_succ_iff]
state_before: case cons.cons.cons.cons
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hl : (x :: y :: l).Nodup
x' y' : α
l' : List α
hl' : (x' :: y' :: l').Nodup
⊢ (x :: y :: l).formPerm = (x' :: y' :: l').formPerm ↔
    (x :: y :: l) ~r (x' :: y' :: l') ∨ (x :: y :: l).length ≤ 1 ∧ (x' :: y' :: l').length ≤ 1
state_after: no goals