Theorem: FreeGroup.injective_lift_of_ping_pong
File: Mathlib/GroupTheory/FreeProduct.lean

tactic: have : FreeGroup.lift a =
    (FreeProduct.lift fun i => FreeGroup.lift fun _ => a i).comp
      (@freeGroupEquivFreeProduct ι).toMonoidHom := by
  ext i
  simp
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
⊢ Function.Injective ↑(↑FreeGroup.lift a)

tactic: rw [this, MonoidHom.coe_comp]
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
this :
  ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivFreeProduct)
⊢ Function.Injective ↑(↑FreeGroup.lift a)

tactic: clear this
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
this :
  ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivFreeProduct)
⊢ Function.Injective
    (↑(↑lift fun i => ↑FreeGroup.lift fun x => a i) ∘ ↑(MulEquiv.toMonoidHom freeGroupEquivFreeProduct))

tactic: refine' Function.Injective.comp _ (MulEquiv.injective freeGroupEquivFreeProduct)
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
⊢ Function.Injective
    (↑(↑lift fun i => ↑FreeGroup.lift fun x => a i) ∘ ↑(MulEquiv.toMonoidHom freeGroupEquivFreeProduct))

tactic: show Function.Injective (lift fun i : ι => FreeGroup.lift fun _ => a i)
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)

tactic: let H : ι → Type _ := fun _i => FreeGroup Unit
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)

tactic: let f : ∀ i, H i →* G := fun i => FreeGroup.lift fun _ => a i
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)

tactic: let X' : ι → Set α := fun i => X i ∪ Y i
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)

tactic: apply lift_injective_of_ping_pong f _ X'
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)

tactic: show ∀ i, (X' i).Nonempty
state_before: case hXnonempty
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ ∀ (i : ι), Set.Nonempty (X' i)

case hXdisj
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)

case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i

ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: show Pairwise fun i j => Disjoint (X' i) (X' j)
state_before: case hXdisj
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)

case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i

ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: show Pairwise fun i j => ∀ h : H i, h ≠ 1 → f i h • X' j ⊆ X' i
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i

ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: show _ ∨ ∃ i, 3 ≤ (#H i)
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: ext i
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
⊢ ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivFreeProduct)

tactic: simp
state_before: case h
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
i : IsFreeGroup.Generators (FreeGroup ι)
⊢ ↑(↑FreeGroup.lift a) (IsFreeGroup.of i) =
    ↑(MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivFreeProduct))
      (IsFreeGroup.of i)

tactic: exact fun i => Set.Nonempty.inl (hXnonempty i)
state_before: case hXnonempty
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ ∀ (i : ι), Set.Nonempty (X' i)

tactic: intro i j hij
state_before: case hXdisj
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)

tactic: simp only
state_before: case hXdisj
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X' i) (X' j)

tactic: apply Disjoint.union_left <;> apply Disjoint.union_right
state_before: case hXdisj
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i ∪ Y i) (X j ∪ Y j)

tactic: exact hXdisj hij
state_before: case hXdisj.hs.ht
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i) (X j)

tactic: exact hXYdisj i j
state_before: case hXdisj.hs.hu
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i) (Y j)

tactic: exact (hXYdisj j i).symm
state_before: case hXdisj.ht.ht
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (Y i) (X j)

tactic: exact hYdisj hij
state_before: case hXdisj.ht.hu
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (Y i) (Y j)

tactic: rintro i j hij
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i

tactic: refine' FreeGroup.freeGroupUnitEquivInt.forall_congr_left'.mpr _
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i

tactic: intro n hne1
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ ∀ (y : ℤ),
    ↑FreeGroup.freeGroupUnitEquivInt.symm y ≠ 1 → ↑(f i) (↑FreeGroup.freeGroupUnitEquivInt.symm y) • X' j ⊆ X' i

tactic: change FreeGroup.lift (fun _ => a i) (FreeGroup.of () ^ n) • X' j ⊆ X' i
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ ↑(f i) (↑FreeGroup.freeGroupUnitEquivInt.symm n) • X' j ⊆ X' i

tactic: simp only [map_zpow, FreeGroup.lift.of]
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ ↑(↑FreeGroup.lift fun x => a i) (FreeGroup.of () ^ n) • X' j ⊆ X' i

tactic: change a i ^ n • X' j ⊆ X' i
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i

