{-@ LIQUID "--exact-data-con"                      @-}
{-@ LIQUID "--higherorder"                         @-}
{-@ LIQUID "--totality"                            @-}
{-@ LIQUID "--automatic-instances=liquidinstances" @-}

{-@ data List [llen] = Nil | Cons {lTl :: List} @-}
data List = Nil | Cons List

{-@ measure llen @-}
{-@ llen :: List -> Nat @-}
llen :: List -> Int
llen Nil      = 0
llen (Cons t) = 1 + llen t

{-@ reflect sz @-}
{-@ sz :: List -> Nat @-}
sz :: List -> Int
sz Nil      = 0
sz (Cons t) = 1 + sz t

-- THIS IS OK
{-@ ok :: { llen ((Cons Nil)) == 1 } @-}
ok = ()

-- THIS IS NOT
{-@ fails :: { sz (Cons Nil) == 1 } @-}
fails = ()