module Measures where import Data.Set {-@ LIQUID "--no-termination" @-} {-@ measure elements @-} {-@ measure dups @-} data F a = F a | C a (F a) | E dups :: Ord a => F a -> Set a dups E = empty dups (F a) = empty dups (C x xs) = if member x (elements xs) then singleton x `union` dups xs else dups xs elements :: Ord a => F a -> Set a elements E = empty elements (F a) = singleton a elements (C x xs) = singleton x `union` elements xs {-@ foo :: (Ord a) => x:F a -> {v:Set a | (dups x) = v} @-} foo :: Ord a => F a -> Set a foo E = empty foo (F a) = empty foo (C x xs) = if member x (elements xs) then singleton x `union` foo xs else foo xs {-@ prop :: { v: Bool | v } @-} prop = dups s == empty where s = C 1 (C 3 (F 1)) :: F Int