Theorem: List.isCycle_formPerm
File: Mathlib/GroupTheory/Perm/Cycle/Concrete.lean

tactic: cases' l with x l
state_before: α : Type u_1
inst✝ : DecidableEq α
l l' : List α
hl : l.Nodup
hn : 2 ≤ l.length
⊢ l.formPerm.IsCycle
state_after: case nil
α : Type u_1
inst✝ : DecidableEq α
l' : List α
hl : [].Nodup
hn : 2 ≤ [].length
⊢ [].formPerm.IsCycle

case cons
α : Type u_1
inst✝ : DecidableEq α
l' : List α
x : α
l : List α
hl : (x :: l).Nodup
hn : 2 ≤ (x :: l).length
⊢ (x :: l).formPerm.IsCycle

tactic: induction' l with y l generalizing x
state_before: case cons
α : Type u_1
inst✝ : DecidableEq α
l' : List α
x : α
l : List α
hl : (x :: l).Nodup
hn : 2 ≤ (x :: l).length
⊢ (x :: l).formPerm.IsCycle
state_after: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
l' : List α
x : α
hl : [x].Nodup
hn : 2 ≤ [x].length
⊢ [x].formPerm.IsCycle

case cons.cons
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm.IsCycle

tactic: norm_num at hn
state_before: case nil
α : Type u_1
inst✝ : DecidableEq α
l' : List α
hl : [].Nodup
hn : 2 ≤ [].length
⊢ [].formPerm.IsCycle
state_after: no goals

tactic: norm_num at hn
state_before: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
l' : List α
x : α
hl : [x].Nodup
hn : 2 ≤ [x].length
⊢ [x].formPerm.IsCycle
state_after: no goals

tactic: use x
state_before: case cons.cons
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm.IsCycle
state_after: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm x ≠ x ∧ ∀ ⦃y_1 : α⦄, (x :: y :: l).formPerm y_1 ≠ y_1 → (x :: y :: l).formPerm.SameCycle x y_1

tactic: constructor
state_before: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm x ≠ x ∧ ∀ ⦃y_1 : α⦄, (x :: y :: l).formPerm y_1 ≠ y_1 → (x :: y :: l).formPerm.SameCycle x y_1
state_after: case h.left
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm x ≠ x

case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ ∀ ⦃y_1 : α⦄, (x :: y :: l).formPerm y_1 ≠ y_1 → (x :: y :: l).formPerm.SameCycle x y_1

tactic: rwa [formPerm_apply_mem_ne_self_iff _ hl _ (mem_cons_self _ _)]
state_before: case h.left
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ (x :: y :: l).formPerm x ≠ x
state_after: no goals

tactic: intro w hw
state_before: case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
⊢ ∀ ⦃y_1 : α⦄, (x :: y :: l).formPerm y_1 ≠ y_1 → (x :: y :: l).formPerm.SameCycle x y_1
state_after: case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
⊢ (x :: y :: l).formPerm.SameCycle x w

tactic: have : w ∈ x::y::l := mem_of_formPerm_ne_self _ _ hw
state_before: case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
⊢ (x :: y :: l).formPerm.SameCycle x w
state_after: case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
⊢ (x :: y :: l).formPerm.SameCycle x w

tactic: obtain ⟨k, hk⟩ := get_of_mem this
state_before: case h.right
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
⊢ (x :: y :: l).formPerm.SameCycle x w
state_after: case h.right.intro
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ (x :: y :: l).formPerm.SameCycle x w

tactic: use k
state_before: case h.right.intro
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ (x :: y :: l).formPerm.SameCycle x w
state_after: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ ((x :: y :: l).formPerm ^ ↑↑k) x = w

tactic: rw [← hk]
state_before: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ ((x :: y :: l).formPerm ^ ↑↑k) x = w
state_after: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ ((x :: y :: l).formPerm ^ ↑↑k) x = (x :: y :: l).get k

tactic: simp only [zpow_natCast, formPerm_pow_apply_head _ _ hl k, Nat.mod_eq_of_lt k.isLt]
state_before: case h
α : Type u_1
inst✝ : DecidableEq α
l' : List α
y : α
l : List α
tail_ih✝ : ∀ (x : α), (x :: l).Nodup → 2 ≤ (x :: l).length → (x :: l).formPerm.IsCycle
x : α
hl : (x :: y :: l).Nodup
hn : 2 ≤ (x :: y :: l).length
w : α
hw : (x :: y :: l).formPerm w ≠ w
this : w ∈ x :: y :: l
k : Fin (x :: y :: l).length
hk : (x :: y :: l).get k = w
⊢ ((x :: y :: l).formPerm ^ ↑↑k) x = (x :: y :: l).get k
state_after: no goals