Coinductive records

{-# OPTIONS --cubical-compatible --guardedness #-}
open import Data.Sum
open import Data.Maybe as Maybe
open import Data.Nat
open import Relation.Binary.PropositionalEquality

open import Function.Base

Another option to model partiality, using coinduction. This was moved to a separate file to remove the --guardedness from

open import Partial
module _ where
private
  variable
    A B C : Set

Streams

record Stream (A : Set) : Set where
  coinductive
  field
    hd : A
    tl : Stream A

fromℕ→A : (  A)  Stream A
Stream.hd (fromℕ→A f) = f 0
Stream.tl (fromℕ→A f) = fromℕ→A (f  suc)

toℕ→A : Stream A  (  A)
toℕ→A s zero = Stream.hd s
toℕ→A s (suc k) = toℕ→A (Stream.tl s) k

Delay

record Delay (A : Set) : Set where
  coinductive
  field
    try : Delay A  A

module Delay⇒Stepped where
  f : Delay A    Maybe A
  f d zero = nothing
  f d (suc k) =
    case Delay.try d of λ
    { (inj₁ d')  f d' k
    ; (inj₂ a)  just a
    }
  f-mono :  d  is-mono (f {A} d)
  f-mono d (suc k) fdk-just with (Delay.try d)
  ... | inj₁ d' = f-mono d' k fdk-just
  ... | inj₂ y = refl

  step-indexed : Delay A  Step-Indexed A
  step-indexed d = record { f = f d ; f-mono = f-mono d }

module Stepped⇒Delay where
  delayed : Step-Indexed A  Delay A
  Delay.try (delayed s) =
    case f 0 of λ
    { (just x)  inj₂ x
    ; nothing  inj₁ (delayed (record
      { f = f  suc
      ; f-mono = f-mono  suc
      }))
    }
    where
      open Step-Indexed s

[End of lecture on 9 July 2026] Agda Quellcode herunterladen