-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Constraint Functional-Logic Programming in Haskell
--
-- This package provides combinators for constraint functional-logic
-- programming ((C)FLP) in Haskell. The combinators might later be used
-- as a target language for compiling programs written in an FLP language
-- like Curry or Toy. Another application of FLP is demand driven
-- test-case generation.
@package cflp
@version 2009.1.13
module Control.CFLP
class (MonadUpdate s m, Update s m m, ChoiceStore s) => CFLP s m
type CS = ChoiceStoreIM
data UpdateT s m a
class ChoiceStore s
type Computation m a = Context CS -> ID -> Nondet CS (UpdateT CS m) a
eval :: (CFLP CS m, Update CS m m', Data a) => Strategy m' -> (Context CS -> ID -> Nondet CS m a) -> IO [a]
evalPartial :: (CFLP CS m, Update CS m m', Data a) => Strategy m' -> (Context CS -> ID -> Nondet CS m a) -> IO [a]
evalPrint :: (CFLP CS m, Update CS m m', Data a, Show a) => Strategy m' -> (Context CS -> ID -> Nondet CS m a) -> IO ()
type Strategy m = forall a. m a -> [a]
depthFirst :: Strategy []
data NormalForm
data Nondet cs m a
newtype Context cs
Context :: cs -> Context cs
data ID
initID :: IO ID
withUnique :: (With ID a) => a -> ID -> Nondet (C ID a) (M ID a) (T ID a)
class (ChoiceStore cs) => Narrow cs a
narrow :: (Narrow cs a, MonadUpdate cs m) => Context cs -> ID -> Nondet cs m a
unknown :: (MonadUpdate cs m, Narrow cs a) => ID -> Nondet cs m a
failure :: (MonadPlus m) => Nondet cs m a
oneOf :: (MonadUpdate cs m, ChoiceStore cs) => [Nondet cs m a] -> Context cs -> ID -> Nondet cs m a
(?) :: (MonadUpdate cs m, ChoiceStore cs) => Nondet cs m a -> Nondet cs m a -> ID -> Nondet cs m a
withHNF :: (Update cs m m) => Nondet cs m a -> (HeadNormalForm cs m -> Context cs -> Nondet cs m b) -> Context cs -> Nondet cs m b
caseOf :: (Update cs m m) => Nondet cs m a -> [Match a cs m b] -> Context cs -> Nondet cs m b
caseOf_ :: (Update cs m m) => Nondet cs m a -> [Match a cs m b] -> Nondet cs m b -> Context cs -> Nondet cs m b
data Match a cs m b
-- | The Data class comprehends a fundamental primitive
-- gfoldl for folding over constructor applications, say terms.
-- This primitive can be instantiated in several ways to map over the
-- immediate subterms of a term; see the gmap combinators later
-- in this class. Indeed, a generic programmer does not necessarily need
-- to use the ingenious gfoldl primitive but rather the intuitive
-- gmap combinators. The gfoldl primitive is completed by
-- means to query top-level constructors, to turn constructor
-- representations into proper terms, and to list all possible datatype
-- constructors. This completion allows us to serve generic programming
-- scenarios like read, show, equality, term generation.
--
-- The combinators gmapT, gmapQ, gmapM, etc are all
-- provided with default definitions in terms of gfoldl, leaving
-- open the opportunity to provide datatype-specific definitions. (The
-- inclusion of the gmap combinators as members of class
-- Data allows the programmer or the compiler to derive
-- specialised, and maybe more efficient code per datatype. Note:
-- gfoldl is more higher-order than the gmap combinators.
-- This is subject to ongoing benchmarking experiments. It might turn out
-- that the gmap combinators will be moved out of the class
-- Data.)
--
-- Conceptually, the definition of the gmap combinators in terms
-- of the primitive gfoldl requires the identification of the
-- gfoldl function arguments. Technically, we also need to
-- identify the type constructor c for the construction of the
-- result type from the folded term type.
--
-- In the definition of gmapQx combinators, we use
-- phantom type constructors for the c in the type of
-- gfoldl because the result type of a query does not involve the
-- (polymorphic) type of the term argument. In the definition of
-- gmapQl we simply use the plain constant type constructor
-- because gfoldl is left-associative anyway and so it is readily
-- suited to fold a left-associative binary operation over the immediate
-- subterms. In the definition of gmapQr, extra effort is needed. We use
-- a higher-order accumulation trick to mediate between left-associative
-- constructor application vs. right-associative binary operation (e.g.,
-- (:)). When the query is meant to compute a value of type
-- r, then the result type withing generic folding is r
-- -> r. So the result of folding is a function to which we
-- finally pass the right unit.
--
-- With the -XDeriveDataTypeable option, GHC can generate
-- instances of the Data class automatically. For example, given
-- the declaration
--
-- data T a b = C1 a b | C2 deriving (Typeable, Data)
--
-- GHC will generate an instance that is equivalent to
--
-- instance (Data a, Data b) => Data (T a b) where gfoldl k z (C1
-- a b) = z C1 `k` a `k` b gfoldl k z C2 = z C2 gunfold k z c = case
-- constrIndex c of 1 -> k (k (z C1)) 2 -> z C2 toConstr (C1 _ _) =
-- con_C1 toConstr C2 = con_C2 dataTypeOf _ = ty_T con_C1 = mkConstr ty_T
-- "C1" [] Prefix con_C2 = mkConstr ty_T "C2" [] Prefix ty_T = mkDataType
-- "Module.T" [con_C1, con_C2]
--
-- This is suitable for datatypes that are exported transparently.
class (Typeable a) => Data a
nondet :: (Monad m, Data a) => a -> Nondet cs m a
prim :: (Data a) => NormalForm -> a
groundNormalForm :: (Update cs m m') => Nondet cs m a -> Context cs -> m' NormalForm
partialNormalForm :: (Update cs m m', ChoiceStore cs) => Nondet cs m a -> Context cs -> m' NormalForm
class ConsRep a
consRep :: (ConsRep a) => a -> Constr
cons :: (MkCons cs m a b) => a -> b
match :: (ConsRep a, WithUntyped b) => a -> (Context (C b) -> b) -> Match t (C b) (M b) (T b)
apply :: (Update cs m m) => Nondet cs m (a -> b) -> Nondet cs m a -> Context cs -> ID -> Nondet cs m b
fun :: (Monad m, LiftFun f g, NestLambda g cs m t) => f -> Nondet cs m t
instance CFLP ChoiceStoreIM (UpdateT ChoiceStoreIM [])