gpt4 book ai didi

list - 如何将列表列表中每个列表的前 N ​​个元素移动到列表末尾

转载 作者:行者123 更新时间:2023-12-03 23:59:05 25 4
gpt4 key购买 nike

Prolog 中有什么方法可以从列表中移动前 N 个元素并将它们放在最后。我想为列表列表中的每个列表执行此操作。示例:

输入:

move(3, [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1,2,3], [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]], R)

结果:

R = [[4, 5, 6, 7, 8, 9, 1, 2, 3], [1,2,3], [6, 7, 8, 9, 10, 11, 12, 3, 4, 5]]

我不知道,有人知道怎么做吗?

最佳答案

如果您执行以下查询,LeftRight 将绑定(bind)到两个列表,当它们连接在一起时,会产生 [1,2,3 ,4,5]:

?- append(Left, Right, [1,2,3,4,5]).

上面的查询允许 6 个解决方案(Left 为空,列表 [1],列表 [1,2] 等.)。您可以通过说 Left 正好包含三个元素来限制查询:

?- length(Left, 3), append(Left, Right, [1,2,3,4,5]).
Left = [1, 2, 3]
Right = [4, 5]

这只有一种解决方案。

旋转包括生成一个列表,其中 Left 部分位于 Right 列表的右侧:

?- length(Left, 3), 
append(Left, Right, [1,2,3,4,5]),
append(Right, Left, Result).
Left = [1, 2, 3]
Right = [4, 5]
Result = [4, 5, 1, 2, 3]

您需要编写的第一个谓词如下:

rotate_left(List, Offset, Rotated) :-
length(Left, Offset),
append(Left, Right, List),
append(Right, Left, Rotated).

然后您可以将此谓词应用于列表列表。


注意。你可以考虑改用这个版本:

rotate_left(List, Offset, Rotated) :-
append(Left, Right, List),
length(Left, Offset),
append(Right, Left, Rotated).

更好一点,因为它允许 Offset 是可变的:

[eclipse 2]: rotate_left([a, b, c, d], N, [c, d, a, b]).

N = 2
Yes (0.00s cpu, solution 1, maybe more) ? ;

No (0.00s cpu)

在原始版本中,length(Left, N) 的两个参数都是可变的,并且它会不断生成越来越长的列表的答案。

关于list - 如何将列表列表中每个列表的前 N ​​个元素移动到列表末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64983826/

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