packages feed

Agda-2.3.2.2: test/succeed/SizedCoinductiveRecords.agda

{-# OPTIONS --copatterns --sized-types --experimental-irrelevance #-}
{-# OPTIONS --show-implicit --show-irrelevant #-}
{-# OPTIONS -v tc.polarity:10 -v tc.pos:15 -v tc.size.solve:100 #-}
module SizedCoinductiveRecords where

open import Common.Size

postulate
  Size< : ..(_ : Size) → Set
{-# BUILTIN SIZELT Size< #-}

-- Subtyping for Size<

emb< : {i : Size} → Size< i → Size
emb< {i} j = j

-- Use Size< hypotheses

data Empty : {i : Size} → Set where
  empty : {i : Size} → Empty {i} → Empty {↑ i}

subEmpty : {i : Size}{j : Size< i} → Empty {j} → Empty {i}
subEmpty x = x

-- SHOULD FAIL:
-- fail : {i : Size}{j : Size< i} → Empty {i} → Empty {j}
-- fail x = x

-- Covariance for Size<

co : {i : Size}{j : Size< i} → Size< j → Size< i
co k = k

-- Contravariance for bounded quantification

Bounded : Size → Set
Bounded i = (j : Size< i) → Empty {j}

contra : {i : Size}{j : Size< i} → Bounded i → Bounded j
contra k = k

-- sized naturals

data Nat ..{i : Size} : Set where
  zero : Nat
  suc  : .{j : Size< i} → Nat {j} → Nat

mono : {i : Size}{j : Size< i} → Nat {j} → Nat {i}
mono n = n

id : .{i : Size} → Nat {i} → Nat {i}
id (zero) = zero
id (suc n) = suc (id n)

monus : .{i : Size} → Nat {i} → Nat → Nat {i}
monus x zero = x
monus zero y = zero
monus (suc x) (suc y) = monus x y

div : .{i : Size} → Nat {i} → Nat → Nat {i}
div zero    y = zero
div (suc x) y = suc (div (monus x y) y)

-- sized streams

module STREAM where

  record Stream (A : Set) ..{i : Size} : Set where
    coinductive
    constructor _∷_
    field
      head : A
      tail : .{j : Size< i} → Stream A {j}
  open Stream

  map : {A B : Set}(f : A → B).{i : Size} → Stream A {i} → Stream B {i}
  head (map f s) = f (head s)
  tail (map f s) = map f (tail s)

  -- stream antitone

  anti : {A : Set}{i : Size}{j : Size< i} → Stream A {i} → Stream A {j}
  anti s = s

  anti' : {A : Set}{i : Size}{j : Size< i} → (Stream A {j} → A) → (Stream A {i} → A)
  anti' f = f

-- Spanning tree

data List (A : Set) ..{i : Size} : Set where
  []  : List A
  _∷_ : .{j : Size< i}(x : A)(xs : List A {j}) → List A

map : {A B : Set}(f : A → B).{i : Size} → List A {i} → List B {i}
map f [] = []
map f (x ∷ xs) = f x ∷ map f xs

module Graph (I : Set)(adj : I → List I) where

  record Span ..{i : Size} : Set where
    coinductive
    constructor span
    field
      root  : I
      nodes : {j : Size< i} → List (Span {j})
  open Span

  {-# NO_TERMINATION_CHECK #-}
  tree : {i : Size} → I → Span {i}
  root  (tree root) = root
  nodes (tree root) = map (tree) (adj root)
  -- nodes (tree root) = λ {j} → map (tree {j}) (adj root)