module InitialTAlgebra where
open import Prelude
open import QuotientViaPrimTrustme+Private
postulate
T : Set → Set
T' : {X Y : Set} → (X → Y) → T X → T Y
Tid :
{X : Set}
(x : T X)
→
x ≡ T' id x
T∘ :
{X Y Z : Set}
(g : Y → Z)
(f : X → Y)
(x : T X)
→
T' g (T' f x) ≡ T' (g ∘ f) x
{-# POLARITY T ++ #-}
record isTAlg (A : Set) : Set₁ where
constructor mkalg
field
sup : T A → A
open isTAlg ⦃ ... ⦄ public
isTAlgMor :
{A B : Set}
{{α : isTAlg A}}
{{β : isTAlg B}}
(h : A → B)
→
Set
isTAlgMor h = ∀ e → h (sup e) ≡ sup (T' h e)
record isInitialTAlg (A : Set){{_ : isTAlg A}} : Set₁ where
field
fun : (B : Set){{_ : isTAlg B}} → A → B
mor : (B : Set){{_ : isTAlg B}} → isTAlgMor (fun B)
unq :
(B : Set)
{{_ : isTAlg B}}
(f : A → B)
(_ : isTAlgMor f)
→
fun B ≡ f
open isInitialTAlg{{...}} public
module NonTerminating where
data M : Set where
mu : T M → M
instance
isTAlgM : isTAlg M
sup{{isTAlgM}} = mu
module _
(X : Set)
{{ξ : isTAlg X}}
where
{-# TERMINATING #-}
rec : M → X
rec (mu t) = sup (T' rec t)
isTAlgMorrec : isTAlgMor rec
isTAlgMorrec _ = refl
module _
(f : M → X)
(isTAlgMorf : isTAlgMor f)
where
{-# TERMINATING #-}
uniq : rec ≡ f
uniq = funext λ{(mu t) →
proof
sup (T' rec t)
=[ ap (λ f → sup (T' f t)) uniq ]
sup (T' f t)
=[ symm (isTAlgMorf _) ]
f (mu t)
qed}
initialTAlg : isInitialTAlg M
fun {{initialTAlg}} = rec
mor {{initialTAlg}} = isTAlgMorrec
unq {{initialTAlg}} = uniq
module Unsuccessful where
data M (i : Size) : Set where
mu : (j : Size< i) → T(M j) → M i
M∞ : Set
M∞ = M ∞
φ :
(i : Size)
(j : Size≤ i)
→
M j → M i
φ _ _ (mu k x) = mu k x
φid :
(i : Size)
(x : M i)
→
φ i i x ≡ x
φid _ (mu _ _) = refl
postulate
muφ :
(i : Size)
(j : Size< i)
(k : Size< j)
(t : T(M k))
→
mu j (T' (φ j k) t) ≡ mu k t
instance
isTAlgM∞ : isTAlg M∞
sup{{isTAlgM∞}} = mu ∞
module _
(X : Set)
{{ξ : isTAlg X}}
where
rec : (i : Size) → M i → X
rec i (mu j t) = sup (T' (rec j) t)
rec∞ : M∞ → X
rec∞ = rec ∞
isTAlgMorrec∞ : isTAlgMor rec∞
isTAlgMorrec∞ _ = refl
module _
(f : M∞ → X)
(isTAlgMorf : isTAlgMor f)
where
uniq :
(i : Size)
(x : M i)
→
rec i x ≡ f (φ ∞ i x)
uniq i (mu j t) =
proof
sup (T' (rec j) t)
=[ ap (λ f → sup (T' f t)) (funext (uniq j)) ]
sup (T' (f ∘ φ ∞ j) t)
=[ ap sup (symm (T∘ _ _ _)) ]
sup (T' f (T' (φ ∞ j) t))
=[ symm (isTAlgMorf _) ]
f (mu ∞ (T' (φ ∞ j) t))
=[ ap f (muφ ∞ ∞ j t) ]
f (mu j t)
qed
uniq∞ : rec∞ ≡ f
uniq∞ = funext λ x →
proof
rec ∞ x
=[ uniq ∞ _ ]
f (φ ∞ ∞ x)
=[ ap f (φid ∞ _) ]
f x
qed
initialTAlg : isInitialTAlg M∞
fun {{initialTAlg}} = rec∞
mor {{initialTAlg}} = isTAlgMorrec∞
unq {{initialTAlg}} = uniq∞
module Successful where
mutual
data M (i : Size) : Set where
mu : (j : Size< i) → T (Q j) → M i
data R (i : Size) : M i → M i → Set where
muψ :
(j : Size< i)
(k : Size< j)
(t : T (Q k))
→
R i (mu j (T' (ψ j k) t)) (mu k t)
Q : Size → Set
Q i = M i / R i
φ : (i : Size)(j : Size≤ i) → M j → M i
φ _ _ (mu k x) = mu k x
φresp :
(i : Size)
(j : Size≤ i)
{x y : M j}
(_ : R j x y)
→
R i (φ i j x) (φ i j y)
φresp _ _ (muψ k l t) = muψ k l t
ψ : (i : Size)(j : Size≤ i) → Q j → Q i
ψ i j =
quot.lift (quot.mk (R i) ∘ φ i j) (quot.eq (R i) ∘ φresp i j)
φid :
(i : Size)
(x : M i)
→
φ i i x ≡ x
φid _ (mu _ _) = refl
ψid :
(i : Size)
(x : Q i)
→
ψ i i x ≡ x
ψid i =
quot.elim (R i)
(λ x → ψ i i x ≡ x)
(λ{(mu _ _) → refl})
(λ r → uip' (quot.eq (R i) r))
Q∞ : Set
Q∞ = Q ∞
qu : (i : Size) → T (Q i) → Q∞
qu i = quot.mk (R ∞) ∘ mu i
quψ :
(i : Size)
(j : Size< i)
(t : T(Q j))
→
qu i (T' (ψ i j) t) ≡ qu j t
quψ i j = quot.eq (R ∞) ∘ muψ i j
instance
isTAlgQ∞ : isTAlg Q∞
sup{{isTAlgQ∞}} = qu ∞
module _
(X : Set)
{{ξ : isTAlg X}}
where
mutual
rec : (i : Size) → Q i → X
rec i = quot.lift (rec' i) (receq i)
rec' : (i : Size) → M i → X
rec' _ (mu j t) = sup (T' (rec j) t)
receq :
(i : Size)
{x y : M i}
(_ : R i x y)
→
rec' i x ≡≡ rec' i y
receq _ (muψ j k t) =
proof
sup (T' (rec j) (T' (ψ j k) t))
=[ ap sup (T∘ (rec j) (ψ j k) t) ]
sup (T' (rec j ∘ ψ j k) t)
=[ ap (λ g → sup (T' g t)) (recψ j k) ]
sup (T' (rec k) t)
qed
rec'φ :
(i : Size)
(j : Size< i)
(x : M j)
→
rec' i (φ i j x) ≡ rec' j x
rec'φ _ _ (mu _ x) = refl
recψ :
(i : Size)
(j : Size< i)
→
rec i ∘ ψ i j ≡ rec j
recψ i j =
funext (quot.elim (R j)
(λ x → rec i (ψ i j x) ≡ rec j x)
(rec'φ i j)
(λ r → uip' (ap (rec j) (quot.eq (R j) r))))
rec∞ : Q∞ → X
rec∞ = rec ∞
isTAlgMorrec∞ : isTAlgMor rec∞
isTAlgMorrec∞ _ = refl
module _
(f : Q∞ → X)
(isTAlgMorf : isTAlgMor f)
where
uniq :
(i : Size)
(x : Q i)
→
rec i x ≡ f (ψ ∞ i x)
uniq i =
quot.elim (R i)
(λ x → rec i x ≡ f (ψ ∞ i x))
(λ{(mu j t) → symm (g j t)})
(λ e → uip (ap (rec i) (quot.eq (R i) e)))
where
g :
(j : Size< i)
(t : T (Q j))
→
f (qu j t) ≡ sup (T' (rec j) t)
g j t =
proof
f (qu j t)
=[ ap f (symm (quψ ∞ _ _)) ]
f (sup (T' (ψ ∞ j) t))
=[ isTAlgMorf _ ]
sup (T' f (T' (ψ ∞ j) t))
=[ ap sup (T∘ _ _ _) ]
sup (T' (f ∘ ψ ∞ j) t)
=[ ap (λ f → sup (T' f t)) (symm (funext (uniq j))) ]
sup (T' (rec j) t)
qed
uniq∞ : rec∞ ≡ f
uniq∞ = funext λ x →
proof
rec∞ x
=[ uniq ∞ _ ]
f (ψ ∞ ∞ x)
=[ ap f (ψid ∞ _) ]
f x
qed
initialTAlg : isInitialTAlg Q∞
fun {{initialTAlg}} = rec∞
mor {{initialTAlg}} = isTAlgMorrec∞
unq {{initialTAlg}} = uniq∞