[GOAL]
N : Type u_1
inst✝ : DecidableEq N
i : N
t₀ : ↑I
t : { j // j ≠ i } → ↑I
H : (t₀ = 0 ∨ t₀ = 1) ∨ t ∈ boundary { j // j ≠ i }
⊢ ↑(insertAt i) (t₀, t) ∈ boundary N
[PROOFSTEP]
obtain H | ⟨j, H⟩ := H
[GOAL]
case inl
N : Type u_1
inst✝ : DecidableEq N
i : N
t₀ : ↑I
t : { j // j ≠ i } → ↑I
H : t₀ = 0 ∨ t₀ = 1
⊢ ↑(insertAt i) (t₀, t) ∈ boundary N
[PROOFSTEP]
use i
[GOAL]
case h
N : Type u_1
inst✝ : DecidableEq N
i : N
t₀ : ↑I
t : { j // j ≠ i } → ↑I
H : t₀ = 0 ∨ t₀ = 1
⊢ ↑(insertAt i) (t₀, t) i = 0 ∨ ↑(insertAt i) (t₀, t) i = 1
[PROOFSTEP]
rwa [funSplitAt_symm_apply, dif_pos rfl]
[GOAL]
case inr.intro
N : Type u_1
inst✝ : DecidableEq N
i : N
t₀ : ↑I
t : { j // j ≠ i } → ↑I
j : { j // j ≠ i }
H : t j = 0 ∨ t j = 1
⊢ ↑(insertAt i) (t₀, t) ∈ boundary N
[PROOFSTEP]
use j
[GOAL]
case h
N : Type u_1
inst✝ : DecidableEq N
i : N
t₀ : ↑I
t : { j // j ≠ i } → ↑I
j : { j // j ≠ i }
H : t j = 0 ∨ t j = 1
⊢ ↑(insertAt i) (t₀, t) ↑j = 0 ∨ ↑(insertAt i) (t₀, t) ↑j = 1
[PROOFSTEP]
rwa [funSplitAt_symm_apply, dif_neg j.prop, Subtype.coe_eta]
[GOAL]
N : Type u_1
X : Type u_2
inst✝ : TopologicalSpace X
x : X
x✝² x✝¹ : ↑(Ω^ N X x)
f : (N → ↑I) → X
continuous_toFun✝¹ : Continuous f
property✝¹ : ContinuousMap.mk f ∈ Ω^ N X x
g : (N → ↑I) → X
continuous_toFun✝ : Continuous g
property✝ : ContinuousMap.mk g ∈ Ω^ N X x
x✝ :
  (fun f => ↑↑f) { val := ContinuousMap.mk f, property := property✝¹ } =
    (fun f => ↑↑f) { val := ContinuousMap.mk g, property := property✝ }
⊢ { val := ContinuousMap.mk f, property := property✝¹ } = { val := ContinuousMap.mk g, property := property✝ }
[PROOFSTEP]
congr
[GOAL]
N : Type u_1
X : Type u_2
inst✝ : TopologicalSpace X
x : X
f : ↑(Ω^ N X x)
g : (N → ↑I) → X
h : g = ↑f
⊢ ContinuousMap.mk g ∈ Ω^ N X x
[PROOFSTEP]
convert f.2
[GOAL]
N : Type u_1
X : Type u_2
inst✝ : TopologicalSpace X
x : X
f : ↑(Ω^ N X x)
g : (N → ↑I) → X
h : g = ↑f
⊢ copy f g h = f
[PROOFSTEP]
ext x
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝ : TopologicalSpace X
x✝ : X
f : ↑(Ω^ N X x✝)
g : (N → ↑I) → X
h : g = ↑f
x : N → ↑I
⊢ ↑(copy f g h) x = ↑f x
[PROOFSTEP]
exact congr_fun h x
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun t =>
        { val := ↑(ContinuousMap.curry (ContinuousMap.comp (↑p) (Homeomorph.toContinuousMap (Cube.insertAt i)))) t,
          property :=
            (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑↑p (↑(Cube.insertAt i) (t, y)) = x) })
      0 =
    const
[PROOFSTEP]
ext t
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
t : { j // j ≠ i } → ↑I
⊢ ↑(ContinuousMap.toFun
          (ContinuousMap.mk fun t =>
            { val := ↑(ContinuousMap.curry (ContinuousMap.comp (↑p) (Homeomorph.toContinuousMap (Cube.insertAt i)))) t,
              property :=
                (_ :
                  ∀ (y : { j // j ≠ i } → ↑I),
                    y ∈ Cube.boundary { j // j ≠ i } → ↑↑p (↑(Cube.insertAt i) (t, y)) = x) })
          0)
      t =
    ↑const t
[PROOFSTEP]
refine' p.property (Cube.insertAt i (0, t)) ⟨i, Or.inl _⟩
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
t : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) (0, t) i = 0
[PROOFSTEP]
simp
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun t =>
        { val := ↑(ContinuousMap.curry (ContinuousMap.comp (↑p) (Homeomorph.toContinuousMap (Cube.insertAt i)))) t,
          property :=
            (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑↑p (↑(Cube.insertAt i) (t, y)) = x) })
      1 =
    const
[PROOFSTEP]
ext t
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
t : { j // j ≠ i } → ↑I
⊢ ↑(ContinuousMap.toFun
          (ContinuousMap.mk fun t =>
            { val := ↑(ContinuousMap.curry (ContinuousMap.comp (↑p) (Homeomorph.toContinuousMap (Cube.insertAt i)))) t,
              property :=
                (_ :
                  ∀ (y : { j // j ≠ i } → ↑I),
                    y ∈ Cube.boundary { j // j ≠ i } → ↑↑p (↑(Cube.insertAt i) (t, y)) = x) })
          1)
      t =
    ↑const t
[PROOFSTEP]
refine' p.property (Cube.insertAt i (1, t)) ⟨i, Or.inr _⟩
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
t : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) (1, t) i = 1
[PROOFSTEP]
simp
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
⊢ Continuous Subtype.val
[PROOFSTEP]
continuity
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
⊢ ContinuousMap.comp (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap))
      (Homeomorph.toContinuousMap (Cube.splitAt i)) ∈
    Ω^ N X x
[PROOFSTEP]
rintro y ⟨j, Hj⟩
[GOAL]
case intro
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
y : N → ↑I
j : N
Hj : y j = 0 ∨ y j = 1
⊢ ↑(ContinuousMap.comp (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap))
          (Homeomorph.toContinuousMap (Cube.splitAt i)))
      y =
    x
[PROOFSTEP]
simp only [ContinuousMap.comp_apply, toContinuousMap_apply, funSplitAt_apply, ContinuousMap.uncurry_apply,
  ContinuousMap.coe_mk, Function.uncurry_apply_pair]
[GOAL]
case intro
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
y : N → ↑I
j : N
Hj : y j = 0 ∨ y j = 1
⊢ (↑↑(↑p.toContinuousMap (y i)) fun j => y ↑j) = x
[PROOFSTEP]
obtain rfl | Hne := eq_or_ne j i
[GOAL]
case intro.inl
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
y : N → ↑I
j : N
Hj : y j = 0 ∨ y j = 1
p : Ω (↑(Ω^ { j_1 // j_1 ≠ j } X x)) const
⊢ (↑↑(↑p.toContinuousMap (y j)) fun j_1 => y ↑j_1) = x
[PROOFSTEP]
cases' Hj with Hj Hj
[GOAL]
case intro.inl.inl
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
y : N → ↑I
j : N
p : Ω (↑(Ω^ { j_1 // j_1 ≠ j } X x)) const
Hj : y j = 0
⊢ (↑↑(↑p.toContinuousMap (y j)) fun j_1 => y ↑j_1) = x
[PROOFSTEP]
simp only [Hj, p.coe_toContinuousMap, p.source, p.target]
[GOAL]
case intro.inl.inr
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
y : N → ↑I
j : N
p : Ω (↑(Ω^ { j_1 // j_1 ≠ j } X x)) const
Hj : y j = 1
⊢ (↑↑(↑p.toContinuousMap (y j)) fun j_1 => y ↑j_1) = x
[PROOFSTEP]
simp only [Hj, p.coe_toContinuousMap, p.source, p.target]
[GOAL]
case intro.inl.inl
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
y : N → ↑I
j : N
p : Ω (↑(Ω^ { j_1 // j_1 ≠ j } X x)) const
Hj : y j = 0
⊢ (↑↑const fun j_1 => y ↑j_1) = x
[PROOFSTEP]
rfl
[GOAL]
case intro.inl.inr
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
y : N → ↑I
j : N
p : Ω (↑(Ω^ { j_1 // j_1 ≠ j } X x)) const
Hj : y j = 1
⊢ (↑↑const fun j_1 => y ↑j_1) = x
[PROOFSTEP]
rfl
[GOAL]
case intro.inr
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
y : N → ↑I
j : N
Hj : y j = 0 ∨ y j = 1
Hne : j ≠ i
⊢ (↑↑(↑p.toContinuousMap (y i)) fun j => y ↑j) = x
[PROOFSTEP]
exact GenLoop.boundary _ _ ⟨⟨j, Hne⟩, Hj⟩
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
⊢ toLoop i (fromLoop i p) = p
[PROOFSTEP]
simp_rw [toLoop, fromLoop, ContinuousMap.comp_assoc, toContinuousMap_comp_symm, ContinuousMap.comp_id]
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
⊢ {
      toContinuousMap :=
        ContinuousMap.mk fun t =>
          {
            val :=
              ↑(ContinuousMap.curry
                    (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                t,
            property :=
              (_ :
                (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                  (↑(ContinuousMap.curry
                        (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                    t)) },
      source' :=
        (_ :
          ContinuousMap.toFun
              (ContinuousMap.mk fun t =>
                {
                  val :=
                    ↑(ContinuousMap.curry
                          (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                      t,
                  property :=
                    (_ :
                      (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                        (↑(ContinuousMap.curry
                              (ContinuousMap.uncurry
                                (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                          t)) })
              0 =
            const),
      target' :=
        (_ :
          ContinuousMap.toFun
              (ContinuousMap.mk fun t =>
                {
                  val :=
                    ↑(ContinuousMap.curry
                          (ContinuousMap.uncurry (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                      t,
                  property :=
                    (_ :
                      (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                        (↑(ContinuousMap.curry
                              (ContinuousMap.uncurry
                                (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                          t)) })
              1 =
            const) } =
    p
[PROOFSTEP]
ext
[GOAL]
case a.h.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : Ω (↑(Ω^ { j // j ≠ i } X x)) const
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(↑{
              toContinuousMap :=
                ContinuousMap.mk fun t =>
                  {
                    val :=
                      ↑(ContinuousMap.curry
                            (ContinuousMap.uncurry
                              (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                        t,
                    property :=
                      (_ :
                        (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                          (↑(ContinuousMap.curry
                                (ContinuousMap.uncurry
                                  (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                            t)) },
              source' :=
                (_ :
                  ContinuousMap.toFun
                      (ContinuousMap.mk fun t =>
                        {
                          val :=
                            ↑(ContinuousMap.curry
                                  (ContinuousMap.uncurry
                                    (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                              t,
                          property :=
                            (_ :
                              (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                                (↑(ContinuousMap.curry
                                      (ContinuousMap.uncurry
                                        (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                                  t)) })
                      0 =
                    const),
              target' :=
                (_ :
                  ContinuousMap.toFun
                      (ContinuousMap.mk fun t =>
                        {
                          val :=
                            ↑(ContinuousMap.curry
                                  (ContinuousMap.uncurry
                                    (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                              t,
                          property :=
                            (_ :
                              (fun x_1 => x_1 ∈ Ω^ { j // j ≠ i } X x)
                                (↑(ContinuousMap.curry
                                      (ContinuousMap.uncurry
                                        (ContinuousMap.comp (ContinuousMap.mk Subtype.val) p.toContinuousMap)))
                                  t)) })
                      1 =
                    const) }
          x✝)
      y✝ =
    ↑(↑p x✝) y✝
[PROOFSTEP]
rfl
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
⊢ fromLoop i (toLoop i p) = p
[PROOFSTEP]
ext
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p : ↑(Ω^ N X x)
y✝ : N → ↑I
⊢ ↑(fromLoop i (toLoop i p)) y✝ = ↑p y✝
[PROOFSTEP]
exact congr_arg p (Equiv.apply_symm_apply _ _)
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
⊢ Homotopic p q → Path.Homotopic (toLoop i p) (toLoop i q)
[PROOFSTEP]
refine' Nonempty.map fun H => ⟨⟨⟨fun t => ⟨homotopyTo i H t, _⟩, _⟩, _, _⟩, _⟩
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
⊢ ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x
[PROOFSTEP]
rintro y ⟨i, iH⟩
[GOAL]
case refine'_1.intro
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ ↑(↑(homotopyTo i✝ H) t) y = x
[PROOFSTEP]
rw [homotopyTo_apply, H.eq_fst, p.2]
[GOAL]
case refine'_1.intro.a
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ ↑(Cube.insertAt i✝) (t.snd, y) ∈ Cube.boundary N
case refine'_1.intro.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ ↑(Cube.insertAt i✝) (t.snd, y) ∈ Cube.boundary N
[PROOFSTEP]
all_goals apply Cube.insertAt_boundary; right; exact ⟨i, iH⟩
[GOAL]
case refine'_1.intro.a
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ ↑(Cube.insertAt i✝) (t.snd, y) ∈ Cube.boundary N
[PROOFSTEP]
apply Cube.insertAt_boundary
[GOAL]
case refine'_1.intro.a.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ (t.snd = 0 ∨ t.snd = 1) ∨ y ∈ Cube.boundary { j // j ≠ i✝ }
[PROOFSTEP]
right
[GOAL]
case refine'_1.intro.a.H.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ y ∈ Cube.boundary { j // j ≠ i✝ }
[PROOFSTEP]
exact ⟨i, iH⟩
[GOAL]
case refine'_1.intro.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ ↑(Cube.insertAt i✝) (t.snd, y) ∈ Cube.boundary N
[PROOFSTEP]
apply Cube.insertAt_boundary
[GOAL]
case refine'_1.intro.hx.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ (t.snd = 0 ∨ t.snd = 1) ∨ y ∈ Cube.boundary { j // j ≠ i✝ }
[PROOFSTEP]
right
[GOAL]
case refine'_1.intro.hx.H.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i✝ : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t : ↑I × ↑I
y : { j // j ≠ i✝ } → ↑I
i : { j // j ≠ i✝ }
iH : y i = 0 ∨ y i = 1
⊢ y ∈ Cube.boundary { j // j ≠ i✝ }
[PROOFSTEP]
exact ⟨i, iH⟩
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ Continuous fun t =>
    { val := ↑(homotopyTo i H) t,
      property := (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) }
[PROOFSTEP]
continuity
[GOAL]
case refine'_3
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (0, x_1) =
      ↑(toLoop i p).toContinuousMap x_1
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left := ?refine'_3, map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left := ?refine'_3, map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
iterate 2 intro; ext; erw [homotopyTo_apply, toLoop_apply]; swap
[GOAL]
case refine'_3
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (0, x_1) =
      ↑(toLoop i p).toContinuousMap x_1
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left := ?refine'_3, map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left := ?refine'_3, map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
intro
[GOAL]
case refine'_3
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun t =>
        { val := ↑(homotopyTo i H) t,
          property :=
            (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
      (0, x✝) =
    ↑(toLoop i p).toContinuousMap x✝
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
ext
[GOAL]
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(ContinuousMap.toFun
          (ContinuousMap.mk fun t =>
            { val := ↑(homotopyTo i H) t,
              property :=
                (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
          (0, x✝))
      y✝ =
    ↑(↑(toLoop i p).toContinuousMap x✝) y✝
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
erw [homotopyTo_apply, toLoop_apply]
[GOAL]
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
swap
[GOAL]
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (x_1 : ↑I),
    ContinuousMap.toFun
        (ContinuousMap.mk fun t =>
          { val := ↑(homotopyTo i H) t,
            property :=
              (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
        (1, x_1) =
      ↑(toLoop i q).toContinuousMap x_1
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left := ?refine'_4 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
intro
[GOAL]
case refine'_4
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun t =>
        { val := ↑(homotopyTo i H) t,
          property :=
            (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
      (1, x✝) =
    ↑(toLoop i q).toContinuousMap x✝
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
ext
[GOAL]
case refine'_4.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(ContinuousMap.toFun
          (ContinuousMap.mk fun t =>
            { val := ↑(homotopyTo i H) t,
              property :=
                (_ : ∀ (y : { j // j ≠ i } → ↑I), y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
          (1, x✝))
      y✝ =
    ↑(↑(toLoop i q).toContinuousMap x✝) y✝
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
erw [homotopyTo_apply, toLoop_apply]
[GOAL]
case refine'_4.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((1, x✝).fst, ↑(Cube.insertAt i) ((1, x✝).snd, y✝)) = ↑q (↑(Cube.insertAt i) (x✝, y✝))
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property := (_ : ↑(homotopyTo i H) t ∈ Ω^ { j // j ≠ i } X x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
swap
[GOAL]
case refine'_3.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((0, x✝).fst, ↑(Cube.insertAt i) ((0, x✝).snd, y✝)) = ↑p (↑(Cube.insertAt i) (x✝, y✝))
[PROOFSTEP]
apply H.apply_zero
[GOAL]
case refine'_4.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
x✝ : ↑I
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((1, x✝).fst, ↑(Cube.insertAt i) ((1, x✝).snd, y✝)) = ↑q (↑(Cube.insertAt i) (x✝, y✝))
[PROOFSTEP]
apply H.apply_one
[GOAL]
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
⊢ ∀ (t x_1 : ↑I),
    x_1 ∈ {0, 1} →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property :=
                                      (_ :
                                        ∀ (y : { j // j ≠ i } → ↑I),
                                          y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property :=
                                      (_ :
                                        ∀ (y : { j // j ≠ i } → ↑I),
                                          y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i p).toContinuousMap x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  {
                      toContinuousMap :=
                        ContinuousMap.mk fun t =>
                          { val := ↑(homotopyTo i H) t,
                            property :=
                              (_ :
                                ∀ (y : { j // j ≠ i } → ↑I),
                                  y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                      map_zero_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property :=
                                      (_ :
                                        ∀ (y : { j // j ≠ i } → ↑I),
                                          y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                                (0, x_3) =
                              ↑(toLoop i p).toContinuousMap x_3),
                      map_one_left :=
                        (_ :
                          ∀ (x_3 : ↑I),
                            ContinuousMap.toFun
                                (ContinuousMap.mk fun t =>
                                  { val := ↑(homotopyTo i H) t,
                                    property :=
                                      (_ :
                                        ∀ (y : { j // j ≠ i } → ↑I),
                                          y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                                (1, x_3) =
                              ↑(toLoop i q).toContinuousMap x_3) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑(toLoop i q).toContinuousMap x_1
[PROOFSTEP]
intro t y yH
[GOAL]
case refine'_5
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
⊢ ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              {
                  toContinuousMap :=
                    ContinuousMap.mk fun t =>
                      { val := ↑(homotopyTo i H) t,
                        property :=
                          (_ :
                            ∀ (y : { j // j ≠ i } → ↑I),
                              y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                  map_zero_left :=
                    (_ :
                      ∀ (x_2 : ↑I),
                        ContinuousMap.toFun
                            (ContinuousMap.mk fun t =>
                              { val := ↑(homotopyTo i H) t,
                                property :=
                                  (_ :
                                    ∀ (y : { j // j ≠ i } → ↑I),
                                      y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                            (0, x_2) =
                          ↑(toLoop i p).toContinuousMap x_2),
                  map_one_left :=
                    (_ :
                      ∀ (x_2 : ↑I),
                        ContinuousMap.toFun
                            (ContinuousMap.mk fun t =>
                              { val := ↑(homotopyTo i H) t,
                                property :=
                                  (_ :
                                    ∀ (y : { j // j ≠ i } → ↑I),
                                      y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                            (1, x_2) =
                          ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
              (t, x_1))
        y =
      ↑(toLoop i p).toContinuousMap y ∧
    ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              {
                  toContinuousMap :=
                    ContinuousMap.mk fun t =>
                      { val := ↑(homotopyTo i H) t,
                        property :=
                          (_ :
                            ∀ (y : { j // j ≠ i } → ↑I),
                              y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                  map_zero_left :=
                    (_ :
                      ∀ (x_2 : ↑I),
                        ContinuousMap.toFun
                            (ContinuousMap.mk fun t =>
                              { val := ↑(homotopyTo i H) t,
                                property :=
                                  (_ :
                                    ∀ (y : { j // j ≠ i } → ↑I),
                                      y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                            (0, x_2) =
                          ↑(toLoop i p).toContinuousMap x_2),
                  map_one_left :=
                    (_ :
                      ∀ (x_2 : ↑I),
                        ContinuousMap.toFun
                            (ContinuousMap.mk fun t =>
                              { val := ↑(homotopyTo i H) t,
                                property :=
                                  (_ :
                                    ∀ (y : { j // j ≠ i } → ↑I),
                                      y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                            (1, x_2) =
                          ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
              (t, x_1))
        y =
      ↑(toLoop i q).toContinuousMap y
[PROOFSTEP]
constructor
[GOAL]
case refine'_5.left
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
⊢ ↑(ContinuousMap.mk fun x_1 =>
          ContinuousMap.toFun
            {
                toContinuousMap :=
                  ContinuousMap.mk fun t =>
                    { val := ↑(homotopyTo i H) t,
                      property :=
                        (_ :
                          ∀ (y : { j // j ≠ i } → ↑I),
                            y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                map_zero_left :=
                  (_ :
                    ∀ (x_2 : ↑I),
                      ContinuousMap.toFun
                          (ContinuousMap.mk fun t =>
                            { val := ↑(homotopyTo i H) t,
                              property :=
                                (_ :
                                  ∀ (y : { j // j ≠ i } → ↑I),
                                    y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                          (0, x_2) =
                        ↑(toLoop i p).toContinuousMap x_2),
                map_one_left :=
                  (_ :
                    ∀ (x_2 : ↑I),
                      ContinuousMap.toFun
                          (ContinuousMap.mk fun t =>
                            { val := ↑(homotopyTo i H) t,
                              property :=
                                (_ :
                                  ∀ (y : { j // j ≠ i } → ↑I),
                                    y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                          (1, x_2) =
                        ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
            (t, x_1))
      y =
    ↑(toLoop i p).toContinuousMap y
[PROOFSTEP]
ext
[GOAL]
case refine'_5.right
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
⊢ ↑(ContinuousMap.mk fun x_1 =>
          ContinuousMap.toFun
            {
                toContinuousMap :=
                  ContinuousMap.mk fun t =>
                    { val := ↑(homotopyTo i H) t,
                      property :=
                        (_ :
                          ∀ (y : { j // j ≠ i } → ↑I),
                            y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                map_zero_left :=
                  (_ :
                    ∀ (x_2 : ↑I),
                      ContinuousMap.toFun
                          (ContinuousMap.mk fun t =>
                            { val := ↑(homotopyTo i H) t,
                              property :=
                                (_ :
                                  ∀ (y : { j // j ≠ i } → ↑I),
                                    y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                          (0, x_2) =
                        ↑(toLoop i p).toContinuousMap x_2),
                map_one_left :=
                  (_ :
                    ∀ (x_2 : ↑I),
                      ContinuousMap.toFun
                          (ContinuousMap.mk fun t =>
                            { val := ↑(homotopyTo i H) t,
                              property :=
                                (_ :
                                  ∀ (y : { j // j ≠ i } → ↑I),
                                    y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                          (1, x_2) =
                        ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
            (t, x_1))
      y =
    ↑(toLoop i q).toContinuousMap y
[PROOFSTEP]
ext
[GOAL]
case refine'_5.left.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(↑(ContinuousMap.mk fun x_1 =>
              ContinuousMap.toFun
                {
                    toContinuousMap :=
                      ContinuousMap.mk fun t =>
                        { val := ↑(homotopyTo i H) t,
                          property :=
                            (_ :
                              ∀ (y : { j // j ≠ i } → ↑I),
                                y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                    map_zero_left :=
                      (_ :
                        ∀ (x_2 : ↑I),
                          ContinuousMap.toFun
                              (ContinuousMap.mk fun t =>
                                { val := ↑(homotopyTo i H) t,
                                  property :=
                                    (_ :
                                      ∀ (y : { j // j ≠ i } → ↑I),
                                        y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                              (0, x_2) =
                            ↑(toLoop i p).toContinuousMap x_2),
                    map_one_left :=
                      (_ :
                        ∀ (x_2 : ↑I),
                          ContinuousMap.toFun
                              (ContinuousMap.mk fun t =>
                                { val := ↑(homotopyTo i H) t,
                                  property :=
                                    (_ :
                                      ∀ (y : { j // j ≠ i } → ↑I),
                                        y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                              (1, x_2) =
                            ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
                (t, x_1))
          y)
      y✝ =
    ↑(↑(toLoop i p).toContinuousMap y) y✝
[PROOFSTEP]
erw [homotopyTo_apply]
[GOAL]
case refine'_5.right.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(↑(ContinuousMap.mk fun x_1 =>
              ContinuousMap.toFun
                {
                    toContinuousMap :=
                      ContinuousMap.mk fun t =>
                        { val := ↑(homotopyTo i H) t,
                          property :=
                            (_ :
                              ∀ (y : { j // j ≠ i } → ↑I),
                                y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) },
                    map_zero_left :=
                      (_ :
                        ∀ (x_2 : ↑I),
                          ContinuousMap.toFun
                              (ContinuousMap.mk fun t =>
                                { val := ↑(homotopyTo i H) t,
                                  property :=
                                    (_ :
                                      ∀ (y : { j // j ≠ i } → ↑I),
                                        y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                              (0, x_2) =
                            ↑(toLoop i p).toContinuousMap x_2),
                    map_one_left :=
                      (_ :
                        ∀ (x_2 : ↑I),
                          ContinuousMap.toFun
                              (ContinuousMap.mk fun t =>
                                { val := ↑(homotopyTo i H) t,
                                  property :=
                                    (_ :
                                      ∀ (y : { j // j ≠ i } → ↑I),
                                        y ∈ Cube.boundary { j // j ≠ i } → ↑(↑(homotopyTo i H) t) y = x) })
                              (1, x_2) =
                            ↑(toLoop i q).toContinuousMap x_2) }.toContinuousMap
                (t, x_1))
          y)
      y✝ =
    ↑(↑(toLoop i q).toContinuousMap y) y✝
[PROOFSTEP]
erw [homotopyTo_apply]
[GOAL]
case refine'_5.left.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((t, y).fst, ↑(Cube.insertAt i) ((t, y).snd, y✝)) = ↑(↑(toLoop i p).toContinuousMap y) y✝
case refine'_5.right.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((t, y).fst, ↑(Cube.insertAt i) ((t, y).snd, y✝)) = ↑(↑(toLoop i q).toContinuousMap y) y✝
[PROOFSTEP]
apply H.eq_fst
[GOAL]
case refine'_5.left.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
case refine'_5.right.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((t, y).fst, ↑(Cube.insertAt i) ((t, y).snd, y✝)) = ↑(↑(toLoop i q).toContinuousMap y) y✝
[PROOFSTEP]
on_goal 2 => apply H.eq_snd
[GOAL]
case refine'_5.left.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
case refine'_5.right.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((t, y).fst, ↑(Cube.insertAt i) ((t, y).snd, y✝)) = ↑(↑(toLoop i q).toContinuousMap y) y✝
[PROOFSTEP]
on_goal 2 => apply H.eq_snd
[GOAL]
case refine'_5.right.H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑H ((t, y).fst, ↑(Cube.insertAt i) ((t, y).snd, y✝)) = ↑(↑(toLoop i q).toContinuousMap y) y✝
[PROOFSTEP]
apply H.eq_snd
[GOAL]
case refine'_5.left.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
case refine'_5.right.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
[PROOFSTEP]
all_goals use i; rw [funSplitAt_symm_apply, dif_pos rfl]; exact yH
[GOAL]
case refine'_5.left.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
[PROOFSTEP]
use i
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) i = 0 ∨ ↑(Cube.insertAt i) ((t, y).snd, y✝) i = 1
[PROOFSTEP]
rw [funSplitAt_symm_apply, dif_pos rfl]
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ((t, y).snd, y✝).fst = 0 ∨ ((t, y).snd, y✝).fst = 1
[PROOFSTEP]
exact yH
[GOAL]
case refine'_5.right.H.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) ∈ Cube.boundary N
[PROOFSTEP]
use i
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ↑(Cube.insertAt i) ((t, y).snd, y✝) i = 0 ∨ ↑(Cube.insertAt i) ((t, y).snd, y✝) i = 1
[PROOFSTEP]
rw [funSplitAt_symm_apply, dif_pos rfl]
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑p) (↑q) (Cube.boundary N)
t y : ↑I
yH : y ∈ {0, 1}
y✝ : { j // j ≠ i } → ↑I
⊢ ((t, y).snd, y✝).fst = 0 ∨ ((t, y).snd, y✝).fst = 1
[PROOFSTEP]
exact yH
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ Continuous Subtype.val
[PROOFSTEP]
continuity
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
⊢ Path.Homotopic (toLoop i p) (toLoop i q) → Homotopic p q
[PROOFSTEP]
refine' Nonempty.map fun H => ⟨⟨homotopyFrom i H, _, _⟩, _⟩
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (0, x_1) = ↑↑p x_1
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (1, x_1) = ↑↑q x_1
case refine'_3
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (t : ↑I) (x_1 : N → ↑I),
    x_1 ∈ Cube.boundary N →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                      map_one_left := ?refine'_2 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑p x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                      map_one_left := ?refine'_2 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑q x_1
[PROOFSTEP]
pick_goal 3
[GOAL]
case refine'_3
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (t : ↑I) (x_1 : N → ↑I),
    x_1 ∈ Cube.boundary N →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                      map_one_left := ?refine'_2 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑p x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                      map_one_left := ?refine'_2 }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑q x_1
[PROOFSTEP]
rintro t y ⟨j, jH⟩
[GOAL]
case refine'_3.intro
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
⊢ ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                  map_one_left := ?refine'_2 }.toContinuousMap
              (t, x_1))
        y =
      ↑↑p y ∧
    ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := homotopyFrom i H, map_zero_left := ?refine'_1,
                  map_one_left := ?refine'_2 }.toContinuousMap
              (t, x_1))
        y =
      ↑↑q y
[PROOFSTEP]
erw [homotopyFrom_apply]
[GOAL]
case refine'_3.intro
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = ↑↑p y ∧
    (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = ↑↑q y
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (0, x_1) = ↑↑p x_1
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (1, x_1) = ↑↑q x_1
[PROOFSTEP]
obtain rfl | h := eq_or_ne j i
[GOAL]
case refine'_3.intro.inl
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑p y ∧
    (↑↑(↑H ((t, y).fst, Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑q y
[PROOFSTEP]
constructor
[GOAL]
case refine'_3.intro.inl.left
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑p y
[PROOFSTEP]
rw [H.eq_fst]
[GOAL]
case refine'_3.intro.inl.left
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ (↑↑(↑(toLoop j p).toContinuousMap (Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑p y
case refine'_3.intro.inl.left.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ Prod.snd (t, y) j ∈ {0, 1}
[PROOFSTEP]
exacts [congr_arg p ((Cube.splitAt j).left_inv _), jH]
[GOAL]
case refine'_3.intro.inl.right
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑q y
[PROOFSTEP]
rw [H.eq_snd]
[GOAL]
case refine'_3.intro.inl.right
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ (↑↑(↑(toLoop j q).toContinuousMap (Prod.snd (t, y) j)) fun j_1 => Prod.snd (t, y) ↑j_1) = ↑↑q y
case refine'_3.intro.inl.right.hx
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
p q : ↑(Ω^ N X x)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
H : Path.Homotopy (toLoop j p) (toLoop j q)
⊢ Prod.snd (t, y) j ∈ {0, 1}
[PROOFSTEP]
exacts [congr_arg q ((Cube.splitAt j).left_inv _), jH]
[GOAL]
case refine'_3.intro.inr
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = ↑↑p y ∧
    (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = ↑↑q y
[PROOFSTEP]
rw [p.2 _ ⟨j, jH⟩, q.2 _ ⟨j, jH⟩]
[GOAL]
case refine'_3.intro.inr
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = x ∧
    (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = x
[PROOFSTEP]
constructor
[GOAL]
case refine'_3.intro.inr.left
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = x
[PROOFSTEP]
apply boundary
[GOAL]
case refine'_3.intro.inr.left.a
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (fun j => Prod.snd (t, y) ↑j) ∈ Cube.boundary { j // ¬j = i }
[PROOFSTEP]
exact
  ⟨⟨j, h⟩, jH⟩
    /- porting note: the following is indented two spaces more than it should be due to
          strange behavior of `erw` -/
[GOAL]
case refine'_3.intro.inr.right
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (↑↑(↑H ((t, y).fst, Prod.snd (t, y) i)) fun j => Prod.snd (t, y) ↑j) = x
[PROOFSTEP]
apply boundary
[GOAL]
case refine'_3.intro.inr.right.a
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
t : ↑I
y : N → ↑I
j : N
jH : y j = 0 ∨ y j = 1
h : j ≠ i
⊢ (fun j => Prod.snd (t, y) ↑j) ∈ Cube.boundary { j // ¬j = i }
[PROOFSTEP]
exact
  ⟨⟨j, h⟩, jH⟩
    /- porting note: the following is indented two spaces more than it should be due to
          strange behavior of `erw` -/
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (0, x_1) = ↑↑p x_1
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (1, x_1) = ↑↑q x_1
[PROOFSTEP]
all_goals
  intro
  apply (homotopyFrom_apply _ _ _).trans
  first
  | rw [H.apply_zero]
  | rw [H.apply_one]
  first
  | apply congr_arg p
  | apply congr_arg q
  apply (Cube.splitAt i).left_inv
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (0, x_1) = ↑↑p x_1
[PROOFSTEP]
intro
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ ContinuousMap.toFun (homotopyFrom i H) (0, x✝) = ↑↑p x✝
[PROOFSTEP]
apply (homotopyFrom_apply _ _ _).trans
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑H ((0, x✝).fst, Prod.snd (0, x✝) i)) fun j => Prod.snd (0, x✝) ↑j) = ↑↑p x✝
[PROOFSTEP]
first
| rw [H.apply_zero]
| rw [H.apply_one]
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑H ((0, x✝).fst, Prod.snd (0, x✝) i)) fun j => Prod.snd (0, x✝) ↑j) = ↑↑p x✝
[PROOFSTEP]
rw [H.apply_zero]
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑(toLoop i p).toContinuousMap (Prod.snd (0, x✝) i)) fun j => Prod.snd (0, x✝) ↑j) = ↑↑p x✝
[PROOFSTEP]
first
| apply congr_arg p
| apply congr_arg q
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑(toLoop i p).toContinuousMap (Prod.snd (0, x✝) i)) fun j => Prod.snd (0, x✝) ↑j) = ↑↑p x✝
[PROOFSTEP]
apply congr_arg p
[GOAL]
case refine'_1
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ ↑(Homeomorph.toContinuousMap (Cube.insertAt i)) (Prod.snd (0, x✝) i, fun j => Prod.snd (0, x✝) ↑j) = x✝
[PROOFSTEP]
apply (Cube.splitAt i).left_inv
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
⊢ ∀ (x_1 : N → ↑I), ContinuousMap.toFun (homotopyFrom i H) (1, x_1) = ↑↑q x_1
[PROOFSTEP]
intro
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ ContinuousMap.toFun (homotopyFrom i H) (1, x✝) = ↑↑q x✝
[PROOFSTEP]
apply (homotopyFrom_apply _ _ _).trans
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑H ((1, x✝).fst, Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
first
| rw [H.apply_zero]
| rw [H.apply_one]
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑H ((1, x✝).fst, Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
rw [H.apply_zero]
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑H ((1, x✝).fst, Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
rw [H.apply_one]
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑(toLoop i q).toContinuousMap (Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
first
| apply congr_arg p
| apply congr_arg q
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑(toLoop i q).toContinuousMap (Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
apply congr_arg p
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ (↑↑(↑(toLoop i q).toContinuousMap (Prod.snd (1, x✝) i)) fun j => Prod.snd (1, x✝) ↑j) = ↑↑q x✝
[PROOFSTEP]
apply congr_arg q
[GOAL]
case refine'_2
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
p q : ↑(Ω^ N X x)
H : Path.Homotopy (toLoop i p) (toLoop i q)
x✝ : N → ↑I
⊢ ↑(Homeomorph.toContinuousMap (Cube.insertAt i)) (Prod.snd (1, x✝) i, fun j => Prod.snd (1, x✝) ↑j) = x✝
[PROOFSTEP]
apply (Cube.splitAt i).left_inv
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
⊢ (fun t =>
      if ↑(t i) ≤ 1 / 2 then ↑f (Function.update t i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(t i))))
      else ↑g (Function.update t i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(t i) - 1)))) =
    ↑(fromLoop i (Path.trans (toLoop i f) (toLoop i g)))
[PROOFSTEP]
ext1
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ (if ↑(x✝ i) ≤ 1 / 2 then ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
    else ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))) =
    ↑(fromLoop i (Path.trans (toLoop i f) (toLoop i g))) x✝
[PROOFSTEP]
symm
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ ↑(fromLoop i (Path.trans (toLoop i f) (toLoop i g))) x✝ =
    if ↑(x✝ i) ≤ 1 / 2 then ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
    else ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
[PROOFSTEP]
dsimp only [Path.trans, fromLoop, Path.coe_mk_mk, Function.comp_apply, mk_apply, ContinuousMap.comp_apply,
  toContinuousMap_apply, funSplitAt_apply, ContinuousMap.uncurry_apply, ContinuousMap.coe_mk,
  Function.uncurry_apply_pair]
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ (↑↑(if ↑(x✝ i) ≤ 1 / 2 then Path.extend (toLoop i f) (2 * ↑(x✝ i)) else Path.extend (toLoop i g) (2 * ↑(x✝ i) - 1))
      fun j => x✝ ↑j) =
    if ↑(x✝ i) ≤ 1 / 2 then ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
    else ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
[PROOFSTEP]
split_ifs
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ↑(x✝ i) ≤ 1 / 2
⊢ (↑↑(Path.extend (toLoop i f) (2 * ↑(x✝ i))) fun j => x✝ ↑j) =
    ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ¬↑(x✝ i) ≤ 1 / 2
⊢ (↑↑(Path.extend (toLoop i g) (2 * ↑(x✝ i) - 1)) fun j => x✝ ↑j) =
    ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
[PROOFSTEP]
change f _ = _
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ↑(x✝ i) ≤ 1 / 2
⊢ ↑f
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i)), fun j => x✝ ↑j)) =
    ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ¬↑(x✝ i) ≤ 1 / 2
⊢ (↑↑(Path.extend (toLoop i g) (2 * ↑(x✝ i) - 1)) fun j => x✝ ↑j) =
    ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
[PROOFSTEP]
swap
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ¬↑(x✝ i) ≤ 1 / 2
⊢ (↑↑(Path.extend (toLoop i g) (2 * ↑(x✝ i) - 1)) fun j => x✝ ↑j) =
    ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ↑(x✝ i) ≤ 1 / 2
⊢ ↑f
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i)), fun j => x✝ ↑j)) =
    ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
[PROOFSTEP]
change g _ = _
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ¬↑(x✝ i) ≤ 1 / 2
⊢ ↑g
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i) - 1), fun j => x✝ ↑j)) =
    ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ↑(x✝ i) ≤ 1 / 2
⊢ ↑f
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i)), fun j => x✝ ↑j)) =
    ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
[PROOFSTEP]
all_goals congr 1
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ¬↑(x✝ i) ≤ 1 / 2
⊢ ↑g
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i) - 1), fun j => x✝ ↑j)) =
    ↑g (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i) - 1)))
[PROOFSTEP]
congr 1
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f g : ↑(Ω^ N X x)
x✝ : N → ↑I
h✝ : ↑(x✝ i) ≤ 1 / 2
⊢ ↑f
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (Set.projIcc 0 1 Path.extend.proof_1 (2 * ↑(x✝ i)), fun j => x✝ ↑j)) =
    ↑f (Function.update x✝ i (Set.projIcc 0 1 (_ : 0 ≤ 1) (2 * ↑(x✝ i))))
[PROOFSTEP]
congr 1
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f : ↑(Ω^ N X x)
⊢ (fun t => ↑f fun j => if j = i then σ (t i) else t j) = ↑(fromLoop i (Path.symm (toLoop i f)))
[PROOFSTEP]
ext1
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ (↑f fun j => if j = i then σ (x✝ i) else x✝ j) = ↑(fromLoop i (Path.symm (toLoop i f))) x✝
[PROOFSTEP]
change _ = f _
[GOAL]
case h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ (↑f fun j => if j = i then σ (x✝ i) else x✝ j) =
    ↑f
      (↑(Homeomorph.toContinuousMap (Cube.insertAt i))
        (σ (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝).fst,
          (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝).snd))
[PROOFSTEP]
congr
[GOAL]
case h.h.e_6.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f : ↑(Ω^ N X x)
x✝ : N → ↑I
⊢ (fun j => if j = i then σ (x✝ i) else x✝ j) =
    ↑(Homeomorph.toContinuousMap (Cube.insertAt i))
      (σ (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝).fst,
        (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝).snd)
[PROOFSTEP]
ext1
[GOAL]
case h.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
f : ↑(Ω^ N X x)
x✝¹ : N → ↑I
x✝ : N
⊢ (if x✝ = i then σ (x✝¹ i) else x✝¹ x✝) =
    ↑(Homeomorph.toContinuousMap (Cube.insertAt i))
      (σ (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝¹).fst,
        (↑(Homeomorph.toContinuousMap (Cube.splitAt i)) x✝¹).snd)
      x✝
[PROOFSTEP]
simp
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
⊢ transAt i (transAt j a b) (transAt j c d) = transAt j (transAt i a c) (transAt i b d)
[PROOFSTEP]
ext
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
⊢ ↑(transAt i (transAt j a b) (transAt j c d)) y✝ = ↑(transAt j (transAt i a c) (transAt i b d)) y✝
[PROOFSTEP]
simp_rw [transAt, coe_copy, Function.update_apply, if_neg h, if_neg h.symm]
[GOAL]
case H
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
⊢ (if ↑(y✝ i) ≤ 1 / 2 then
      if ↑(y✝ j) ≤ 1 / 2 then
        ↑a
          (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))))
      else
        ↑b
          (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)))
    else
      if ↑(y✝ j) ≤ 1 / 2 then
        ↑c
          (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))))
      else
        ↑d
          (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)))) =
    if ↑(y✝ j) ≤ 1 / 2 then
      if ↑(y✝ i) ≤ 1 / 2 then
        ↑a
          (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))))
      else
        ↑c
          (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)))
    else
      if ↑(y✝ i) ≤ 1 / 2 then
        ↑b
          (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))))
      else
        ↑d
          (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
            (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)))
[PROOFSTEP]
split_ifs
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
⊢ ↑a
      (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) =
    ↑a
      (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))))
[PROOFSTEP]
congr 1
[GOAL]
case pos.h.e_6.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))) =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))
[PROOFSTEP]
ext1
[GOAL]
case pos.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))) x✝ =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))) x✝
[PROOFSTEP]
simp only [Function.update, eq_rec_constant, dite_eq_ite]
[GOAL]
case pos.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ (if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))
    else if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)) else y✝ x✝) =
    if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))
    else if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)) else y✝ x✝
[PROOFSTEP]
apply ite_ite_comm
[GOAL]
case pos.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ x✝ = j → ¬x✝ = i
[PROOFSTEP]
rintro rfl
[GOAL]
case pos.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
x✝ : N
h : i ≠ x✝
h✝ : ↑(y✝ x✝) ≤ 1 / 2
⊢ ¬x✝ = i
[PROOFSTEP]
exact h.symm
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
⊢ ↑b
      (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) =
    ↑b
      (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))))
[PROOFSTEP]
congr 1
[GOAL]
case neg.h.e_6.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)) =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))
[PROOFSTEP]
ext1
[GOAL]
case neg.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)) x✝ =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))) x✝
[PROOFSTEP]
simp only [Function.update, eq_rec_constant, dite_eq_ite]
[GOAL]
case neg.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ (if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)
    else if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i)) else y✝ x✝) =
    if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i))
    else if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1) else y✝ x✝
[PROOFSTEP]
apply ite_ite_comm
[GOAL]
case neg.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ x✝ = j → ¬x✝ = i
[PROOFSTEP]
rintro rfl
[GOAL]
case neg.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ↑(y✝ i) ≤ 1 / 2
x✝ : N
h : i ≠ x✝
h✝ : ¬↑(y✝ x✝) ≤ 1 / 2
⊢ ¬x✝ = i
[PROOFSTEP]
exact h.symm
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
⊢ ↑c
      (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) =
    ↑c
      (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)))
[PROOFSTEP]
congr 1
[GOAL]
case pos.h.e_6.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))) =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))
[PROOFSTEP]
ext1
[GOAL]
case pos.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))) x✝ =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)) x✝
[PROOFSTEP]
simp only [Function.update, eq_rec_constant, dite_eq_ite]
[GOAL]
case pos.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ (if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j))
    else if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1) else y✝ x✝) =
    if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)
    else if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j)) else y✝ x✝
[PROOFSTEP]
apply ite_ite_comm
[GOAL]
case pos.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ x✝ = j → ¬x✝ = i
[PROOFSTEP]
rintro rfl
[GOAL]
case pos.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
x✝ : N
h : i ≠ x✝
h✝ : ↑(y✝ x✝) ≤ 1 / 2
⊢ ¬x✝ = i
[PROOFSTEP]
exact h.symm
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
⊢ ↑d
      (Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) =
    ↑d
      (Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
        (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)))
[PROOFSTEP]
congr 1
[GOAL]
case neg.h.e_6.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)) =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))
[PROOFSTEP]
ext1
[GOAL]
case neg.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ Function.update (Function.update y✝ i (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1))) j
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)) x✝ =
    Function.update (Function.update y✝ j (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1))) i
      (Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)) x✝
[PROOFSTEP]
simp only [Function.update, eq_rec_constant, dite_eq_ite]
[GOAL]
case neg.h.e_6.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ (if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1)
    else if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1) else y✝ x✝) =
    if x✝ = i then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ i) - 1)
    else if x✝ = j then Set.projIcc 0 1 transAt.proof_2 (2 * ↑(y✝ j) - 1) else y✝ x✝
[PROOFSTEP]
apply ite_ite_comm
[GOAL]
case neg.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i ≠ j
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
h✝ : ¬↑(y✝ j) ≤ 1 / 2
x✝ : N
⊢ x✝ = j → ¬x✝ = i
[PROOFSTEP]
rintro rfl
[GOAL]
case neg.h.e_6.h.h.h
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
a b c d : ↑(Ω^ N X x)
y✝ : N → ↑I
h✝¹ : ¬↑(y✝ i) ≤ 1 / 2
x✝ : N
h : i ≠ x✝
h✝ : ¬↑(y✝ x✝) ≤ 1 / 2
⊢ ¬x✝ = i
[PROOFSTEP]
exact h.symm
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
⊢ HomotopyGroup N X x ≃ FundamentalGroup (↑(Ω^ { j // j ≠ i } X x)) const
[PROOFSTEP]
refine' Equiv.trans _ (CategoryTheory.Groupoid.isoEquivHom _ _).symm
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
⊢ HomotopyGroup N X x ≃ (const ⟶ const)
[PROOFSTEP]
apply Quotient.congr (loopHomeo i).toEquiv
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i : N
⊢ ∀ (a₁ a₂ : ↑(Ω^ N X x)), Setoid.r a₁ a₂ ↔ Setoid.r (↑(loopHomeo i).toEquiv a₁) (↑(loopHomeo i).toEquiv a₂)
[PROOFSTEP]
exact fun p q => ⟨homotopicTo i, homotopicFrom i⟩
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.533751
x : X
inst✝ : IsEmpty N
f : ↑(Ω^ N X x)
⊢ (fun y =>
        { val := ContinuousMap.const (N → ↑I) y,
          property := (_ : ∀ (x_1 : N → ↑I), x_1 ∈ Cube.boundary N → ↑(ContinuousMap.const (N → ↑I) y) x_1 = x) })
      ((fun f => ↑f 0) f) =
    f
[PROOFSTEP]
ext
[GOAL]
case H
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.533751
x : X
inst✝ : IsEmpty N
f : ↑(Ω^ N X x)
y✝ : N → ↑I
⊢ ↑((fun y =>
            { val := ContinuousMap.const (N → ↑I) y,
              property := (_ : ∀ (x_1 : N → ↑I), x_1 ∈ Cube.boundary N → ↑(ContinuousMap.const (N → ↑I) y) x_1 = x) })
          ((fun f => ↑f 0) f))
      y✝ =
    ↑f y✝
[PROOFSTEP]
exact congr_arg f (Subsingleton.elim _ _)
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
⊢ ∀ (a₁ a₂ : ↑(Ω^ N X x)),
    Setoid.r a₁ a₂ ↔ Setoid.r (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂)
[PROOFSTEP]
intros a₁ a₂
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r a₁ a₂ ↔ Setoid.r (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂)
[PROOFSTEP]
constructor
[GOAL]
case mp
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r a₁ a₂ → Setoid.r (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂)
[PROOFSTEP]
rintro ⟨H⟩
[GOAL]
case mpr
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂) → Setoid.r a₁ a₂
[PROOFSTEP]
rintro ⟨H⟩
[GOAL]
case mp.intro
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
a₁ a₂ : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑a₁) (↑a₂) (Cube.boundary N)
⊢ Setoid.r (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂)
case mpr.intro
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x✝ : X
inst✝¹ : DecidableEq N✝
N : Type ?u.536140
x : X
inst✝ : IsEmpty N
a₁ a₂ : ↑(Ω^ N X x)
H : Path (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₁) (↑(genLoopHomeoOfIsEmpty N x).toEquiv a₂)
⊢ Setoid.r a₁ a₂
[PROOFSTEP]
exacts
  [⟨{ toFun := fun t => H ⟨t, isEmptyElim⟩
      source' := (H.apply_zero _).trans (congr_arg a₁ <| Subsingleton.elim _ _)
      target' := (H.apply_one _).trans (congr_arg a₂ <| Subsingleton.elim _ _) }⟩,
  ⟨{  toFun := fun t0 => H t0.fst
      map_zero_left := fun _ => H.source.trans (congr_arg a₁ <| Subsingleton.elim _ _)
      map_one_left := fun _ => H.target.trans (congr_arg a₂ <| Subsingleton.elim _ _)
      prop' := fun _ _ ⟨i, _⟩ => isEmptyElim i }⟩]
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : ↑(Ω^ N X x)
⊢ Continuous fun t => ↑p fun x => t
[PROOFSTEP]
continuity
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
⊢ Continuous fun c => ↑p (c default)
[PROOFSTEP]
continuity
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
⊢ (ContinuousMap.mk fun c => ↑p (c default)) ∈ Ω^ N X x
[PROOFSTEP]
rintro y ⟨i, iH | iH⟩
[GOAL]
case intro.inl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
i : N
iH : y i = 0
⊢ ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x
[PROOFSTEP]
cases Unique.eq_default i
[GOAL]
case intro.inr
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
i : N
iH : y i = 1
⊢ ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x
[PROOFSTEP]
cases Unique.eq_default i
[GOAL]
case intro.inl.refl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
iH : y default = 0
⊢ ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x
[PROOFSTEP]
apply (congr_arg p iH).trans
[GOAL]
case intro.inr.refl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
iH : y default = 1
⊢ ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x
[PROOFSTEP]
apply (congr_arg p iH).trans
[GOAL]
case intro.inl.refl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
iH : y default = 0
⊢ ↑p 0 = x
case intro.inr.refl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
y : N → ↑I
iH : y default = 1
⊢ ↑p 1 = x
[PROOFSTEP]
exacts [p.source, p.target]
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : ↑(Ω^ N X x)
⊢ (fun p =>
        { val := ContinuousMap.mk fun c => ↑p (c default),
          property := (_ : ∀ (y : N → ↑I), y ∈ Cube.boundary N → ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x) })
      ((fun p =>
          { toContinuousMap := ContinuousMap.mk fun t => ↑p fun x => t, source' := (_ : (↑p fun x => 0) = x),
            target' := (_ : (↑p fun x => 1) = x) })
        p) =
    p
[PROOFSTEP]
ext y
[GOAL]
case H
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : ↑(Ω^ N X x)
y : N → ↑I
⊢ ↑((fun p =>
            { val := ContinuousMap.mk fun c => ↑p (c default),
              property :=
                (_ : ∀ (y : N → ↑I), y ∈ Cube.boundary N → ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x) })
          ((fun p =>
              { toContinuousMap := ContinuousMap.mk fun t => ↑p fun x => t, source' := (_ : (↑p fun x => 0) = x),
                target' := (_ : (↑p fun x => 1) = x) })
            p))
      y =
    ↑p y
[PROOFSTEP]
exact congr_arg p (eq_const_of_unique y).symm
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
⊢ (fun p =>
        { toContinuousMap := ContinuousMap.mk fun t => ↑p fun x => t, source' := (_ : (↑p fun x => 0) = x),
          target' := (_ : (↑p fun x => 1) = x) })
      ((fun p =>
          { val := ContinuousMap.mk fun c => ↑p (c default),
            property := (_ : ∀ (y : N → ↑I), y ∈ Cube.boundary N → ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x) })
        p) =
    p
[PROOFSTEP]
ext
[GOAL]
case a.h
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.636077
inst✝ : Unique N
p : Ω X x
x✝ : ↑I
⊢ ↑((fun p =>
            { toContinuousMap := ContinuousMap.mk fun t => ↑p fun x => t, source' := (_ : (↑p fun x => 0) = x),
              target' := (_ : (↑p fun x => 1) = x) })
          ((fun p =>
              { val := ContinuousMap.mk fun c => ↑p (c default),
                property :=
                  (_ : ∀ (y : N → ↑I), y ∈ Cube.boundary N → ↑(ContinuousMap.mk fun c => ↑p (c default)) y = x) })
            p))
      x✝ =
    ↑p x✝
[PROOFSTEP]
rfl
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
⊢ HomotopyGroup N X x ≃ FundamentalGroup X x
[PROOFSTEP]
refine' Equiv.trans _ (CategoryTheory.Groupoid.isoEquivHom _ _).symm
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
⊢ HomotopyGroup N X x ≃ (x ⟶ x)
[PROOFSTEP]
refine' Quotient.congr (genLoopEquivOfUnique N) _
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
⊢ ∀ (a₁ a₂ : ↑(Ω^ N X x)), Setoid.r a₁ a₂ ↔ Setoid.r (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
[PROOFSTEP]
intros a₁ a₂
[GOAL]
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r a₁ a₂ ↔ Setoid.r (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
[PROOFSTEP]
constructor
[GOAL]
case mp
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r a₁ a₂ → Setoid.r (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
[PROOFSTEP]
rintro ⟨H⟩
[GOAL]
case mpr
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
⊢ Setoid.r (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂) → Setoid.r a₁ a₂
[PROOFSTEP]
rintro ⟨H⟩
[GOAL]
case mp.intro
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : ContinuousMap.HomotopyRel (↑a₁) (↑a₂) (Cube.boundary N)
⊢ Setoid.r (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
[PROOFSTEP]
exact
  ⟨{  toFun := fun tx => H (tx.fst, fun _ => tx.snd)
      map_zero_left := fun _ => H.apply_zero _
      map_one_left := fun _ => H.apply_one _
      prop' := fun t y iH => H.prop' _ _ ⟨default, iH⟩ }⟩
[GOAL]
case mpr.intro
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
⊢ Setoid.r a₁ a₂
[PROOFSTEP]
refine' ⟨⟨⟨⟨fun tx => H (tx.fst, tx.snd default), H.continuous.comp _⟩, fun y => _, fun y => _⟩, _⟩⟩
[GOAL]
case mpr.intro.refine'_1
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
⊢ Continuous fun tx => (tx.fst, Prod.snd tx default)
[PROOFSTEP]
exact continuous_fst.prod_mk ((continuous_apply _).comp continuous_snd)
[GOAL]
case mpr.intro.refine'_2
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
y : N → ↑I
⊢ ContinuousMap.toFun (ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default)) (0, y) = ↑↑a₁ y
[PROOFSTEP]
exact (H.apply_zero _).trans (congr_arg a₁ (eq_const_of_unique y).symm)
[GOAL]
case mpr.intro.refine'_3
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
y : N → ↑I
⊢ ContinuousMap.toFun (ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default)) (1, y) = ↑↑a₂ y
[PROOFSTEP]
exact (H.apply_one _).trans (congr_arg a₂ (eq_const_of_unique y).symm)
[GOAL]
case mpr.intro.refine'_4
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
⊢ ∀ (t : ↑I) (x_1 : N → ↑I),
    x_1 ∈ Cube.boundary N →
      ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                      map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                      map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑a₁ x_1 ∧
        ↑(ContinuousMap.mk fun x_2 =>
                ContinuousMap.toFun
                  { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                      map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                      map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
                  (t, x_2))
            x_1 =
          ↑↑a₂ x_1
[PROOFSTEP]
rintro t y ⟨i, iH⟩
[GOAL]
case mpr.intro.refine'_4.intro
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
t : ↑I
y : N → ↑I
i : N
iH : y i = 0 ∨ y i = 1
⊢ ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                  map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                  map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
              (t, x_1))
        y =
      ↑↑a₁ y ∧
    ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                  map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                  map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
              (t, x_1))
        y =
      ↑↑a₂ y
[PROOFSTEP]
cases Unique.eq_default i
[GOAL]
case mpr.intro.refine'_4.intro.refl
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
t : ↑I
y : N → ↑I
iH : y default = 0 ∨ y default = 1
⊢ ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                  map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                  map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
              (t, x_1))
        y =
      ↑↑a₁ y ∧
    ↑(ContinuousMap.mk fun x_1 =>
            ContinuousMap.toFun
              { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                  map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                  map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
              (t, x_1))
        y =
      ↑↑a₂ y
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.refine'_4.intro.refl.left
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
t : ↑I
y : N → ↑I
iH : y default = 0 ∨ y default = 1
⊢ ↑(ContinuousMap.mk fun x_1 =>
          ContinuousMap.toFun
            { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
            (t, x_1))
      y =
    ↑↑a₁ y
[PROOFSTEP]
exact (H.eq_fst _ iH).trans (congr_arg a₁ (eq_const_of_unique y).symm)
[GOAL]
case mpr.intro.refine'_4.intro.refl.right
N✝ : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N✝
N : Type ?u.712366
inst✝ : Unique N
a₁ a₂ : ↑(Ω^ N X x)
H : Path.Homotopy (↑(genLoopEquivOfUnique N) a₁) (↑(genLoopEquivOfUnique N) a₂)
t : ↑I
y : N → ↑I
iH : y default = 0 ∨ y default = 1
⊢ ↑(ContinuousMap.mk fun x_1 =>
          ContinuousMap.toFun
            { toContinuousMap := ContinuousMap.mk fun tx => ↑H (tx.fst, Prod.snd tx default),
                map_zero_left := (_ : ∀ (y : N → ↑I), ↑H (0, Prod.snd (0, y) default) = ↑↑a₁ y),
                map_one_left := (_ : ∀ (y : N → ↑I), ↑H (1, Prod.snd (1, y) default) = ↑↑a₂ y) }.toContinuousMap
            (t, x_1))
      y =
    ↑↑a₂ y
[PROOFSTEP]
exact (H.eq_snd _ iH).trans (congr_arg a₂ (eq_const_of_unique y).symm)
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
⊢ auxGroup i = auxGroup j
[PROOFSTEP]
by_cases h : i = j
[GOAL]
case pos
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : i = j
⊢ auxGroup i = auxGroup j
[PROOFSTEP]
rw [h]
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : ¬i = j
⊢ auxGroup i = auxGroup j
[PROOFSTEP]
refine' Group.ext (EckmannHilton.mul (isUnital_auxGroup i) (isUnital_auxGroup j) _)
[GOAL]
case neg
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : ¬i = j
⊢ ∀ (a b c d : HomotopyGroup N X x), Mul.mul (Mul.mul a b) (Mul.mul c d) = Mul.mul (Mul.mul a c) (Mul.mul b d)
[PROOFSTEP]
rintro ⟨a⟩ ⟨b⟩ ⟨c⟩ ⟨d⟩
[GOAL]
case neg.mk.mk.mk.mk
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : ¬i = j
a✝ : HomotopyGroup N X x
a : ↑(Ω^ N X x)
b✝ : HomotopyGroup N X x
b : ↑(Ω^ N X x)
c✝ : HomotopyGroup N X x
c : ↑(Ω^ N X x)
d✝ : HomotopyGroup N X x
d : ↑(Ω^ N X x)
⊢ Mul.mul (Mul.mul (Quot.mk Setoid.r a) (Quot.mk Setoid.r b)) (Mul.mul (Quot.mk Setoid.r c) (Quot.mk Setoid.r d)) =
    Mul.mul (Mul.mul (Quot.mk Setoid.r a) (Quot.mk Setoid.r c)) (Mul.mul (Quot.mk Setoid.r b) (Quot.mk Setoid.r d))
[PROOFSTEP]
change Quotient.mk' _ = _
[GOAL]
case neg.mk.mk.mk.mk
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : ¬i = j
a✝ : HomotopyGroup N X x
a : ↑(Ω^ N X x)
b✝ : HomotopyGroup N X x
b : ↑(Ω^ N X x)
c✝ : HomotopyGroup N X x
c : ↑(Ω^ N X x)
d✝ : HomotopyGroup N X x
d : ↑(Ω^ N X x)
⊢ Quotient.mk'
      (↑(loopHomeo i).symm
        (Path.trans
          (↑(loopHomeo i).toEquiv
            (↑(loopHomeo j).symm (Path.trans (↑(loopHomeo j).toEquiv d) (↑(loopHomeo j).toEquiv c))))
          (↑(loopHomeo i).toEquiv
            (↑(loopHomeo j).symm (Path.trans (↑(loopHomeo j).toEquiv b) (↑(loopHomeo j).toEquiv a)))))) =
    Mul.mul (Mul.mul (Quot.mk Setoid.r a) (Quot.mk Setoid.r c)) (Mul.mul (Quot.mk Setoid.r b) (Quot.mk Setoid.r d))
[PROOFSTEP]
apply congr_arg Quotient.mk'
[GOAL]
case neg.mk.mk.mk.mk
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
h : ¬i = j
a✝ : HomotopyGroup N X x
a : ↑(Ω^ N X x)
b✝ : HomotopyGroup N X x
b : ↑(Ω^ N X x)
c✝ : HomotopyGroup N X x
c : ↑(Ω^ N X x)
d✝ : HomotopyGroup N X x
d : ↑(Ω^ N X x)
⊢ ↑(loopHomeo i).symm
      (Path.trans
        (↑(loopHomeo i).toEquiv
          (↑(loopHomeo j).symm (Path.trans (↑(loopHomeo j).toEquiv d) (↑(loopHomeo j).toEquiv c))))
        (↑(loopHomeo i).toEquiv
          (↑(loopHomeo j).symm (Path.trans (↑(loopHomeo j).toEquiv b) (↑(loopHomeo j).toEquiv a))))) =
    ↑(loopHomeo j).symm
      (Path.trans
        (↑(loopHomeo j).toEquiv
          (↑(loopHomeo i).symm (Path.trans (↑(loopHomeo i).toEquiv d) (↑(loopHomeo i).toEquiv b))))
        (↑(loopHomeo j).toEquiv
          (↑(loopHomeo i).symm (Path.trans (↑(loopHomeo i).toEquiv c) (↑(loopHomeo i).toEquiv a)))))
[PROOFSTEP]
simp only [fromLoop_trans_toLoop, transAt_distrib h, coe_toEquiv, loopHomeo_apply, coe_symm_toEquiv,
  loopHomeo_symm_apply]
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f g : ↑(Ω^ N X x)
⊢ Quotient.mk (Homotopic.setoid N x) (transAt i f g) = Quotient.mk (Homotopic.setoid N x) (transAt j f g)
[PROOFSTEP]
simp_rw [← fromLoop_trans_toLoop]
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f g : ↑(Ω^ N X x)
⊢ Quotient.mk (Homotopic.setoid N x) (fromLoop i (Path.trans (toLoop i f) (toLoop i g))) =
    Quotient.mk (Homotopic.setoid N x) (fromLoop j (Path.trans (toLoop j f) (toLoop j g)))
[PROOFSTEP]
let m := fun (G) (_ : Group G) => ((· * ·) : G → G → G)
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f g : ↑(Ω^ N X x)
m : (G : Type ?u.799968) → Group G → G → G → G := fun G x x_1 x_2 => x_1 * x_2
⊢ Quotient.mk (Homotopic.setoid N x) (fromLoop i (Path.trans (toLoop i f) (toLoop i g))) =
    Quotient.mk (Homotopic.setoid N x) (fromLoop j (Path.trans (toLoop j f) (toLoop j g)))
[PROOFSTEP]
exact congr_fun₂ (congr_arg (m <| HomotopyGroup N X x) <| auxGroup_indep i j) ⟦g⟧ ⟦f⟧
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f : ↑(Ω^ N X x)
⊢ Quotient.mk (Homotopic.setoid N x) (symmAt i f) = Quotient.mk (Homotopic.setoid N x) (symmAt j f)
[PROOFSTEP]
simp_rw [← fromLoop_symm_toLoop]
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f : ↑(Ω^ N X x)
⊢ Quotient.mk (Homotopic.setoid N x) (fromLoop i (Path.symm (toLoop i f))) =
    Quotient.mk (Homotopic.setoid N x) (fromLoop j (Path.symm (toLoop j f)))
[PROOFSTEP]
let inv := fun (G) (_ : Group G) => ((·⁻¹) : G → G)
[GOAL]
N : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
x : X
inst✝ : DecidableEq N
i j : N
f : ↑(Ω^ N X x)
inv : (G : Type ?u.802068) → Group G → G → G := fun G x x_1 => x_1⁻¹
⊢ Quotient.mk (Homotopic.setoid N x) (fromLoop i (Path.symm (toLoop i f))) =
    Quotient.mk (Homotopic.setoid N x) (fromLoop j (Path.symm (toLoop j f)))
[PROOFSTEP]
exact congr_fun (congr_arg (inv <| HomotopyGroup N X x) <| auxGroup_indep i j) ⟦f⟧
[GOAL]
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p q : ↑(Ω^ N X x)
⊢ (fun x_1 x_2 => x_1 * x_2) (Quotient.mk (Homotopic.setoid N x) p) (Quotient.mk (Homotopic.setoid N x) q) =
    Quotient.mk (Homotopic.setoid N x) (transAt i q p)
[PROOFSTEP]
rw [transAt_indep _ q, ← fromLoop_trans_toLoop]
[GOAL]
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p q : ↑(Ω^ N X x)
⊢ (fun x_1 x_2 => x_1 * x_2) (Quotient.mk (Homotopic.setoid N x) p) (Quotient.mk (Homotopic.setoid N x) q) =
    Quotient.mk (Homotopic.setoid N x) (fromLoop ?m.837545 (Path.trans (toLoop ?m.837545 q) (toLoop ?m.837545 p)))
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p q : ↑(Ω^ N X x)
⊢ N
[PROOFSTEP]
apply Quotient.sound
[GOAL]
case a
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p q : ↑(Ω^ N X x)
⊢ ↑(loopHomeo (Classical.arbitrary N)).symm
      (Path.trans (↑(loopHomeo (Classical.arbitrary N)).toEquiv q) (↑(loopHomeo (Classical.arbitrary N)).toEquiv p)) ≈
    fromLoop ?m.837545 (Path.trans (toLoop ?m.837545 q) (toLoop ?m.837545 p))
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p q : ↑(Ω^ N X x)
⊢ N
[PROOFSTEP]
rfl
[GOAL]
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p : ↑(Ω^ N X x)
⊢ (Quotient.mk (Homotopic.setoid N x) p)⁻¹ = Quotient.mk (Homotopic.setoid N x) (symmAt i p)
[PROOFSTEP]
rw [symmAt_indep _ p, ← fromLoop_symm_toLoop]
[GOAL]
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p : ↑(Ω^ N X x)
⊢ (Quotient.mk (Homotopic.setoid N x) p)⁻¹ =
    Quotient.mk (Homotopic.setoid N x) (fromLoop ?m.838706 (Path.symm (toLoop ?m.838706 p)))
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p : ↑(Ω^ N X x)
⊢ N
[PROOFSTEP]
apply Quotient.sound
[GOAL]
case a
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p : ↑(Ω^ N X x)
⊢ ↑(loopHomeo (Classical.arbitrary N)).symm (Path.symm (↑(loopHomeo (Classical.arbitrary N)).toEquiv p)) ≈
    fromLoop ?m.838706 (Path.symm (toLoop ?m.838706 p))
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nonempty N
i : N
p : ↑(Ω^ N X x)
⊢ N
[PROOFSTEP]
rfl
[GOAL]
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nontrivial N
h : ∃ y, y ≠ Classical.arbitrary N := exists_ne (Classical.arbitrary N)
⊢ ∀ (a b c d : HomotopyGroup N X x), Mul.mul (a * b) (c * d) = Mul.mul a c * Mul.mul b d
[PROOFSTEP]
rintro ⟨a⟩ ⟨b⟩ ⟨c⟩ ⟨d⟩
[GOAL]
case mk.mk.mk.mk
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nontrivial N
h : ∃ y, y ≠ Classical.arbitrary N := exists_ne (Classical.arbitrary N)
a✝ : HomotopyGroup N X x
a : ↑(Ω^ N X x)
b✝ : HomotopyGroup N X x
b : ↑(Ω^ N X x)
c✝ : HomotopyGroup N X x
c : ↑(Ω^ N X x)
d✝ : HomotopyGroup N X x
d : ↑(Ω^ N X x)
⊢ Mul.mul (Quot.mk Setoid.r a * Quot.mk Setoid.r b) (Quot.mk Setoid.r c * Quot.mk Setoid.r d) =
    Mul.mul (Quot.mk Setoid.r a) (Quot.mk Setoid.r c) * Mul.mul (Quot.mk Setoid.r b) (Quot.mk Setoid.r d)
[PROOFSTEP]
apply congr_arg Quotient.mk'
[GOAL]
case mk.mk.mk.mk
N : Type u_1
X : Type u_2
inst✝² : TopologicalSpace X
x : X
inst✝¹ : DecidableEq N
inst✝ : Nontrivial N
h : ∃ y, y ≠ Classical.arbitrary N := exists_ne (Classical.arbitrary N)
a✝ : HomotopyGroup N X x
a : ↑(Ω^ N X x)
b✝ : HomotopyGroup N X x
b : ↑(Ω^ N X x)
c✝ : HomotopyGroup N X x
c : ↑(Ω^ N X x)
d✝ : HomotopyGroup N X x
d : ↑(Ω^ N X x)
⊢ ↑(loopHomeo (Classical.choose h)).symm
      (Path.trans
        (↑(loopHomeo (Classical.choose h)).toEquiv
          (↑(loopHomeo (Classical.arbitrary N)).symm
            (Path.trans (↑(loopHomeo (Classical.arbitrary N)).toEquiv d)
              (↑(loopHomeo (Classical.arbitrary N)).toEquiv c))))
        (↑(loopHomeo (Classical.choose h)).toEquiv
          (↑(loopHomeo (Classical.arbitrary N)).symm
            (Path.trans (↑(loopHomeo (Classical.arbitrary N)).toEquiv b)
              (↑(loopHomeo (Classical.arbitrary N)).toEquiv a))))) =
    ↑(loopHomeo (Classical.arbitrary N)).symm
      (Path.trans
        (↑(loopHomeo (Classical.arbitrary N)).toEquiv
          (↑(loopHomeo (Classical.choose h)).symm
            (Path.trans (↑(loopHomeo (Classical.choose h)).toEquiv d) (↑(loopHomeo (Classical.choose h)).toEquiv b))))
        (↑(loopHomeo (Classical.arbitrary N)).toEquiv
          (↑(loopHomeo (Classical.choose h)).symm
            (Path.trans (↑(loopHomeo (Classical.choose h)).toEquiv c) (↑(loopHomeo (Classical.choose h)).toEquiv a)))))
[PROOFSTEP]
simp only [fromLoop_trans_toLoop, transAt_distrib <| Classical.choose_spec h, coe_toEquiv, loopHomeo_apply,
  coe_symm_toEquiv, loopHomeo_symm_apply]
