2014-10-12 34 views
2

我想写一个谓词,遵循一些简单的条件。它应该包含2个列表和2个变量,并且如果第一个变量位于第一个列表中的相同位置,并且第二个变量位于第二个列表中,则应该返回true。我做了一部分,但我努力争取其他部分的工作。这是我迄今为止所做的,但是在某种程度上,我需要检查列表中剩下的职位。在Prolog中的列表位置

position([A|_],[B|_],Var1,Var2):- 
    A = Var1, 
    B = Var2. 

我想例如能够这样写:提前

position([x,y,z],[1,2,3],z,3). 
true . 

感谢。

编辑

我已经试过,我写的东西继续给我假的,我认为这会工作,但它不...:

position([A|C],[B|D],Var1,Var2):- 
    A = Var1, 
    B = Var2, 
    position(C,D,Var1,Var2). 

不知道为什么这不工作..

回答

0

你需要两个子句,一个实施当你发现在相同的位置的变量和实现您用来走路列表,直到你找到你要找的内容递归条款一个条款的基本情况或到达列表的末尾。你几乎没有:

position([Head1| _], [Head2| _], Var1, Var2) :- 
    Head1 == Var1, 
    Head2 == Var2. 

position([_| Tail1], [_| Tail2], Var1, Var2) :- 
    position(Tail1, Tail2, Var1, Var2). 

请注意,您可能需要使用平等,(==)/2,如上所述,而不是统一的,(=)/2,作为两个变量总是统一。但是选择取决于对谓词的可能输入以及确切需要的语义。此外,可以有几种解决方案。如果你感兴趣的只是一个,你可以添加一个切到第一个子句的结束,或者在选择,你可以使用一个子句的IF-THEN-ELSE控制结构:

position([Head1| Tail1], [Head2| Tail2], Var1, Var2) :- 
    ( Head1 == Var1, 
     Head2 == Var2 -> 
     true 
    ; position(Tail1, Tail2, Var1, Var2) 
    ). 
+0

这似乎去工作,但我碰到了一个“问题”。我试图写位置([1],[x,y,z],Var1,Var2)。我期望得到答案Var1 = 1,Var2 = x;虚假的,但我只是'虚假'...任何想法? – Fjodor 2014-10-13 19:41:59

+0

该解决方案(和隐含的语义)要求您使用统一而不是平等。只需用'='运算符替换'=='运算符即可。 – 2014-10-13 20:27:15