packages feed

prolog 0.3 → 0.3.1

raw patch · 3 files changed

+12/−9 lines, 3 files

Files

prolog.cabal view
@@ -1,5 +1,5 @@ Name:                prolog-Version:             0.3+Version:             0.3.1 Synopsis:            A Prolog interpreter written in Haskell. Description:         A Prolog interpreter written in Haskell. Implements a subset of the Prolog language. License:             PublicDomain@@ -7,7 +7,7 @@ Maintainer:          Marcel Fourné (haskell@marcelfourne.de) Category:            Language Build-type:          Simple-Cabal-version:       >=1.6+Cabal-version:       >=1.10  Library   Exposed-modules: Language.Prolog@@ -22,6 +22,7 @@                    IsString                    Quote   Hs-Source-Dirs:  src+  Default-Language: Haskell98    Build-depends:     base >=4 && <5,
src/Quote.hs view
@@ -9,6 +9,7 @@ import Language.Haskell.TH.Lift (deriveLiftMany) import Language.Haskell.TH.Quote (QuasiQuoter(..)) import Text.Parsec (parse, eof, ParsecT)+import Text.Parsec.String (Parser) import Data.Generics (extQ, typeOf, Data)  import Prolog ( Term(..), VariableName, Clause(..), Goal@@ -26,14 +27,15 @@ c  = prologQuasiQuoter clause  "clause" pl = prologQuasiQuoter program "program" +prologQuasiQuoter :: (Data a, Lift a) => Parser a -> String -> QuasiQuoter prologQuasiQuoter parser name =    QuasiQuoter { quoteExp  = parsePrologExp parser name                , quotePat  = parsePrologPat parser name-               , quoteType = fail ("Prolog "++ name ++"s can't be Haskell types!")-               , quoteDec  = fail ("Prolog "++ name ++"s can't be Haskell declarations!")+               , quoteType = \ _ -> fail ("Prolog "++ name ++"s can't be Haskell types!")+               , quoteDec  = \ _ -> fail ("Prolog "++ name ++"s can't be Haskell declarations!")                } -parsePrologExp :: (Data a, Lift a) => ParsecT [Char] () Identity a -> String -> String -> Q Exp+parsePrologExp :: (Data a, Lift a) => Parser a -> String -> String -> Q Exp parsePrologExp parser name str = do    case parse (whitespace >> parser <* eof) ("(Prolog " ++ name ++ " expression)") str of       Right x -> const (fail $ "Quasi-quoted expressions of type " ++ show (typeOf x) ++ " are not implemented.")@@ -56,7 +58,7 @@       fail "Clauses using Haskell functions are not quasi-quotable."  -parsePrologPat :: (Data a, Lift a) => ParsecT [Char] () Identity a -> String -> String -> Q Pat+parsePrologPat :: (Data a, Lift a) => Parser a -> String -> String -> Q Pat parsePrologPat parser name str = do    case parse (whitespace >> parser <* eof) ("(Prolog " ++ name ++ " pattern)") str of       Right x -> viewP [e| (== $(lift x)) |] [p| True |]
src/Unifier.hs view
@@ -5,7 +5,7 @@    ) where -import Control.Monad (MonadPlus, mzero)+import Control.Monad (MonadFail, mzero) import Control.Arrow (second) import Data.Function (fix) import Data.Generics (everything, mkQ)@@ -16,7 +16,7 @@ type Substitution = (VariableName, Term)  -unify, unify_with_occurs_check :: MonadPlus m => Term -> Term -> m Unifier+unify, unify_with_occurs_check :: MonadFail m => Term -> Term -> m Unifier  unify = fix unify' @@ -34,7 +34,7 @@ unify' _ t (Var v)  = return [(v,t)] unify' self (Struct a1 ts1) (Struct a2 ts2) | a1 == a2 && same length ts1 ts2 =     unifyList self (zip ts1 ts2)-unify' _ _ _ = mzero+unify' _ _ _ = fail "unify'"  same :: Eq b => (a -> b) -> a -> a -> Bool same f x y = f x == f y