haskell的小Prolog翻译

时间:2014-05-15 23:07:03

标签: haskell

我在Haskell实现了一个小的Prolog解释器,我有 到目前为止实现的数据类型是:

  1. a Term,可以是变量或常量
  2. Predicate,其中包含Term s
  3. 列表
  4. Goals这是Predicate s
  5. 的列表
  6. Rule,其主体类型为Predicate,列表为Goals
  7. SolutionYes和变量的正确统一 或No
  8. 现在我问的是如何制作一个需要的功能 两个谓词并在它们之间进行统一并返回 答案类型为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函数)中得到答案(术语列表)是我使用++正确写的还是有另一种方法?

0 个答案:

没有答案