prolog 0.3 → 0.3.1
raw patch · 3 files changed
+12/−9 lines, 3 files
Files
- prolog.cabal +3/−2
- src/Quote.hs +6/−4
- src/Unifier.hs +3/−3
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