% Lazy Non-Deterministic Bools % Sebastian Fischer (sebf@informatik.uni-kiel.de) This module provides non-deterministic booleans.
> {-# LANGUAGE
>       NoMonomorphismRestriction,
>       MultiParamTypeClasses,
>       FlexibleInstances,
>       FlexibleContexts,
>       NoMonoPatBinds
>   #-}
>
> module CFLP.Types.Bool where
>
> import Control.Monad.State
>
> import CFLP
> import CFLP.Data.Types
> import CFLP.Data.Primitive
Instances for the classes `ApplyCons` and `Generic` for booleans are defined in the module `CFLP.Data.Generic`.
> false, true :: Monad m => Nondet c m Bool
> false :! true :! () = constructors
>
> pFalse, pTrue :: (Context c -> Nondet c m a) -> Match Bool c m a
> pFalse :! pTrue :! () = patterns
In order to be able to use logic variables of boolean type, we make it an instance of the type class `Narrow`.
> instance Narrow Bool
>  where
>   narrow = oneOf [false,true]
Some operations with `Bool`s:
> not :: CFLP s
>     => Data s Bool -> Context (Ctx s) -> Data s Bool
> not x = caseOf_ x [pFalse (const true)] false
>
> (===) :: CFLP s => Data s a -> Data s a -> Context (Ctx s) -> Data s Bool
> (x === y) (Context cs) = Typed $ do
>   eq <- evalStateT (prim_eq (untyped x) (untyped y)) cs
>   untyped $ if eq then true else false