packages feed

liquidhaskell-0.2.1.0: include/Data/Set.spec

module spec Data.Set where

embed Data.Set.Set as Set_Set

----------------------------------------------------------------------------------------------
-- | Logical Set Operators: Interpreted "natively" by the SMT solver -------------------------
----------------------------------------------------------------------------------------------

-- | union
measure Set_cup  :: (Data.Set.Set a) -> (Data.Set.Set a) -> (Data.Set.Set a)

-- | intersection
measure Set_cap  :: (Data.Set.Set a) -> (Data.Set.Set a) -> (Data.Set.Set a)

-- | difference
measure Set_dif   :: (Data.Set.Set a) -> (Data.Set.Set a) -> (Data.Set.Set a)

-- | singleton
measure Set_sng   :: a -> (Data.Set.Set a)

-- | emptiness test
measure Set_emp   :: (Data.Set.Set a) -> Prop

-- | empty set 
measure Set_empty :: forall a. GHC.Types.Int -> (Data.Set.Set a)


-- | membership test
measure Set_mem  :: a -> (Data.Set.Set a) -> Prop

-- | inclusion test
measure Set_sub  :: (Data.Set.Set a) -> (Data.Set.Set a) -> Prop 

---------------------------------------------------------------------------------------------
-- | Refined Types for Data.Set Operations --------------------------------------------------
---------------------------------------------------------------------------------------------

isSubsetOf    :: (GHC.Classes.Ord a) => x:(Data.Set.Set a) -> y:(Data.Set.Set a) -> {v:Bool | ((Prop v) <=> (Set_sub x y))}
member        :: (GHC.Classes.Ord a) => x:a -> xs:(Data.Set.Set a) -> {v:Bool | ((Prop v) <=> (Set_mem x xs))}

empty         :: {v:(Data.Set.Set a) | (Set_emp v)}
singleton     :: x:a -> {v:(Data.Set.Set a) | v = (Set_sng x)}
insert        :: (GHC.Classes.Ord a) => x:a -> xs:(Data.Set.Set a) -> {v:(Data.Set.Set a) | v = (Set_cup xs (Set_sng x))}
delete        :: (GHC.Classes.Ord a) => x:a -> xs:(Data.Set.Set a) -> {v:(Data.Set.Set a) | v = (Set_dif xs (Set_sng x))}

union         :: GHC.Classes.Ord a => xs:(Data.Set.Set a) -> ys:(Data.Set.Set a) -> {v:(Data.Set.Set a) | v = (Set_cup xs ys)}
intersection  :: GHC.Classes.Ord a => xs:(Data.Set.Set a) -> ys:(Data.Set.Set a) -> {v:(Data.Set.Set a) | v = (Set_cap xs ys)}
difference    :: GHC.Classes.Ord a => xs:(Data.Set.Set a) -> ys:(Data.Set.Set a) -> {v:(Data.Set.Set a) | v = (Set_dif xs ys)}

fromList :: GHC.Classes.Ord a => xs:[a] -> {v:Data.Set.Set a | v = (listElts xs)}

---------------------------------------------------------------------------------------------
-- | The set of elements in a list ----------------------------------------------------------
---------------------------------------------------------------------------------------------

measure listElts :: [a] -> (Data.Set.Set a) 
listElts([])   = {v | (Set_emp v)}
listElts(x:xs) = {v | v = (Set_cup (Set_sng x) (listElts xs)) }