packages feed

MiniAgda-0.2014.1.9: test/fail/Tm.ma

-- 2010-11-06

sized codata Stream ++ (A : Set) : -Size -> Set
{ cons : [i : Size] -> (head : A) -> (tail : Stream A i) -> Stream A $i
} fields head, tail

cofun iterate 
  : [A : Set ] -> (step : A -> A) -> (start : A) ->
    [i : Size] -> Stream A i
{ iterate A step start ($ i) = cons i start (iterate A step (step start) i)
}
               
-- this might be accepted without trustme in future versions?!
trustme
data Tm : Set 
{ abs : ^(^Tm -> Tm) -> Tm
; app : ^Tm -> ^Tm -> Tm
}

fun sapp : ^Tm -> Tm
{ sapp x = app x x
}

let delta : Tm
  = abs (\ x -> sapp x)

let omega : Tm
  = app delta delta

fun step : Tm -> Tm
{ step (app (abs f) t) = f t
; step (app t u) = app (step t) u
; step (abs f)   = abs (\ x -> step (f x)) 
  -- rejected, since x not parametric
  -- think of f=id, then step would analyze x !
}

let steps : Tm -> Stream Tm #
  = \ start -> iterate Tm step start # 

eval let omegas : Stream Tm # = steps omega