Theorem: List.support_formPerm_of_nodup'
File: Mathlib/GroupTheory/Perm/List.lean

tactic: apply _root_.le_antisymm
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
⊢ {x | l.formPerm x ≠ x} = ↑l.toFinset
state_after: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
⊢ {x | l.formPerm x ≠ x} ≤ ↑l.toFinset

case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
⊢ ↑l.toFinset ≤ {x | l.formPerm x ≠ x}

tactic: exact support_formPerm_le' l
state_before: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
⊢ {x | l.formPerm x ≠ x} ≤ ↑l.toFinset
state_after: no goals

tactic: intro x hx
state_before: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
⊢ ↑l.toFinset ≤ {x | l.formPerm x ≠ x}
state_after: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
x : α
hx : x ∈ ↑l.toFinset
⊢ x ∈ {x | l.formPerm x ≠ x}

tactic: simp only [Finset.mem_coe, mem_toFinset] at hx
state_before: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
x : α
hx : x ∈ ↑l.toFinset
⊢ x ∈ {x | l.formPerm x ≠ x}
state_after: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
x : α
hx : x ∈ l
⊢ x ∈ {x | l.formPerm x ≠ x}

tactic: obtain ⟨⟨n, hn⟩, rfl⟩ := get_of_mem hx
state_before: case a
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
x : α
hx : x ∈ l
⊢ x ∈ {x | l.formPerm x ≠ x}
state_after: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
⊢ l.get ⟨n, hn⟩ ∈ {x | l.formPerm x ≠ x}

tactic: rw [Set.mem_setOf_eq, formPerm_apply_get _ h]
state_before: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
⊢ l.get ⟨n, hn⟩ ∈ {x | l.formPerm x ≠ x}
state_after: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
⊢ l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ ≠ l.get ⟨n, hn⟩

tactic: intro H
state_before: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
⊢ l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ ≠ l.get ⟨n, hn⟩
state_after: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
⊢ False

tactic: rw [nodup_iff_injective_get, Function.Injective] at h
state_before: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
⊢ False
state_after: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : ∀ ⦃a₁ a₂ : Fin l.length⦄, l.get a₁ = l.get a₂ → a₁ = a₂
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
⊢ False

tactic: specialize h H
state_before: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : ∀ ⦃a₁ a₂ : Fin l.length⦄, l.get a₁ = l.get a₂ → a₁ = a₂
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
⊢ False
state_after: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
⊢ False

tactic: rcases (Nat.succ_le_of_lt hn).eq_or_lt with hn' | hn'
state_before: case a.intro.mk
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
⊢ False
state_after: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
hn' : n.succ = l.length
⊢ False

case a.intro.mk.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
hn' : n.succ < l.length
⊢ False

tactic: simp only [← hn', Nat.mod_self] at h
state_before: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
hn' : n.succ = l.length
⊢ False
state_after: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
hn' : n.succ = l.length
h : ⟨0, ⋯⟩ = ⟨n, hn⟩
⊢ False

tactic: refine' not_exists.mpr h' _
state_before: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
hn' : n.succ = l.length
h : ⟨0, ⋯⟩ = ⟨n, hn⟩
⊢ False
state_after: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
hn' : n.succ = l.length
h : ⟨0, ⋯⟩ = ⟨n, hn⟩
⊢ ∃ x, l = [x]

tactic: rw [← length_eq_one, ← hn', (Fin.mk.inj_iff.mp h).symm]
state_before: case a.intro.mk.inl
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
hn' : n.succ = l.length
h : ⟨0, ⋯⟩ = ⟨n, hn⟩
⊢ ∃ x, l = [x]
state_after: no goals

tactic: simp [Nat.mod_eq_of_lt hn'] at h
state_before: case a.intro.mk.inr
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h' : ∀ (x : α), l ≠ [x]
n : ℕ
hn : n < l.length
hx : l.get ⟨n, hn⟩ ∈ l
H : l.get ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = l.get ⟨n, hn⟩
h : ⟨(↑⟨n, hn⟩ + 1) % l.length, ⋯⟩ = ⟨n, hn⟩
hn' : n.succ < l.length
⊢ False
state_after: no goals