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的近邻,因此
    近邻(X,Y,[X,Y|uz])。

  • X和Y是Y的邻居。因此
    邻居(X,Y,[Y,X|uz])。

  • 我们还必须检查整个列表,跳过所有与我们无关的元素(所有与X或Y不匹配的元素)。这可以使用递归
    邻域(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的近邻,因此
    近邻(X,Y,[X,Y|uz])。

  • X和Y是Y的邻居。因此
    邻居(X,Y,[Y,X|uz])。

  • 我们还必须检查整个列表,跳过所有与我们无关的元素(所有与X或Y不匹配的元素)。这可以使用递归
    邻域(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)
    ,即两个目标都在一行上。必须不惜一切代价防止的事情是
    ,因为它看起来太像