Theorem: PFunctor.M.ext_aux
File: Mathlib/Data/PFunctor/Univariate/M.lean

tactic: induction' n with n n_ih generalizing x y z
state_before: F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x y z : M F
hx : Agree' n z x
hy : Agree' n z y
hrec : ∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y
⊢ MIntl.approx x (n + 1) = MIntl.approx y (n + 1)

tactic: specialize hrec [] rfl
state_before: case zero
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x✝ y✝ z✝ : M F
hx✝ : Agree' n z✝ x✝
hy✝ : Agree' n z✝ y✝
hrec✝ : ∀ (ps : Path F), n = length ps → iselect ps x✝ = iselect ps y✝
x y z : M F
hx : Agree' zero z x
hy : Agree' zero z y
hrec : ∀ (ps : Path F), zero = length ps → iselect ps x = iselect ps y
⊢ MIntl.approx x (zero + 1) = MIntl.approx y (zero + 1)

tactic: induction x using PFunctor.M.casesOn'
state_before: case zero
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x✝ y✝ z✝ : M F
hx✝ : Agree' n z✝ x✝
hy✝ : Agree' n z✝ y✝
hrec✝ : ∀ (ps : Path F), n = length ps → iselect ps x✝ = iselect ps y✝
x y z : M F
hx : Agree' zero z x
hy : Agree' zero z y
hrec : iselect [] x = iselect [] y
⊢ MIntl.approx x (zero + 1) = MIntl.approx y (zero + 1)

tactic: induction y using PFunctor.M.casesOn'
state_before: case zero.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x y✝ z✝ : M F
hx✝ : Agree' n z✝ x
hy✝ : Agree' n z✝ y✝
hrec✝ : ∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y✝
y z : M F
hy : Agree' zero z y
a✝ : F.A
f✝ : B F a✝ → M F
hx : Agree' zero z (M.mk { fst := a✝, snd := f✝ })
hrec : iselect [] (M.mk { fst := a✝, snd := f✝ }) = iselect [] y
⊢ MIntl.approx (M.mk { fst := a✝, snd := f✝ }) (zero + 1) = MIntl.approx y (zero + 1)

tactic: simp only [iselect_nil] at hrec
state_before: case zero.f.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x y z✝ : M F
hx✝ : Agree' n z✝ x
hy✝ : Agree' n z✝ y
hrec✝ : ∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y
z : M F
a✝¹ : F.A
f✝¹ : B F a✝¹ → M F
hx : Agree' zero z (M.mk { fst := a✝¹, snd := f✝¹ })
a✝ : F.A
f✝ : B F a✝ → M F
hy : Agree' zero z (M.mk { fst := a✝, snd := f✝ })
hrec : iselect [] (M.mk { fst := a✝¹, snd := f✝¹ }) = iselect [] (M.mk { fst := a✝, snd := f✝ })
⊢ MIntl.approx (M.mk { fst := a✝¹, snd := f✝¹ }) (zero + 1) = MIntl.approx (M.mk { fst := a✝, snd := f✝ }) (zero + 1)

tactic: subst hrec
state_before: case zero.f.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x y z✝ : M F
hx✝ : Agree' n z✝ x
hy✝ : Agree' n z✝ y
hrec✝ : ∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y
z : M F
a✝¹ : F.A
f✝¹ : B F a✝¹ → M F
hx : Agree' zero z (M.mk { fst := a✝¹, snd := f✝¹ })
a✝ : F.A
f✝ : B F a✝ → M F
hy : Agree' zero z (M.mk { fst := a✝, snd := f✝ })
hrec : a✝¹ = a✝
⊢ MIntl.approx (M.mk { fst := a✝¹, snd := f✝¹ }) (zero + 1) = MIntl.approx (M.mk { fst := a✝, snd := f✝ }) (zero + 1)

tactic: simp only [approx_mk, true_and_iff, eq_self_iff_true, heq_iff_eq, zero_eq, CofixA.intro.injEq,
            heq_eq_eq, eq_iff_true_of_subsingleton, and_self]
state_before: case zero.f.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n : ℕ
x y z✝ : M F
hx✝ : Agree' n z✝ x
hy✝ : Agree' n z✝ y
hrec : ∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y
z : M F
a✝ : F.A
f✝¹ : B F a✝ → M F
hx : Agree' zero z (M.mk { fst := a✝, snd := f✝¹ })
f✝ : B F a✝ → M F
hy : Agree' zero z (M.mk { fst := a✝, snd := f✝ })
⊢ MIntl.approx (M.mk { fst := a✝, snd := f✝¹ }) (zero + 1) = MIntl.approx (M.mk { fst := a✝, snd := f✝ }) (zero + 1)

