(Prolog)在列表中查找邻居

时间:2016-06-17 09:39:21

标签: list prolog

我们必须编写一个Prolog谓词neighbors(X,Y,L),如果L是一个列表且XY是列表中的邻居元素,则为真。到目前为止我写道:

neighbors(X,X,[X]).
neighbors(X,Y,[X,Y|R]):- neighbors(X,Y,R).
neighbors(X,Y,[Y,X|R]):- neighbors(X,Y,R).`

但无论输入如何,输出总是会给出(显然)空括号(" []")。那么你们可以就如何改进这个谓词给我一些建议吗? 我们最近开始使用Prolog,所以我仍然需要一些练习。

2 个答案:

答案 0 :(得分:2)

你应该使用追加:

neighbors(X,X,[X]).

neighbors(X,Y,L) :-
      append(_, [X,Y|_], L)
    ; append(_, [Y,X|_], L).

答案 1 :(得分:0)

所以我一直在努力,自己找到答案。

我不得不考虑2个案例:

  1. X和Y是X,Y的邻居,所以neighbors(X,Y,[X,Y|_]).

  2. X和Y是Y.X的邻居,所以neighbors(X,Y,[Y,X|_]).

  3. 而且我们还必须检查整个列表,跳过与我们无关的所有元素(所有与X或Y不匹配的元素)。这可以使用递归neighbors(X,Y,[F,S|R]) :- neighbors(X,Y,[S|R]).

    来完成

    所以整个谓词应该是

    neighbors(X,Y,[X,Y|_]). 
    neighbors(X,Y,[Y,X|_]).
    neighbors(X,Y,[F,S|R]) :- neighbors(X,Y,[S|R]).
    

    到目前为止,这为每个输入提供了正确的输出,但如果仍有问题,请告知我。感谢。