logict-state 0.1.0.0 → 0.1.0.1
raw patch · 2 files changed
+6/−133 lines, 2 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Control.Monad.LogicState.Examples: main :: IO ()
- Control.Monad.TransLogicState.Class: observeManyT :: (TransLogicState s t, Monad m) => s -> Int -> t m a -> m [a]
+ Control.Monad.TransLogicState.Class: observeManyT :: forall m a. (TransLogicState s t, Monad m) => s -> Int -> t m a -> m [a]
Files
logict-state.cabal view
@@ -1,8 +1,8 @@--- Initial logict-backtrack.cabal generated by cabal init. For further +-- Initial logict-backtrack.cabal generated by cabal init. For further -- documentation, see http://haskell.org/cabal/users-guide/ name: logict-state-version: 0.1.0.0+version: 0.1.0.1 synopsis: Library for logic programming based on haskell package logict description: Logic programming built on top of part of logict library, in particular for dealing with backtrackable state homepage: https://github.com/atzedijkstra/logict-state@@ -10,10 +10,10 @@ license-file: LICENSE author: Atze Dijkstra maintainer: atzedijkstra@gmail.com--- copyright: +-- copyright: category: Development build-type: Simple--- extra-source-files: +-- extra-source-files: cabal-version: >=1.10 source-repository head@@ -23,11 +23,10 @@ library exposed-modules: Control.Monad.LogicState, Control.Monad.LogicState.Class,- Control.Monad.TransLogicState.Class,- Control.Monad.LogicState.Examples+ Control.Monad.TransLogicState.Class other-modules: Control.Monad.LogicState.Logic default-extensions: MultiParamTypeClasses- build-depends: base >=4.8 && <4.9,+ build-depends: base >=4.8 && < 4.10, mtl >= 2.1, transformers >= 0.4.2, logict >= 0.6.0.2
− src/Control/Monad/LogicState/Examples.hs
@@ -1,126 +0,0 @@-{-# LANGUAGE FlexibleInstances, UndecidableInstances, ExistentialQuantification, RankNTypes, ScopedTypeVariables #-}--module Control.Monad.LogicState.Examples- ( main- )- where--import Control.Monad-import Control.Monad.Trans.Class-import Control.Monad.State.Strict as StStr--- import qualified Control.Monad.State.Strict as StStr-import qualified Control.Monad.State.Lazy as StLaz--import Control.Monad.LogicState.Logic-import Control.Monad.LogicState---odds :: MonadPlus m => m Int-odds = (return 1) `mplus` (odds >>= \a -> return (2 + a))--{------------------------------------------------------------------------------------------------------- Basic queens-queens1 :: Int -> [[Int]]-queens1 n = filter test (generate n)- where generate 0 = [[]]- generate k = [q : qs | q <- [1..n], qs <- generate (k-1)]- test [] = True- test (q:qs) = isSafe q qs && test qs- isSafe try qs = not (try `elem` qs || sameDiag try qs)- sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs------------------------------------------------------------------------------------------------------ Basic queens, optimized with pruning-queens2 :: Int -> [[Int]]-queens2 n = map reverse $ queens' n- where queens' 0 = [[]]- queens' k = [q:qs | qs <- queens' (k-1), q <- [1..n], isSafe q qs]- isSafe try qs = not (try `elem` qs || sameDiag try qs)- sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs------------------------------------------------------------------------------------------------------ Logic queens-queens1L n = do- q <- generate1 n n- guard (test q)- return q- where- test [] = True- test (q:qs) = isSafe q qs && test qs- isSafe try qs = not (try `elem` qs || sameDiag try qs)- sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs--generate1 :: MonadPlus m => Int -> Int -> m [Int]-generate1 _ 0 = return []-generate1 n k = do- qs <- generate1 n (k-1)- msum $ map (return . (:qs)) [1..n]------------------------------------------------------------------------------------------------------ Logic queens, with pruning-queens2L n = do- q <- generate2 n n- return q--generate2 :: MonadPlus m => Int -> Int -> m [Int]-generate2 _ 0 = return []-generate2 n k = do- qs <- generate2 n (k-1)- msum $ flip map [1..n] $ \i -> do- let q = i : qs- guard (test q)- return q- where- test [] = True- test (q:qs) = isSafe q qs && test qs- isSafe try qs = not (try `elem` qs || sameDiag try qs)- sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs---}------------------------------------------------------------------------------------------------------ Logic queens, with pruning, with state-queens3L n = do- q <- generate3 n n- return q--count3g :: Monad m => LogicStateT Int Int m Int-count3g = state (\(g::Int, b::Int) -> (g,(g+1,b)))--count3gb :: Monad m => LogicStateT Int Int m (Int,Int)-count3gb = state (\(g::Int, b::Int) -> ((g,b),(g+1,b+1)))--generate3 :: Monad m => Int -> Int -> LogicStateT Int Int m ((Int,Int),[Int])-generate3 _ 0 = count3gb >>= \c -> return (c,[])-generate3 n k = do- (_,qs) <- generate3 n (k-1)- qss <- forM [1..n] $ \i -> backtrack $ do- let q = i : qs- guard (test q)- cnt <- count3gb- return (cnt,q)- foldr1 mplus qss-{-- foldr1 mplus $ flip map [1..n] $ \i -> do- let q = i : qs- guard (test q)- cnt <- count3gb- return (cnt,q)--}- where- test [] = True- test (q:qs) = isSafe q qs && test qs- isSafe try qs = not (try `elem` qs || sameDiag try qs)- sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs---main = do- -- forM_ (queens1 8) print- -- forM_ (queens2 8) print- -- forM_ (observeAll () $ queens1L 8) print- -- forM_ (observeAll () $ (queens2L 8 :: Logic [Int])) print- -- forM_ (observeAll (0::Int,0::Int) $ (queens3L 8 :: LogicVar Int Int ((Int,Int),[Int]))) print- forM_ (observeMany (0::Int,0::Int) 500 $ (queens3L 10 :: LogicState Int Int ((Int,Int),[Int]))) print- -- forM_ (observe (0::Int,0::Int) $ (queens3L 8 :: LogicVar Int Int ((Int,Int),[Int]))) print