我在Haskell实现了一个小的Prolog解释器,我有 到目前为止实现的数据类型是:
Term
,可以是变量或常量Predicate
,其中包含Term
s Goals
这是Predicate
s Rule
,其主体类型为Predicate
,列表为Goals
。Solution
即Yes
和变量的正确统一
或No
。现在我问的是如何制作一个需要的功能
两个谓词并在它们之间进行统一并返回
答案类型为Solution
?
这是我的代码:
data Term = Cons String |Var String deriving(Show)
data Predicate = Predicate String [Term] deriving(Show)
data Goals = Goals [Predicate] deriving(Show)
data Rule=Rule Predicate Goals deriving(Show)
data Solution =Yes [(Term,Term)]|No deriving(Show)
notEqual a b =a/=b
isCons (Cons _) = True
isCons _=False
isVar (Var _) =True
isVar _=False
bindTerms (y:ys) [] acc=No
bindTerms [](x:xs) acc=No
bindTerms [] [] acc=acc
bindTerms (x:xs) (y:ys) acc|isVar x && isCons y = bindTerms xs ys acc++(Var x,Cons y)
|isCons x&&isVar y =bindTerms xs ys acc++(Var y,Cons x)
|isCons x&& isCons y &&x==y =bindTerms xs ys acc++(Cons x,Cons y)
unify( Predicate a (x:xs)) (Predicate b (y:ys))= if( notEqual a b )then No
else if( bindTerms (x:xs) (y:ys))/=No then Yes bindTerms (x:xs) (y:ys)
现在我得到的是一个错误,因为布局说
表达式中的语法错误(意外的`}',可能是由于错误 布局)
但我的主要问题是如何在累加器(bindTerms
函数)中得到答案(术语列表)是我使用++
正确写的还是有另一种方法?