packages feed

liquidhaskell-0.8.0.2: tests/todo/LocalRecursiveFuns.hs

module Blank where

data Tree a = Tip | Node a (Tree a) (Tree a)

tmap                :: (a -> b) -> Tree a -> Tree b
tmap f Tip          = Tip
tmap f (Node x l r) = Node (f x) (tmap f l) (tmap f r)

-----------------------------------------------------------
{-@ union :: t1:(Tree a) -> t2:(Tree a) -> (Tree a) /[(sz t1) + (sz t2)] @-}
-- union :: Tree a -> Tree a -> Tree a
union Tip          t = t
union (Node x a b) t = Node x taa tbb
  where
    taa              = union ta a
    tbb              = union tb b
    (ta,  tb)        = split x t

-----------------------------------------------------------

{-@ split :: a -> t:Tree a -> (TreeLe a t, TreeLe a t) @-}
split :: a -> Tree a -> (Tree a, Tree a)
split = undefined

{-@ type TreeLe a T = {v:Tree a | (sz v) <= (sz T)} @-}

{-@ data Tree [sz]  @-}

{-@ measure sz      :: Tree a -> Int
    sz (Tip)        = 0
    sz (Node x l r) = 1 + (sz l) + (sz r)
  @-}
  
{-@ invariant {v:(Tree a) | (sz v) >= 0} @-}

{-@ qualif TreeLt(v:Tree a, t:Tree b): (sz v) < (sz t) @-}