Theorem: MvQPF.Cofix.mk_dest
File: Mathlib/Data/QPF/Multivariate/Constructions/Cofix.lean

tactic: apply Cofix.bisim_rel (fun x y : Cofix F α => x = Cofix.mk (Cofix.dest y)) _ _ _ rfl
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x : Cofix F α
⊢ mk x.dest = x
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x : Cofix F α
⊢ ∀ (x y : Cofix F α),
    (fun x y => x = mk y.dest) x y →
      (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
        (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: dsimp
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x : Cofix F α
⊢ ∀ (x y : Cofix F α),
    (fun x y => x = mk y.dest) x y →
      (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
        (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x : Cofix F α
⊢ ∀ (x y : Cofix F α),
    x = mk y.dest →
      (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
        (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: intro x y h
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x : Cofix F α
⊢ ∀ (x y : Cofix F α),
    x = mk y.dest →
      (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
        (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: rw [h]
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> x.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> (mk y.dest).dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: conv =>
  lhs
  congr
  rfl
  rw [Cofix.mk]
  rw [Cofix.dest_corec]
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> (mk y.dest).dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$>
      (TypeVec.id ::: corec fun x => (TypeVec.id ::: fun i => i.dest) <$$> x) <$$>
        (TypeVec.id ::: fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: rw [← comp_map, ← appendFun_comp, id_comp]
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$>
      (TypeVec.id ::: corec fun x => (TypeVec.id ::: fun i => i.dest) <$$> x) <$$>
        (TypeVec.id ::: fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: (Quot.mk fun x y => x = mk y.dest) ∘ corec fun x => (TypeVec.id ::: fun i => i.dest) <$$> x) <$$>
      (TypeVec.id ::: fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: rw [← comp_map, ← appendFun_comp, id_comp, ← Cofix.mk]
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: (Quot.mk fun x y => x = mk y.dest) ∘ corec fun x => (TypeVec.id ::: fun i => i.dest) <$$> x) <$$>
      (TypeVec.id ::: fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: ((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest

tactic: congr
state_before: n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: ((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) <$$> y.dest =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest) <$$> y.dest
state_after: case e_a
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: ((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest)

tactic: apply congrArg
state_before: case e_a
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (TypeVec.id ::: ((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) =
    (TypeVec.id ::: Quot.mk fun x y => x = mk y.dest)
state_after: case e_a.h
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) = Quot.mk fun x y => x = mk y.dest

tactic: funext x
state_before: case e_a.h
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝ x y : Cofix F α
h : x = mk y.dest
⊢ (((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) = Quot.mk fun x y => x = mk y.dest
state_after: case e_a.h.h
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝¹ x✝ y : Cofix F α
h : x✝ = mk y.dest
x : Cofix F α
⊢ (((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) x = Quot.mk (fun x y => x = mk y.dest) x

tactic: apply Quot.sound
state_before: case e_a.h.h
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝¹ x✝ y : Cofix F α
h : x✝ = mk y.dest
x : Cofix F α
⊢ (((Quot.mk fun x y => x = mk y.dest) ∘ mk) ∘ fun i => i.dest) x = Quot.mk (fun x y => x = mk y.dest) x
state_after: case e_a.h.h.a
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝¹ x✝ y : Cofix F α
h : x✝ = mk y.dest
x : Cofix F α
⊢ mk ((fun i => i.dest) x) = mk x.dest

tactic: rfl
state_before: case e_a.h.h.a
n : ℕ
F : TypeVec.{u} (n + 1) → Type u
q : MvQPF F
α : TypeVec.{u} n
x✝¹ x✝ y : Cofix F α
h : x✝ = mk y.dest
x : Cofix F α
⊢ mk ((fun i => i.dest) x) = mk x.dest
state_after: no goals