Theorem: PFunctor.Approx.truncate_eq_of_agree
File: Mathlib/Data/PFunctor/Univariate/M.lean

tactic: induction n <;> cases x <;> cases y
state_before: F : PFunctor.{u}
n : ℕ
x : CofixA F n
y : CofixA F n.succ
h : Agree x y
⊢ truncate y = x
state_after: case zero.continue.intro
F : PFunctor.{u}
a✝¹ : F.A
a✝ : F.B a✝¹ → CofixA F 0
h : Agree CofixA.continue (CofixA.intro a✝¹ a✝)
⊢ truncate (CofixA.intro a✝¹ a✝) = CofixA.continue

case succ.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝⁴ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝³ : F.A
a✝² : F.B a✝³ → CofixA F n✝
a✝¹ : F.A
a✝ : F.B a✝¹ → CofixA F (n✝ + 1)
h : Agree (CofixA.intro a✝³ a✝²) (CofixA.intro a✝¹ a✝)
⊢ truncate (CofixA.intro a✝¹ a✝) = CofixA.intro a✝³ a✝²

tactic: rfl
state_before: case zero.continue.intro
F : PFunctor.{u}
a✝¹ : F.A
a✝ : F.B a✝¹ → CofixA F 0
h : Agree CofixA.continue (CofixA.intro a✝¹ a✝)
⊢ truncate (CofixA.intro a✝¹ a✝) = CofixA.continue
state_after: no goals

tactic: cases h
state_before: case succ.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝⁴ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝³ : F.A
a✝² : F.B a✝³ → CofixA F n✝
a✝¹ : F.A
a✝ : F.B a✝¹ → CofixA F (n✝ + 1)
h : Agree (CofixA.intro a✝³ a✝²) (CofixA.intro a✝¹ a✝)
⊢ truncate (CofixA.intro a✝¹ a✝) = CofixA.intro a✝³ a✝²
state_after: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝³ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝² : F.A
a✝¹ : F.B a✝² → CofixA F n✝
x'✝ : F.B a✝² → CofixA F (n✝ + 1)
a✝ : ∀ (i : F.B a✝²), Agree (a✝¹ i) (x'✝ i)
⊢ truncate (CofixA.intro a✝² x'✝) = CofixA.intro a✝² a✝¹

tactic: simp only [truncate, Function.comp, true_and_iff, eq_self_iff_true, heq_iff_eq]
state_before: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝³ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝² : F.A
a✝¹ : F.B a✝² → CofixA F n✝
x'✝ : F.B a✝² → CofixA F (n✝ + 1)
a✝ : ∀ (i : F.B a✝²), Agree (a✝¹ i) (x'✝ i)
⊢ truncate (CofixA.intro a✝² x'✝) = CofixA.intro a✝² a✝¹
state_after: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝³ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝² : F.A
a✝¹ : F.B a✝² → CofixA F n✝
x'✝ : F.B a✝² → CofixA F (n✝ + 1)
a✝ : ∀ (i : F.B a✝²), Agree (a✝¹ i) (x'✝ i)
⊢ (CofixA.intro a✝² fun x => truncate (x'✝ x)) = CofixA.intro a✝² a✝¹

tactic: rename_i n_ih a f y h₁
state_before: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
a✝³ : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a✝² : F.A
a✝¹ : F.B a✝² → CofixA F n✝
x'✝ : F.B a✝² → CofixA F (n✝ + 1)
a✝ : ∀ (i : F.B a✝²), Agree (a✝¹ i) (x'✝ i)
⊢ (CofixA.intro a✝² fun x => truncate (x'✝ x)) = CofixA.intro a✝² a✝¹
state_after: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y i)
⊢ (CofixA.intro a fun x => truncate (y x)) = CofixA.intro a f

tactic: suffices (fun x => truncate (y x)) = f
  by simp [this]
state_before: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y i)
⊢ (CofixA.intro a fun x => truncate (y x)) = CofixA.intro a f
state_after: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y i)
⊢ (fun x => truncate (y x)) = f

tactic: funext y
state_before: case succ.intro.intro.intro
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y i)
⊢ (fun x => truncate (y x)) = f
state_after: case succ.intro.intro.intro.h
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y✝ : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y✝ i)
y : F.B a
⊢ truncate (y✝ y) = f y

tactic: apply n_ih
state_before: case succ.intro.intro.intro.h
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y✝ : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y✝ i)
y : F.B a
⊢ truncate (y✝ y) = f y
state_after: case succ.intro.intro.intro.h.h
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y✝ : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y✝ i)
y : F.B a
⊢ Agree (f y) (y✝ y)

tactic: apply h₁
state_before: case succ.intro.intro.intro.h.h
F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y✝ : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y✝ i)
y : F.B a
⊢ Agree (f y) (y✝ y)
state_after: no goals

tactic: simp [this]
state_before: F : PFunctor.{u}
n✝ : ℕ
n_ih : ∀ (x : CofixA F n✝) (y : CofixA F n✝.succ), Agree x y → truncate y = x
a : F.A
f : F.B a → CofixA F n✝
y : F.B a → CofixA F (n✝ + 1)
h₁ : ∀ (i : F.B a), Agree (f i) (y i)
this : (fun x => truncate (y x)) = f
⊢ (CofixA.intro a fun x => truncate (y x)) = CofixA.intro a f
state_after: no goals