| Safe Haskell | Safe | 
|---|---|
| Language | Haskell2010 | 
Logic
Contents
Synopsis
- type Logic = LogicT Identity
 - logic :: (forall r. (a -> r -> r) -> r -> r) -> Logic a
 - runLogic :: Logic a -> (a -> r -> r) -> r -> r
 - observeAll :: Logic a -> [a]
 - newtype LogicT (m :: * -> *) a = LogicT {
- unLogicT :: forall r. (a -> m r -> m r) -> m r -> m r
 
 - runLogicT :: LogicT m a -> (a -> m r -> m r) -> m r -> m r
 - observeT :: Monad m => LogicT m a -> m a
 - observeManyT :: Monad m => Int -> LogicT m a -> m [a]
 - observeAllT :: Monad m => LogicT m a -> m [a]
 - class MonadPlus m => MonadLogic (m :: * -> *)
 - msplit :: MonadLogic m => m a -> m (Maybe (a, m a))
 - interleave :: MonadLogic m => m a -> m a -> m a
 - (>>-) :: MonadLogic m => m a -> (a -> m b) -> m b
 - ifte :: MonadLogic m => m a -> (a -> m b) -> m b -> m b
 - once :: MonadLogic m => m a -> m a
 - reflect :: MonadLogic m => Maybe (a, m a) -> m a
 - lnot :: MonadLogic m => m a -> m ()
 
Logic
type Logic = LogicT Identity #
The basic Logic monad, for performing backtracking computations
 returning values of type a
logic :: (forall r. (a -> r -> r) -> r -> r) -> Logic a #
A smart constructor for Logic computations.
runLogic :: Logic a -> (a -> r -> r) -> r -> r #
Runs a Logic computation with the specified initial success and failure continuations.
observeAll :: Logic a -> [a] #
Extracts all results from a Logic computation.
LogicT
newtype LogicT (m :: * -> *) a #
A monad transformer for performing backtracking computations
 layered over another monad m
Instances
runLogicT :: LogicT m a -> (a -> m r -> m r) -> m r -> m r #
Runs a LogicT computation with the specified initial success and failure continuations.
observeT :: Monad m => LogicT m a -> m a #
Extracts the first result from a LogicT computation, failing otherwise.
observeManyT :: Monad m => Int -> LogicT m a -> m [a] #
Extracts up to a given number of results from a LogicT computation.
observeAllT :: Monad m => LogicT m a -> m [a] #
Extracts all results from a LogicT computation.
MonadLogic
class MonadPlus m => MonadLogic (m :: * -> *) #
Minimal implementation: msplit
Minimal complete definition
Instances
| MonadLogic [] | |
| Monad m => MonadLogic (LogicT m) | |
Defined in Control.Monad.Logic  | |
| (MonadLogic m, Monoid w) => MonadLogic (WriterT w m) | |
Defined in Control.Monad.Logic.Class  | |
| MonadLogic m => MonadLogic (StateT s m) | |
Defined in Control.Monad.Logic.Class  | |
| MonadLogic m => MonadLogic (StateT s m) | |
Defined in Control.Monad.Logic.Class  | |
| (MonadLogic m, Monoid w) => MonadLogic (WriterT w m) | |
Defined in Control.Monad.Logic.Class  | |
| MonadLogic m => MonadLogic (ReaderT e m) | |
Defined in Control.Monad.Logic.Class  | |
msplit :: MonadLogic m => m a -> m (Maybe (a, m a)) #
Attempts to split the computation, giving access to the first result. Satisfies the following laws:
msplit mzero == return Nothing msplit (return a `mplus` m) == return (Just (a, m))
interleave :: MonadLogic m => m a -> m a -> m a #
Fair disjunction. It is possible for a logical computation to have an infinite number of potential results, for instance:
odds = return 1 `mplus` liftM (2+) odds
Such computations can cause problems in some circumstances. Consider:
do x <- odds `mplus` return 2 if even x then return x else mzero
Such a computation may never consider the 'return 2', and will therefore never terminate. By contrast, interleave ensures fair consideration of both branches of a disjunction
(>>-) :: MonadLogic m => m a -> (a -> m b) -> m b infixl 1 #
Fair conjunction. Similarly to the previous function, consider the distributivity law for MonadPlus:
(mplus a b) >>= k = (a >>= k) `mplus` (b >>= k)
If 'a >>= k' can backtrack arbitrarily many tmes, (b >>= k) may never be considered. (>>-) takes similar care to consider both branches of a disjunctive computation.
ifte :: MonadLogic m => m a -> (a -> m b) -> m b -> m b #
Logical conditional. The equivalent of Prolog's soft-cut. If its first argument succeeds at all, then the results will be fed into the success branch. Otherwise, the failure branch is taken. satisfies the following laws:
ifte (return a) th el == th a ifte mzero th el == el ifte (return a `mplus` m) th el == th a `mplus` (m >>= th)
once :: MonadLogic m => m a -> m a #
Pruning. Selects one result out of many. Useful for when multiple results of a computation will be equivalent, or should be treated as such.
reflect :: MonadLogic m => Maybe (a, m a) -> m a #
The inverse of msplit. Satisfies the following law:
msplit m >>= reflect == m
lnot :: MonadLogic m => m a -> m () #
Inverts a logic computation. If m succeeds with at least one value,
 lnot m fails. If m fails, then lnot m succeeds the value ().