我正在尝试编写一个遵循一些简单条件的谓词。它应该采用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).
不确定为什么这不起作用..
答案 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)
).