gpt4 book ai didi

list - Prolog-在列表中查找相邻元素

转载 作者:行者123 更新时间:2023-12-03 11:37:15 25 4
gpt4 key购买 nike

我试图定义一个谓词adjacent(X, Y, Zs),如果X和Y在列表中相邻,则该表达式为true。我的代码当前是这样的:

adjacent(_, _, []).
adjacent(X, Y, [X, Y|Tail]) :-
adjacent(X,Y, Tail).

它适用于 adjacent(c, d, [a, b, c, d, e])的基本情况,但由于有基本情况,其他所有情况也都返回true,因此我坚持这样做。

另一个问题是,如果X不等于列表头部的第一部分,那么它将跳过X和Y并转到下一个“X”;例如,如果 c 不等于 a ,则它会跳过 a b ,并检查 c 是否等于 c 。例如,当列表为
[a, c, d, e]

因为它最终不会检查 (我相信)。

我对如何调和这两个问题以及将对需要发生的事情的逻辑理解变成代码非常迷惑。

编辑:感谢克里斯蒂安·胡杰尔的回答,我的基本情况错误已得到纠正,所以现在我只停留在第二个问题上。

最佳答案

在原始解决方案中尝试:

adjacent(_, _, []).
adjacent(X, Y, [X, Y|Tail]) :-
adjacent(X,Y, Tail).

正如@ChristianHujer指出的那样,第一个子句不应存在,因为它不是真的。空列表应该没有相邻的元素。

第二条款也是有问题的。它显示 XY在列表中相邻,但是随后递归并且不仅仅成功。适当的条款应为:
adjacent(X, Y, [X,Y|_]).

这表示 XY如果是列表中的前两个元素,则无论列表的尾部是什么,它们都在列表中相邻。这也构成了适当的基本情况。然后,您的一般递归子句应处理其余情况:
adjacent(X, Y, [_|Tail]) :-
adjacent(X, Y, Tail).

这表示 XY如果在 [_|Tail]中相邻,则在 Tail中相邻。这可以解决您遇到的第二个问题。

因此,整个解决方案将是:
adjacent(X, Y, [X,Y|_]).
adjacent(X, Y, [_|Tail]) :-
adjacent(X, Y, Tail).

只要 XY在列表中以此顺序一起出现,此操作将成功多次。

这也可以通过DCG自然解决(尽管@repeat的基于 append/3的解决方案更为简洁):
adjacent(X, Y) --> ..., [X, Y], ... .
... --> [] | [_], ... .

adjacent(X, Y, L) :- phrase(adjacent(X, Y), L).
| ?- adjacent(b, c, [a,b,c,d]).

true ? a

(1 ms) no
| ?-

关于list - Prolog-在列表中查找相邻元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35667142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com