Theorem: CantorScheme.Disjoint.map_injective
File: Mathlib/Topology/MetricSpace/CantorScheme.lean

tactic: rintro ⟨x, hx⟩ ⟨y, hy⟩ hxy
state_before: β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
⊢ Injective (inducedMap A).snd
state_after: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ ⟨x, hx⟩ = ⟨y, hy⟩

tactic: refine Subtype.coe_injective (res_injective ?_)
state_before: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ ⟨x, hx⟩ = ⟨y, hy⟩
state_after: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res ((fun a => ↑a) ⟨x, hx⟩) = res ((fun a => ↑a) ⟨y, hy⟩)

tactic: dsimp
state_before: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res ((fun a => ↑a) ⟨x, hx⟩) = res ((fun a => ↑a) ⟨y, hy⟩)
state_after: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res x = res y

tactic: ext n : 1
state_before: case mk.mk
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res x = res y
state_after: case mk.mk.h
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
⊢ res x n = res y n

tactic: induction' n with n ih
state_before: case mk.mk.h
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
⊢ res x n = res y n
state_after: case mk.mk.h.zero
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res x 0 = res y 0

case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ res x (n + 1) = res y (n + 1)

tactic: simp only [res_succ, cons.injEq]
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ res x (n + 1) = res y (n + 1)
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ x n = y n ∧ res x n = res y n

tactic: refine ⟨?_, ih⟩
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ x n = y n ∧ res x n = res y n
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ x n = y n

tactic: contrapose hA
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
⊢ x n = y n
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ¬CantorScheme.Disjoint A

tactic: simp only [CantorScheme.Disjoint, _root_.Pairwise, Ne, not_forall, exists_prop]
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ¬CantorScheme.Disjoint A
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ∃ x x_1 x_2, ¬x_1 = x_2 ∧ ¬_root_.Disjoint (A (x_1 :: x)) (A (x_2 :: x))

tactic: refine ⟨res x n, _, _, hA, ?_⟩
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ∃ x x_1 x_2, ¬x_1 = x_2 ∧ ¬_root_.Disjoint (A (x_1 :: x)) (A (x_2 :: x))
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ¬_root_.Disjoint (A (x n :: res x n)) (A (y n :: res x n))

tactic: rw [not_disjoint_iff]
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ¬_root_.Disjoint (A (x n :: res x n)) (A (y n :: res x n))
state_after: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ∃ x_1 ∈ A (x n :: res x n), x_1 ∈ A (y n :: res x n)

tactic: refine ⟨(inducedMap A).2 ⟨x, hx⟩, ?_, ?_⟩
state_before: case mk.mk.h.succ
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ ∃ x_1 ∈ A (x n :: res x n), x_1 ∈ A (y n :: res x n)
state_after: case mk.mk.h.succ.refine_1
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (x n :: res x n)

case mk.mk.h.succ.refine_2
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (y n :: res x n)

tactic: rw [hxy, ih, ← res_succ]
state_before: case mk.mk.h.succ.refine_2
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (y n :: res x n)
state_after: case mk.mk.h.succ.refine_2
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨y, hy⟩ ∈ A (res y n.succ)

tactic: apply map_mem
state_before: case mk.mk.h.succ.refine_2
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨y, hy⟩ ∈ A (res y n.succ)
state_after: no goals

tactic: simp
state_before: case mk.mk.h.zero
β : Type u_1
α : Type u_2
A : List β → Set α
hA : CantorScheme.Disjoint A
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
⊢ res x 0 = res y 0
state_after: no goals

tactic: rw [← res_succ]
state_before: case mk.mk.h.succ.refine_1
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (x n :: res x n)
state_after: case mk.mk.h.succ.refine_1
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (res x n.succ)

tactic: apply map_mem
state_before: case mk.mk.h.succ.refine_1
β : Type u_1
α : Type u_2
A : List β → Set α
x : ℕ → β
hx : x ∈ (inducedMap A).fst
y : ℕ → β
hy : y ∈ (inducedMap A).fst
hxy : (inducedMap A).snd ⟨x, hx⟩ = (inducedMap A).snd ⟨y, hy⟩
n : ℕ
ih : res x n = res y n
hA : ¬x n = y n
⊢ (inducedMap A).snd ⟨x, hx⟩ ∈ A (res x n.succ)
state_after: no goals