{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.Queries.Enums where
import Data.SBV
import Data.SBV.Control
data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
mkSymbolicEnumeration ''Day
findDays :: IO [Day]
findDays :: IO [Day]
findDays = Symbolic [Day] -> IO [Day]
forall a. Symbolic a -> IO a
runSMT (Symbolic [Day] -> IO [Day]) -> Symbolic [Day] -> IO [Day]
forall a b. (a -> b) -> a -> b
$ do (d1 :: SDay) <- String -> Symbolic SDay
forall a. SymVal a => String -> Symbolic (SBV a)
free String
"d1"
(d2 :: SDay) <- free "d2"
(d3 :: SDay) <- free "d3"
constrain $ d1 .<= d2
constrain $ d2 .<= d3
constrain $ d3 .< sThursday
query $ do constrain $ distinct [d1, d2, d3]
cs <- checkSat
case cs of
CheckSatResult
Sat -> do a <- SDay -> Query Day
forall a. SymVal a => SBV a -> Query a
getValue SDay
d1
b <- getValue d2
c <- getValue d3
return [a, b, c]
CheckSatResult
_ -> String -> Query [Day]
forall a. HasCallStack => String -> a
error String
"Impossible, can't find days!"