tactic: have hnne0 : n ≠ 0 := by
  rintro rfl
  apply hne1
  simp; rfl
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ a i ^ n • X' j ⊆ X' i

tactic: clear hne1
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
hnne0 : n ≠ 0
⊢ a i ^ n • X' j ⊆ X' i

tactic: simp only
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
⊢ a i ^ n • X' j ⊆ X' i

tactic: cases' (lt_or_gt_of_ne hnne0).symm with hlt hgt
state_before: case hpp
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i

tactic: rintro rfl
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ n ≠ 0

tactic: apply hne1
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ False

tactic: simp
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ ↑FreeGroup.freeGroupUnitEquivInt.symm 0 = 1

tactic: rfl
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ ↑FreeGroup.freeGroupUnitEquivInt.symm 0 = 1

tactic: have h1n : 1 ≤ n := hlt
state_before: case hpp.inl
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i

tactic: calc
  a i ^ n • X' j ⊆ a i ^ n • Y iᶜ :=
    smul_set_mono ((hXYdisj j i).union_left <| hYdisj hij.symm).subset_compl_right
  _ ⊆ X i := by
    clear hnne0 hlt
    refine Int.le_induction (P := fun n => a i ^ n • Y iᶜ ⊆ X i) ?_ ?_ n h1n
    . dsimp
      rw [zpow_one]
      exact hX i
    . dsimp
      intro n _hle hi
      calc
        a i ^ (n + 1) • Y iᶜ = (a i ^ n * a i) • Y iᶜ := by rw [zpow_add, zpow_one]
        _ = a i ^ n • a i • Y iᶜ := (MulAction.mul_smul _ _ _)
        _ ⊆ a i ^ n • X i := (smul_set_mono <| hX i)
        _ ⊆ a i ^ n • Y iᶜ := (smul_set_mono (hXYdisj i i).subset_compl_right)
        _ ⊆ X i := hi
  _ ⊆ X' i := Set.subset_union_left _ _
state_before: case hpp.inl
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
h1n : 1 ≤ n
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i

tactic: clear hnne0 hlt
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
h1n : 1 ≤ n
⊢ a i ^ n • Y iᶜ ⊆ X i

tactic: refine Int.le_induction (P := fun n => a i ^ n • Y iᶜ ⊆ X i) ?_ ?_ n h1n
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i ^ n • Y iᶜ ⊆ X i

tactic: . dsimp
  rw [zpow_one]
  exact hX i
state_before: case refine_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ (fun n => a i ^ n • Y iᶜ ⊆ X i) 1

case refine_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → (fun n => a i ^ n • Y iᶜ ⊆ X i) n → (fun n => a i ^ n • Y iᶜ ⊆ X i) (n + 1)

tactic: . dsimp
  intro n _hle hi
  calc
    a i ^ (n + 1) • Y iᶜ = (a i ^ n * a i) • Y iᶜ := by rw [zpow_add, zpow_one]
    _ = a i ^ n • a i • Y iᶜ := (MulAction.mul_smul _ _ _)
    _ ⊆ a i ^ n • X i := (smul_set_mono <| hX i)
    _ ⊆ a i ^ n • Y iᶜ := (smul_set_mono (hXYdisj i i).subset_compl_right)
    _ ⊆ X i := hi
state_before: case refine_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → (fun n => a i ^ n • Y iᶜ ⊆ X i) n → (fun n => a i ^ n • Y iᶜ ⊆ X i) (n + 1)

tactic: dsimp
state_before: case refine_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ (fun n => a i ^ n • Y iᶜ ⊆ X i) 1

tactic: rw [zpow_one]
state_before: case refine_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i ^ 1 • Y iᶜ ⊆ X i

tactic: exact hX i
state_before: case refine_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i • Y iᶜ ⊆ X i

tactic: dsimp
state_before: case refine_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → (fun n => a i ^ n • Y iᶜ ⊆ X i) n → (fun n => a i ^ n • Y iᶜ ⊆ X i) (n + 1)

tactic: intro n _hle hi
state_before: case refine_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → a i ^ n • Y iᶜ ⊆ X i → a i ^ (n + 1) • Y iᶜ ⊆ X i