tactic: cases hx
state_before: case succ
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x✝ y✝ z✝ : M F
hx✝ : Agree' n✝ z✝ x✝
hy✝ : Agree' n✝ z✝ y✝
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x✝ = iselect ps y✝
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
x y z : M F
hx : Agree' (succ n) z x
hy : Agree' (succ n) z y
hrec : ∀ (ps : Path F), succ n = length ps → iselect ps x = iselect ps y
⊢ MIntl.approx x (succ n + 1) = MIntl.approx y (succ n + 1)

tactic: cases hy
state_before: case succ.step
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x✝¹ y✝¹ z✝ : M F
hx : Agree' n✝ z✝ x✝¹
hy✝ : Agree' n✝ z✝ y✝¹
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x✝¹ = iselect ps y✝¹
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
x y z : M F
hy : Agree' (succ n) z y
hrec : ∀ (ps : Path F), succ n = length ps → iselect ps x = iselect ps y
a✝³ : F.A
x✝ y✝ : B F a✝³ → M F
a✝² : ∀ (i : B F a✝³), Agree' n (x✝ i) (y✝ i)
a✝¹ : z = M.mk { fst := a✝³, snd := x✝ }
a✝ : x = M.mk { fst := a✝³, snd := y✝ }
⊢ MIntl.approx x (succ n + 1) = MIntl.approx y (succ n + 1)

tactic: induction x using PFunctor.M.casesOn'
state_before: case succ.step.step
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x✝² y✝² z✝ : M F
hx : Agree' n✝ z✝ x✝²
hy : Agree' n✝ z✝ y✝²
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x✝² = iselect ps y✝²
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
x y z : M F
hrec : ∀ (ps : Path F), succ n = length ps → iselect ps x = iselect ps y
a✝⁷ : F.A
x✝¹ y✝¹ : B F a✝⁷ → M F
a✝⁶ : ∀ (i : B F a✝⁷), Agree' n (x✝¹ i) (y✝¹ i)
a✝⁵ : z = M.mk { fst := a✝⁷, snd := x✝¹ }
a✝⁴ : x = M.mk { fst := a✝⁷, snd := y✝¹ }
a✝³ : F.A
x✝ y✝ : B F a✝³ → M F
a✝² : ∀ (i : B F a✝³), Agree' n (x✝ i) (y✝ i)
a✝¹ : z = M.mk { fst := a✝³, snd := x✝ }
a✝ : y = M.mk { fst := a✝³, snd := y✝ }
⊢ MIntl.approx x (succ n + 1) = MIntl.approx y (succ n + 1)

tactic: induction y using PFunctor.M.casesOn'
state_before: case succ.step.step.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y✝² z✝ : M F
hx : Agree' n✝ z✝ x
hy : Agree' n✝ z✝ y✝²
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y✝²
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
y z : M F
a✝⁸ : F.A
x✝¹ y✝¹ : B F a✝⁸ → M F
a✝⁷ : ∀ (i : B F a✝⁸), Agree' n (x✝¹ i) (y✝¹ i)
a✝⁶ : z = M.mk { fst := a✝⁸, snd := x✝¹ }
a✝⁵ : F.A
x✝ y✝ : B F a✝⁵ → M F
a✝⁴ : ∀ (i : B F a✝⁵), Agree' n (x✝ i) (y✝ i)
a✝³ : z = M.mk { fst := a✝⁵, snd := x✝ }
a✝² : y = M.mk { fst := a✝⁵, snd := y✝ }
a✝¹ : F.A
f✝ : B F a✝¹ → M F
hrec : ∀ (ps : Path F), succ n = length ps → iselect ps (M.mk { fst := a✝¹, snd := f✝ }) = iselect ps y
a✝ : M.mk { fst := a✝¹, snd := f✝ } = M.mk { fst := a✝⁸, snd := y✝¹ }
⊢ MIntl.approx (M.mk { fst := a✝¹, snd := f✝ }) (succ n + 1) = MIntl.approx y (succ n + 1)

