[Agda] Working with coinductive trees?

Nils Anders Danielsson nad at chalmers.se
Sat Feb 25 13:39:42 CET 2012


On 2012-02-24 16:11, Brandon Moore wrote:
> There's a bit of difficulty in Coq as unfolding terms has to
> be done by applying an equality, but it's mostly straightforward.

The lemma clo in your development relies on a feature of Coq which
breaks subject reduction.

> This seems to be rooted in generativity - it takes a bit of trouble
> with a with-clause to match on a delayed subterm, and even after doing
> so the results can't be recorded in the context by refining the
> subtree to look like (# pat).

Generativity is indeed annoying. You could try to avoid mentioning ♯_
unless absolutely possible. The attached development uses conditional
coinduction to accomplish this.

-- 
/NAD

-------------- next part --------------
module SK where

open import Coinduction
open import Data.Bool

mutual

  infixl 9 _$_

  data CL : Set where
    S K : CL
    _$_ : ∀ {lc rc} (l : ∞⟨ lc ⟩CL) (r : ∞⟨ rc ⟩CL) → CL

  ∞⟨_⟩CL : Bool → Set
  ∞⟨ true  ⟩CL = ∞ CL
  ∞⟨ false ⟩CL =   CL

♭? : ∀ {b} → ∞⟨ b ⟩CL → CL
♭? {b = true}  x = ♭ x
♭? {b = false} x =   x

infixl 9 _$⟶_
infix  4 _⟶_
infixr 2 _⟶⟨_⟩_
infix  2 _∎

data _⟶_ : CL → CL → Set where
  K⟶     : ∀ {xc yc} {x : ∞⟨ xc ⟩CL} {y : ∞⟨ yc ⟩CL} → K $ x $ y ⟶ ♭? x
  S⟶     : ∀ {xc yc zc} {x : ∞⟨ xc ⟩CL} {y : ∞⟨ yc ⟩CL} {z : ∞⟨ zc ⟩CL} →
           S $ x $ y $ z ⟶ (x $ z) $ (y $ z)
  _⟶⟨_⟩_ : ∀ x {y z : CL} (x⟶y : x ⟶ y) (y⟶z : y ⟶ z) → x ⟶ z
  _∎     : ∀ x → x ⟶ x
  _$⟶_   : ∀ {xc x′c yc y′c}
             {x : ∞⟨ xc ⟩CL} {x′ : ∞⟨ x′c ⟩CL}
             {y : ∞⟨ yc ⟩CL} {y′ : ∞⟨ y′c ⟩CL}
           (x⟶x′ : ♭? x ⟶ ♭? x′) (y⟶y′ : ♭? y ⟶ ♭? y′) → x $ y ⟶ x′ $ y′

I : CL
I = (S $ K) $ K

I-id : ∀ {xc} {x : ∞⟨ xc ⟩CL} → I $ x ⟶ ♭? x
I-id {x = x} =
  I $ x              ⟶⟨ S⟶ ⟩
  (K $ x) $ (K $ x)  ⟶⟨ K⟶ ⟩
  ♭? x               ∎

SIω : CL
SIω = S $ I $ ♯ SIω

SIω-unroll : SIω ⟶ S $ I $ SIω
SIω-unroll =
  SIω          ⟶⟨ (_ ∎) $⟶ (_ ∎) ⟩
  S $ I $ SIω  ∎

SIω-fix : ∀ {xc} (x : ∞⟨ xc ⟩CL) → SIω $ x ⟶ x $ (SIω $ x)
SIω-fix x =
  SIω $ x              ⟶⟨ SIω-unroll $⟶ (_ ∎) ⟩
  (S $ I $ SIω) $ x    ⟶⟨ S⟶ ⟩
  (I $ x) $ (SIω $ x)  ⟶⟨ I-id $⟶ (_ ∎) ⟩
  x $ (SIω $ x)        ∎


More information about the Agda mailing list