在Prolog中列出位置

时间:2014-10-12 14:12:45

标签: prolog

我正在尝试编写一个遵循一些简单条件的谓词。它应该采用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).

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

1 个答案:

答案 0 :(得分: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)
     ).