在Prolog中列出位置

在Prolog中列出位置,prolog,Prolog,我试图编写一个遵循一些简单条件的谓词。它应该包含2个列表和2个变量,如果第一个变量位于第一个列表中的同一位置,并且第二个变量位于第二个列表中,那么它应该返回true。我做了一部分,但我正在努力让另一部分工作。这是我目前为止所做的,但在某种程度上,我需要检查列表中的其他位置 position([A|_],[B|_],Var1,Var2):- A = Var1, B = Var2. 例如,我希望能够这样写: position([x,y,z],[1,2,3],z,3). true

我试图编写一个遵循一些简单条件的谓词。它应该包含2个列表和2个变量,如果第一个变量位于第一个列表中的同一位置,并且第二个变量位于第二个列表中,那么它应该返回true。我做了一部分,但我正在努力让另一部分工作。这是我目前为止所做的,但在某种程度上,我需要检查列表中的其他位置

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).

不确定这为什么不起作用。

您需要两个子句,一个实现在相同位置找到变量时的基本情况,另一个实现递归子句,您可以使用递归子句遍历列表,直到找到要查找的内容或到达列表的末尾。你就快到了:

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

position([_| Tail1], [_| Tail2], Var1, Var2) :-
     position(Tail1, Tail2, Var1, Var2).
请注意,您可能需要如上所述使用相等,
(==)/2
,而不是统一,
(=)/2
,因为两个变量总是统一的。但是,选择取决于谓词的可能输入和所需的确切语义。此外,可以有几种解决方案。如果您只对其中一个感兴趣,可以在第一个子句的末尾添加一个cut,或者,您也可以将一个子句与If-then-else控件构造一起使用:

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

这似乎有效,但我遇到了一个“问题”。我试着写位置([1],[x,y,z],Var1,Var2)。我希望得到答案Var1=1,Var2=x;错误,但我只是得到了“错误”。。。有什么想法吗?这个解决方案(以及隐含的语义)要求您使用统一而不是平等。只需将
=
运算符替换为
=
运算符即可。