tactic: subst z
state_before: case succ.step.step.f.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z✝ : M F
hx : Agree' n✝ z✝ x
hy : Agree' n✝ z✝ y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
z : M F
a✝⁹ : F.A
x✝¹ y✝¹ : B F a✝⁹ → M F
a✝⁸ : ∀ (i : B F a✝⁹), Agree' n (x✝¹ i) (y✝¹ i)
a✝⁷ : z = M.mk { fst := a✝⁹, snd := x✝¹ }
a✝⁶ : F.A
x✝ y✝ : B F a✝⁶ → M F
a✝⁵ : ∀ (i : B F a✝⁶), Agree' n (x✝ i) (y✝ i)
a✝⁴ : z = M.mk { fst := a✝⁶, snd := x✝ }
a✝³ : F.A
f✝¹ : B F a✝³ → M F
a✝² : M.mk { fst := a✝³, snd := f✝¹ } = M.mk { fst := a✝⁹, snd := y✝¹ }
a✝¹ : F.A
f✝ : B F a✝¹ → M F
a✝ : M.mk { fst := a✝¹, snd := f✝ } = M.mk { fst := a✝⁶, snd := y✝ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝³, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝¹, snd := f✝ })
⊢ MIntl.approx (M.mk { fst := a✝³, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝¹, snd := f✝ }) (succ n + 1)

tactic: iterate 3 (have := mk_inj ‹_›; cases this)
state_before: case succ.step.step.f.f
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a✝⁸ : F.A
x✝¹ y✝¹ : B F a✝⁸ → M F
a✝⁷ : ∀ (i : B F a✝⁸), Agree' n (x✝¹ i) (y✝¹ i)
a✝⁶ : F.A
x✝ y✝ : B F a✝⁶ → M F
a✝⁵ : ∀ (i : B F a✝⁶), Agree' n (x✝ i) (y✝ i)
a✝⁴ : F.A
f✝¹ : B F a✝⁴ → M F
a✝³ : M.mk { fst := a✝⁴, snd := f✝¹ } = M.mk { fst := a✝⁸, snd := y✝¹ }
a✝² : F.A
f✝ : B F a✝² → M F
a✝¹ : M.mk { fst := a✝², snd := f✝ } = M.mk { fst := a✝⁶, snd := y✝ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝⁴, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝², snd := f✝ })
a✝ : M.mk { fst := a✝⁸, snd := x✝¹ } = M.mk { fst := a✝⁶, snd := x✝ }
⊢ MIntl.approx (M.mk { fst := a✝⁴, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝², snd := f✝ }) (succ n + 1)

tactic: rename_i n_ih a f₃ f₂ hAgree₂ _ _ h₂ _ _ f₁ h₁ hAgree₁ clr
state_before: case succ.step.step.f.f.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a✝⁷ : F.A
x✝ y✝¹ : B F a✝⁷ → M F
a✝⁶ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝¹ i)
a✝⁵ : F.A
f✝¹ : B F a✝⁵ → M F
a✝⁴ : M.mk { fst := a✝⁵, snd := f✝¹ } = M.mk { fst := a✝⁷, snd := y✝¹ }
a✝³ : F.A
f✝ : B F a✝³ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝⁵, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝³, snd := f✝ })
y✝ : B F a✝⁷ → M F
a✝² : M.mk { fst := a✝³, snd := f✝ } = M.mk { fst := a✝⁷, snd := y✝ }
a✝¹ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝ i)
a✝ : M.mk { fst := a✝⁷, snd := x✝ } = M.mk { fst := a✝⁷, snd := x✝ }
⊢ MIntl.approx (M.mk { fst := a✝⁵, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝³, snd := f✝ }) (succ n + 1)

tactic: simp only [approx_mk, true_and_iff, eq_self_iff_true, heq_iff_eq]
state_before: case succ.step.step.f.f.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝¹ : F.A
f✝¹ : B F a✝¹ → M F
h₂ : M.mk { fst := a✝¹, snd := f✝¹ } = M.mk { fst := a, snd := f₂ }
a✝ : F.A
f✝ : B F a✝ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝¹, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝, snd := f✝ })
f₁ : B F a → M F
h₁ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₁ }
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
⊢ MIntl.approx (M.mk { fst := a✝¹, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝, snd := f✝ }) (succ n + 1)

tactic: have := mk_inj h₁
state_before: case succ.step.step.f.f.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝¹ : F.A
f✝¹ : B F a✝¹ → M F
h₂ : M.mk { fst := a✝¹, snd := f✝¹ } = M.mk { fst := a, snd := f₂ }
a✝ : F.A
f✝ : B F a✝ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝¹, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝, snd := f✝ })
f₁ : B F a → M F
h₁ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₁ }
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
⊢ (CofixA.intro a✝¹ fun j => MIntl.approx (f✝¹ j) (n + 1)) = CofixA.intro a✝ fun j => MIntl.approx (f✝ j) (n + 1)

