module Data.Wellfounded.W where


The idea behind types is much simpler than they might appear at first brush, especially because their form is like that one of the β€œbig two” and However, the humble is much simpler: A value of is a tree with nodes labelled by and such that the branching factor of such a node is given by can be defined inductively:

data W {β„“ β„“'} (A : Type β„“) (B : A β†’ Type β„“') : Type (β„“ βŠ” β„“') where
  sup : (x : A) (f : B x β†’ W A B) β†’ W A B

The constructor sup stands for supremum: it bunches up (takes the supremum of) a bunch of subtrees, each subtree being given by a value of the branching factor for that node. The natural question to ask, then, is: β€œsupremum in what order?”. The order given by the β€œis a subtree of” relation!

module _ {β„“ β„“'} {A : Type β„“} {B : A β†’ Type β„“'} where
  _<_ : W A B β†’ W A B β†’ Type _
  x < sup i f = βˆƒ[ j ∈ B i ] (f j ≑ x)

This order is actually well-founded: if we want to prove a property of we may as well assume it’s been proven for any (transitive) subtree of

  W-well-founded : Wf _<_
  W-well-founded (sup x f) = acc Ξ» y y<sup β†’
    βˆ₯-βˆ₯-rec (Acc-is-prop _)
      (Ξ» { (j , p) β†’ subst (Acc _<_) p (W-well-founded (f j)) })

Inductive types are initial algebrasπŸ”—

We can use types to illustrate the general fact that inductive types correspond to initial algebras for certain endofunctors. Here, we are working in the β€œambient” of types and functions, and we are interested in the polynomial functor P:

  P : Type (β„“ βŠ” β„“') β†’ Type (β„“ βŠ” β„“')
  P C = Ξ£ A Ξ» a β†’ B a β†’ C

  P₁ : {C D : Type (β„“ βŠ” β„“')} β†’ (C β†’ D) β†’ P C β†’ P D
  P₁ f (a , h) = a , f ∘ h

A algebra (or algebra) is simply a type with a function

  WAlg : Type _
  WAlg = Ξ£ (Type (β„“ βŠ” β„“')) Ξ» C β†’ P C β†’ C

Algebras form a category, where an algebra homomorphism is a function that respects the algebra structure.

  _W→_ : WAlg → WAlg → Type _
  (C , c) Wβ†’ (D , d) = Ξ£ (C β†’ D) Ξ» f β†’ f ∘ c ≑ d ∘ P₁ f

Now the inductive W type defined above gives us a canonical

  W-algebra : WAlg
  W-algebra .fst = W A B
  W-algebra .snd (a , f) = sup a f

The claim is that this algebra is special in that it satisfies a universal property: it is initial in the aforementioned category of This means that, for any other there is exactly one homomorphism

  is-initial-WAlg : WAlg β†’ Type _
  is-initial-WAlg I = (C : WAlg) → is-contr (I W→ C)

Existence is easy: the algebra gives us exactly the data we need to specify a function W A B β†’ C by recursion, and the computation rules ensure that this respects the algebra structure definitionally.

  W-initial : is-initial-WAlg W-algebra
  W-initial (C , c) .centre = W-elim (Ξ» {a} f β†’ c (a , f)) , refl

For uniqueness, we proceed by induction, using the fact that g is a homomorphism.

  W-initial (C , c) .paths (g , hom) = Ξ£-pathp unique coherent where
    unique : W-elim (Ξ» {a} f β†’ c (a , f)) ≑ g
    unique = funext (W-elim Ξ» {a} {f} rec β†’ ap (Ξ» x β†’ c (a , x)) (funext rec)
                                          βˆ™ sym (hom $β‚š (a , f)))

There is one subtlety: being an algebra homomorphism is not a proposition in general, so we must also show that unique is in fact an algebra 2-cell, i.e.Β that it makes the following two identity proofs equal:

Luckily, this is completely straightforward.

    coherent : Square (Ξ» i β†’ unique i ∘ W-algebra .snd) refl hom (Ξ» i β†’ c ∘ P₁ (unique i))
    coherent = transpose (flip₁ (βˆ™-filler _ _))