tactic: calc
  a i ^ (n + 1) • Y iᶜ = (a i ^ n * a i) • Y iᶜ := by rw [zpow_add, zpow_one]
  _ = a i ^ n • a i • Y iᶜ := (MulAction.mul_smul _ _ _)
  _ ⊆ a i ^ n • X i := (smul_set_mono <| hX i)
  _ ⊆ a i ^ n • Y iᶜ := (smul_set_mono (hXYdisj i i).subset_compl_right)
  _ ⊆ X i := hi
state_before: case refine_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
h1n : 1 ≤ n✝
n : ℤ
_hle : 1 ≤ n
hi : a i ^ n • Y iᶜ ⊆ X i
⊢ a i ^ (n + 1) • Y iᶜ ⊆ X i

tactic: rw [zpow_add, zpow_one]
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
h1n : 1 ≤ n✝
n : ℤ
_hle : 1 ≤ n
hi : a i ^ n • Y iᶜ ⊆ X i
⊢ a i ^ (n + 1) • Y iᶜ = (a i ^ n * a i) • Y iᶜ

tactic: have h1n : n ≤ -1 := by
  apply Int.le_of_lt_add_one
  simpa using hgt
state_before: case hpp.inr
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i

tactic: apply Int.le_of_lt_add_one
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ n ≤ -1

tactic: simpa using hgt
state_before: case H
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ n < -1 + 1

tactic: refine' Int.le_induction_down (P := fun n => a i ^ n • X iᶜ ⊆ Y i) _ _ _ h1n
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ a i ^ n • X iᶜ ⊆ Y i

tactic: dsimp
state_before: case refine'_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ (fun n => a i ^ n • X iᶜ ⊆ Y i) (-1)

tactic: rw [zpow_neg, zpow_one]
state_before: case refine'_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ a i ^ (-1) • X iᶜ ⊆ Y i

tactic: exact hY i
state_before: case refine'_1
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ (a i)⁻¹ • X iᶜ ⊆ Y i

tactic: dsimp
state_before: case refine'_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ ∀ (n : ℤ), n ≤ -1 → (fun n => a i ^ n • X iᶜ ⊆ Y i) n → (fun n => a i ^ n • X iᶜ ⊆ Y i) (n - 1)

tactic: intro n _ hi
state_before: case refine'_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ ∀ (n : ℤ), n ≤ -1 → a i ^ n • X iᶜ ⊆ Y i → a i ^ (n - 1) • X iᶜ ⊆ Y i

tactic: calc
  a i ^ (n - 1) • X iᶜ = (a i ^ n * (a i)⁻¹) • X iᶜ := by rw [zpow_sub, zpow_one]
  _ = a i ^ n • (a i)⁻¹ • X iᶜ := (MulAction.mul_smul _ _ _)
  _ ⊆ a i ^ n • Y i := (smul_set_mono <| hY i)
  _ ⊆ a i ^ n • X iᶜ := (smul_set_mono (hXYdisj i i).symm.subset_compl_right)
  _ ⊆ Y i := hi
state_before: case refine'_2
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
hnne0 : n✝ ≠ 0
hgt : n✝ < 0
h1n : n✝ ≤ -1
n : ℤ
a✝ : n ≤ -1
hi : a i ^ n • X iᶜ ⊆ Y i
⊢ a i ^ (n - 1) • X iᶜ ⊆ Y i

tactic: rw [zpow_sub, zpow_one]
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
hnne0 : n✝ ≠ 0
hgt : n✝ < 0
h1n : n✝ ≤ -1
n : ℤ
a✝ : n ≤ -1
hi : a i ^ n • X iᶜ ⊆ Y i
⊢ a i ^ (n - 1) • X iᶜ = (a i ^ n * (a i)⁻¹) • X iᶜ

tactic: inhabit ι
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: right
state_before: ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ (#ι) ∨ ∃ i, 3 ≤ (#H i)

tactic: use Inhabited.default
state_before: case h
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ ∃ i, 3 ≤ (#H i)

tactic: simp only
state_before: case h
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ (#H default)

tactic: rw [FreeGroup.freeGroupUnitEquivInt.cardinal_eq, Cardinal.mk_denumerable]
state_before: case h
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ (#FreeGroup Unit)

tactic: apply le_of_lt
state_before: case h
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ ℵ₀

tactic: exact nat_lt_aleph0 3
state_before: case h.a
ι : Type u_2
M : ι → Type ?u.1007390
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type ?u.1007401
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type ?u.1007419
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • Y iᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • X iᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 < ℵ₀