Theorem: Equiv.Perm.swap_induction_on
File: Mathlib/GroupTheory/Perm/Sign.lean

tactic: cases nonempty_fintype α
state_before: α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
f : Perm α
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
state_after: case intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
f : Perm α
val✝ : Fintype α
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f

tactic: cases' (truncSwapFactors f).out with l hl
state_before: case intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
f : Perm α
val✝ : Fintype α
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
state_after: case intro.mk
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
f : Perm α
val✝ : Fintype α
l : List (Perm α)
hl : l.prod = f ∧ ∀ g ∈ l, g.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f

tactic: induction' l with g l ih generalizing f
state_before: case intro.mk
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
f : Perm α
val✝ : Fintype α
l : List (Perm α)
hl : l.prod = f ∧ ∀ g ∈ l, g.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
state_after: case intro.mk.nil
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
f : Perm α
hl : [].prod = f ∧ ∀ g ∈ [], g.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f

case intro.mk.cons
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f

tactic: simp (config := { contextual := true }) only [hl.left.symm, List.prod_nil, forall_true_iff]
state_before: case intro.mk.nil
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
f : Perm α
hl : [].prod = f ∧ ∀ g ∈ [], g.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
state_after: no goals

tactic: intro h1 hmul_swap
state_before: case intro.mk.cons
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
⊢ P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
state_after: case intro.mk.cons
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
⊢ P f

tactic: rcases hl.2 g (by simp) with ⟨x, y, hxy⟩
state_before: case intro.mk.cons
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
⊢ P f
state_after: case intro.mk.cons.intro.intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
x y : α
hxy : x ≠ y ∧ g = swap x y
⊢ P f

tactic: rw [← hl.1, List.prod_cons, hxy.2]
state_before: case intro.mk.cons.intro.intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
x y : α
hxy : x ≠ y ∧ g = swap x y
⊢ P f
state_after: case intro.mk.cons.intro.intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
x y : α
hxy : x ≠ y ∧ g = swap x y
⊢ P (swap x y * l.prod)

tactic: exact
  hmul_swap _ _ _ hxy.1
    (ih _ ⟨rfl, fun v hv => hl.2 _ (List.mem_cons_of_mem _ hv)⟩ h1 hmul_swap)
state_before: case intro.mk.cons.intro.intro
α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
x y : α
hxy : x ≠ y ∧ g = swap x y
⊢ P (swap x y * l.prod)
state_after: no goals

tactic: simp
state_before: α : Type u
inst✝¹ : DecidableEq α
β : Type v
inst✝ : Finite α
P : Perm α → Prop
val✝ : Fintype α
g : Perm α
l : List (Perm α)
ih :
  ∀ (f : Perm α),
    (l.prod = f ∧ ∀ g ∈ l, g.IsSwap) → P 1 → (∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)) → P f
f : Perm α
hl : (g :: l).prod = f ∧ ∀ g_1 ∈ g :: l, g_1.IsSwap
h1 : P 1
hmul_swap : ∀ (f : Perm α) (x y : α), x ≠ y → P f → P (swap x y * f)
⊢ g ∈ g :: l
state_after: no goals