tactic: cases this
state_before: case succ.step.step.f.f.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝¹ : F.A
f✝¹ : B F a✝¹ → M F
h₂ : M.mk { fst := a✝¹, snd := f✝¹ } = M.mk { fst := a, snd := f₂ }
a✝ : F.A
f✝ : B F a✝ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝¹, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝, snd := f✝ })
f₁ : B F a → M F
h₁ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₁ }
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
this : { fst := a✝, snd := f✝ } = { fst := a, snd := f₁ }
⊢ (CofixA.intro a✝¹ fun j => MIntl.approx (f✝¹ j) (n + 1)) = CofixA.intro a✝ fun j => MIntl.approx (f✝ j) (n + 1)

tactic: clear h₁
state_before: case succ.step.step.f.f.refl.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝ : F.A
f✝ : B F a✝ → M F
h₂ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₂ }
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝, snd := f✝ }) = iselect ps (M.mk { fst := a, snd := f₁ })
h₁ : M.mk { fst := a, snd := f₁ } = M.mk { fst := a, snd := f₁ }
⊢ (CofixA.intro a✝ fun j => MIntl.approx (f✝ j) (n + 1)) = CofixA.intro a fun j => MIntl.approx (f₁ j) (n + 1)

tactic: have := mk_inj h₂
state_before: case succ.step.step.f.f.refl.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝ : F.A
f✝ : B F a✝ → M F
h₂ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₂ }
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝, snd := f✝ }) = iselect ps (M.mk { fst := a, snd := f₁ })
⊢ (CofixA.intro a✝ fun j => MIntl.approx (f✝ j) (n + 1)) = CofixA.intro a fun j => MIntl.approx (f₁ j) (n + 1)

tactic: cases this
state_before: case succ.step.step.f.f.refl.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
a✝ : F.A
f✝ : B F a✝ → M F
h₂ : M.mk { fst := a✝, snd := f✝ } = M.mk { fst := a, snd := f₂ }
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝, snd := f✝ }) = iselect ps (M.mk { fst := a, snd := f₁ })
this : { fst := a✝, snd := f✝ } = { fst := a, snd := f₂ }
⊢ (CofixA.intro a✝ fun j => MIntl.approx (f✝ j) (n + 1)) = CofixA.intro a fun j => MIntl.approx (f₁ j) (n + 1)

tactic: clear h₂
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
h₂ : M.mk { fst := a, snd := f₂ } = M.mk { fst := a, snd := f₂ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
⊢ (CofixA.intro a fun j => MIntl.approx (f₂ j) (n + 1)) = CofixA.intro a fun j => MIntl.approx (f₁ j) (n + 1)

tactic: congr
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
⊢ (CofixA.intro a fun j => MIntl.approx (f₂ j) (n + 1)) = CofixA.intro a fun j => MIntl.approx (f₁ j) (n + 1)

tactic: ext i
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
⊢ (fun j => MIntl.approx (f₂ j) (n + 1)) = fun j => MIntl.approx (f₁ j) (n + 1)

tactic: apply n_ih
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
i : B F a
⊢ MIntl.approx (f₂ i) (n + 1) = MIntl.approx (f₁ i) (n + 1)

tactic: introv h
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hrec
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
i : B F a
⊢ ∀ (ps : Path F), n = length ps → iselect ps (f₂ i) = iselect ps (f₁ i)

tactic: specialize hrec (⟨_, i⟩ :: ps) (congr_arg _ h)
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hrec
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
i : B F a
ps : Path F
h : n = length ps
⊢ iselect ps (f₂ i) = iselect ps (f₁ i)

tactic: simp only [iselect_cons] at hrec
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hrec
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
i : B F a
ps : Path F
h : n = length ps
hrec :
  iselect ({ fst := a, snd := i } :: ps) (M.mk { fst := a, snd := f₂ }) =
    iselect ({ fst := a, snd := i } :: ps) (M.mk { fst := a, snd := f₁ })
⊢ iselect ps (f₂ i) = iselect ps (f₁ i)

tactic: exact hrec
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hrec
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
i : B F a
ps : Path F
h : n = length ps
hrec : iselect ps (f₂ i) = iselect ps (f₁ i)
⊢ iselect ps (f₂ i) = iselect ps (f₁ i)

tactic: (have := mk_inj ‹_›; cases this)
state_before: case succ.step.step.f.f.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a✝⁷ : F.A
x✝ y✝¹ : B F a✝⁷ → M F
a✝⁶ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝¹ i)
a✝⁵ : F.A
f✝¹ : B F a✝⁵ → M F
a✝⁴ : M.mk { fst := a✝⁵, snd := f✝¹ } = M.mk { fst := a✝⁷, snd := y✝¹ }
a✝³ : F.A
f✝ : B F a✝³ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝⁵, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝³, snd := f✝ })
y✝ : B F a✝⁷ → M F
a✝² : M.mk { fst := a✝³, snd := f✝ } = M.mk { fst := a✝⁷, snd := y✝ }
a✝¹ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝ i)
a✝ : M.mk { fst := a✝⁷, snd := x✝ } = M.mk { fst := a✝⁷, snd := x✝ }
⊢ MIntl.approx (M.mk { fst := a✝⁵, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝³, snd := f✝ }) (succ n + 1)

