List (序言)在列表中查找邻居
如果List (序言)在列表中查找邻居,list,prolog,List,Prolog,如果L是一个列表,并且X和Y是列表中的相邻元素,那么我们必须编写一个Prolog谓词neights(X,Y,L),这是真的。到目前为止,我写道: neighbors(X,X,[X]). neighbors(X,Y,[X,Y|R]):- neighbors(X,Y,R). neighbors(X,Y,[Y,X|R]):- neighbors(X,Y,R).` 但是无论输入是什么,输出总是(显然)给出空括号(“[]”)。你们能给我一些关于如何改进这个谓词的建议吗? 我们最近开始学习序言,所以我还需
L
是一个列表,并且X
和Y
是列表中的相邻元素,那么我们必须编写一个Prolog谓词neights(X,Y,L)
,这是真的。到目前为止,我写道:
neighbors(X,X,[X]).
neighbors(X,Y,[X,Y|R]):- neighbors(X,Y,R).
neighbors(X,Y,[Y,X|R]):- neighbors(X,Y,R).`
但是无论输入是什么,输出总是(显然)给出空括号(“[]
”)。你们能给我一些关于如何改进这个谓词的建议吗?
我们最近开始学习序言,所以我还需要一些练习。所以我一直在尝试,自己找到了答案 我必须考虑2种情况:
近邻(X,Y,[X,Y|uz])。
邻居(X,Y,[Y,X|uz])。
邻域(X,Y[F,S|R]):-邻域(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]).
到目前为止,这为每个输入提供了正确的输出,但如果仍然存在错误,请就此向我提供建议。谢谢。所以我一直在努力,自己找到了答案 我必须考虑2种情况:
近邻(X,Y,[X,Y|uz])。
邻居(X,Y,[Y,X|uz])。
邻域(X,Y[F,S|R]):-邻域(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]).
到目前为止,这为每个输入提供了正确的输出,但如果仍然存在错误,请就此向我提供建议。谢谢。您应该使用append:
neighbors(X,X,[X]).
neighbors(X,Y,L) :-
append(_, [X,Y|_], L)
; append(_, [Y,X|_], L).
您应该使用append:
neighbors(X,X,[X]).
neighbors(X,Y,L) :-
append(_, [X,Y|_], L)
; append(_, [Y,X|_], L).
下面的答案有一个小错误:你忘了关闭方括号…下面的答案有一个小错误:你忘了关闭方括号…邻居(X,X,[X])背后的想法是什么?这对我来说似乎有点奇怪。请解释!
邻居(X,X,[X])背后的想法是什么?这对我来说似乎有点奇怪。请解释!我有一个关于可读性的小建议:每个人读到这篇文章都可能误读代码>如,
,因为符号看起来非常相似,,
通常出现在行尾。因此,我的建议是始终将在这种情况下,代码>在(下一)行前面。很好!这是一个很好的解决方案,+1。我推荐的布局是使用括号,第一行也使用缩进:
是主要函子,两个目标都是参数;(append(,[X,Y |,]L),append(,[Y,X |,]L))。也可以,不过在Prolog中,如果可能的话,使用中缀符号更为常见,比如在X#=3+5
中,而不是=(X,+(3,5))
,这也是完全有效的。一个好的选择是有时(G1;G2)
,即两个目标都在一行上。必须不惜一切代价防止的事情是代码>在一行的末尾,因为它看起来太类似于,
。我有一个关于可读性的小建议:每个人读这篇文章都可能误读代码>如,
,因为符号看起来非常相似,,
通常出现在行尾。因此,我的建议是始终将在这种情况下,代码>在(下一)行前面。很好!这是一个很好的解决方案,+1。我推荐的布局是使用括号,第一行也使用缩进:
是主要函子,两个目标都是参数;(append(,[X,Y |,]L),append(,[Y,X |,]L))。也可以,不过在Prolog中,如果可能的话,使用中缀符号更为常见,比如在X#=3+5
中,而不是=(X,+(3,5))
,这也是完全有效的。一个好的选择是有时(G1;G2)
,即两个目标都在一行上。必须不惜一切代价防止的事情是代码>,因为它看起来太像,
。