gpt4 book ai didi

list - 在指定元素处拆分列表

转载 作者:行者123 更新时间:2023-12-01 01:26:35 25 4
gpt4 key购买 nike

我一直在尝试在给定元素处拆分 Prolog。我已经接近了,但我无法获得列表的左侧部分。

split(X,[Y|L]) :- split(X,[Y|L],[Y|K],M).
split(_,[],[],[]).
split(X,[Y|L],K,[Y|M]) :- X < Y, split(X,L,K,M).
split(X,[Y|L],[Y|K],M) :- X >= Y, split(X,L,K,M).
split(X,[Y|L],[Y|K],M) :- X = Y, write(Y), write(' '), write(L).

输入:

split(2,[1,2,3,4,5]).

返回:

2 [3,4,5]

我要它回来

[1,2] [3,4,5].

最佳答案

我不太确定你想在这里做什么。例如,split(5, [1,2,3,4,5]) 应该做什么?就此而言,假设输入列表已排序是否安全?我假设是这样。

您的规则 split/2 的基本问题是您没有任何输出参数。 Prolog 的工作方式与大多数编程语言不同;没有 return 这样的东西。起初这感觉像是一个严重的限制,但 Prolog 实际上允许您“返回”任意数量的结果。看看这段代码,在我看来你已经理解了一半,因为你有 split/2 似乎没有任何输出参数,但它调用了 split/4 它具有您需要的两个输出参数。

对于初学者,我会放弃 split/2 的想法并尝试让 split/4 工作。你所拥有的看起来并不太疯狂:

?- split(2, [1,2,3,4,5], X, Y).
X = [1, 2],
Y = [3, 4, 5] .

?- split(5, [1,2,3,4,5], X, Y).
X = [1, 2, 3, 4, 5],
Y = [] .

?- split(1, [1,2,3,4,5], X, Y).
X = [1],
Y = [2, 3, 4, 5] .

这表明您的大部分规则都是正确的。您遇到麻烦的地方是其他解决方案:

?- split(2, [1,2,3,4,5], X, Y).
... ;
2 [3,4,5]
X = [1, 2|_G317] ;
false.

?- split(5, [1,2,3,4,5], X, Y).
... ;
5 []
X = [1, 2, 3, 4, 5|_G326] ;
false.

?- split(1, [1,2,3,4,5], X, Y).
... ;
1 [2,3,4,5]
X = [1|_G314].

你可以从那里的写作中看到,这些额外的解决方案是由你的最后一条规则生成的,X = Y, write(Y)... 等。只需删除该规则即可生成所需的结果split/4 中的行为。

继续,我认为您真正想要的可能不是split/2,而是带有一个输出参数的split/3,一个列表列表。根据我们目前所拥有的,生成并不难:

split(X, List, [Before, After]) :- split(X, List, Before, After).

运行它我们看到我们得到了您提到的预期结果:

?- split(3, [1,2,3,4,5], X).
X = [[1, 2, 3], [4, 5]] ;
false.

?- split(1, [1,2,3,4,5], X).
X = [[1], [2, 3, 4, 5]] ;
false.

?- split(5, [1,2,3,4,5], X).
X = [[1, 2, 3, 4, 5], []] ;
false.

希望这对您有所帮助!

关于list - 在指定元素处拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966911/

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