tactic: have := mk_inj ‹_›
state_before: case succ.step.step.f.f.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a✝⁷ : F.A
x✝ y✝¹ : B F a✝⁷ → M F
a✝⁶ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝¹ i)
a✝⁵ : F.A
f✝¹ : B F a✝⁵ → M F
a✝⁴ : M.mk { fst := a✝⁵, snd := f✝¹ } = M.mk { fst := a✝⁷, snd := y✝¹ }
a✝³ : F.A
f✝ : B F a✝³ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝⁵, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝³, snd := f✝ })
y✝ : B F a✝⁷ → M F
a✝² : M.mk { fst := a✝³, snd := f✝ } = M.mk { fst := a✝⁷, snd := y✝ }
a✝¹ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝ i)
a✝ : M.mk { fst := a✝⁷, snd := x✝ } = M.mk { fst := a✝⁷, snd := x✝ }
⊢ MIntl.approx (M.mk { fst := a✝⁵, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝³, snd := f✝ }) (succ n + 1)

tactic: cases this
state_before: case succ.step.step.f.f.refl.refl
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
hrec✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a✝⁷ : F.A
x✝ y✝¹ : B F a✝⁷ → M F
a✝⁶ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝¹ i)
a✝⁵ : F.A
f✝¹ : B F a✝⁵ → M F
a✝⁴ : M.mk { fst := a✝⁵, snd := f✝¹ } = M.mk { fst := a✝⁷, snd := y✝¹ }
a✝³ : F.A
f✝ : B F a✝³ → M F
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a✝⁵, snd := f✝¹ }) = iselect ps (M.mk { fst := a✝³, snd := f✝ })
y✝ : B F a✝⁷ → M F
a✝² : M.mk { fst := a✝³, snd := f✝ } = M.mk { fst := a✝⁷, snd := y✝ }
a✝¹ : ∀ (i : B F a✝⁷), Agree' n (x✝ i) (y✝ i)
a✝ : M.mk { fst := a✝⁷, snd := x✝ } = M.mk { fst := a✝⁷, snd := x✝ }
this : { fst := a✝⁷, snd := x✝ } = { fst := a✝⁷, snd := x✝ }
⊢ MIntl.approx (M.mk { fst := a✝⁵, snd := f✝¹ }) (succ n + 1) =
    MIntl.approx (M.mk { fst := a✝³, snd := f✝ }) (succ n + 1)

tactic: solve_by_elim
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hx
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
i : B F a
⊢ Agree' n ?succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.z (f₂ i)

tactic: solve_by_elim
state_before: case succ.step.step.f.f.refl.refl.refl.refl.refl.e_a.h.hy
F : PFunctor
X : Type ?u.30265
f : X → Obj F X
inst✝¹ : Inhabited (M F)
inst✝ : DecidableEq F.A
n✝ : ℕ
x y z : M F
hx : Agree' n✝ z x
hy : Agree' n✝ z y
n_ih✝ : ∀ (ps : Path F), n✝ = length ps → iselect ps x = iselect ps y
n : ℕ
n_ih :
  ∀ (x y z : M F),
    Agree' n z x →
      Agree' n z y →
        (∀ (ps : Path F), n = length ps → iselect ps x = iselect ps y) → MIntl.approx x (n + 1) = MIntl.approx y (n + 1)
a : F.A
f₃ f₂ : B F a → M F
hAgree₂ : ∀ (i : B F a), Agree' n (f₃ i) (f₂ i)
f₁ : B F a → M F
hAgree₁ : ∀ (i : B F a), Agree' n (f₃ i) (f₁ i)
clr : M.mk { fst := a, snd := f₃ } = M.mk { fst := a, snd := f₃ }
hrec :
  ∀ (ps : Path F),
    succ n = length ps → iselect ps (M.mk { fst := a, snd := f₂ }) = iselect ps (M.mk { fst := a, snd := f₁ })
i : B F a
⊢ Agree' n (f₃ i) (f₁ i)