我们必须编写一个Prolog谓词neighbors(X,Y,L)
,如果L
是一个列表且X
和Y
是列表中的邻居元素,则为真。到目前为止我写道:
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,所以我仍然需要一些练习。
答案 0 :(得分:2)
你应该使用追加:
neighbors(X,X,[X]).
neighbors(X,Y,L) :-
append(_, [X,Y|_], L)
; append(_, [Y,X|_], L).
答案 1 :(得分:0)
所以我一直在努力,自己找到答案。
我不得不考虑2个案例:
X和Y是X,Y的邻居,所以neighbors(X,Y,[X,Y|_]).
X和Y是Y.X的邻居,所以neighbors(X,Y,[Y,X|_]).
而且我们还必须检查整个列表,跳过与我们无关的所有元素(所有与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]).
到目前为止,这为每个输入提供了正确的输出,但如果仍有问题,请告知我。感谢。