gpt4 book ai didi

Prolog:将列表向右旋转 n 次

转载 作者:行者123 更新时间:2023-12-02 06:12:47 24 4
gpt4 key购买 nike

处理谓词,rotate(L,M,N),其中 L 是通过将 M 旋转到正确N次。

我的方法是仅将 M 的尾部附加到其头部 N 次。

rotate(L, M, N) :- 
( N > 0,
rotate2(L, M, N)
; L = M
).

rotate2(L, [H|T], Ct) :-
append(T, [H], L),
Ct2 is Ct - 1,
rotate2(L, T, Ct2).

目前,我的代码返回的 L 等于原始 M,无论 N 设置为什么。似乎当我递归时,尾部没有正确移动到头部。

最佳答案

您可以使用append来拆分列表,并使用length来创建列表:

% rotate(+List, +N, -RotatedList)
% True when RotatedList is List rotated N positions to the right
rotate(List, N, RotatedList) :-
length(Back, N), % create a list of variables of length N
append(Front, Back, List), % split L
append(Back, Front, RotatedList).

注意:这仅适用于 N <= length(L)。您可以使用算术来解决这个问题。

为了清晰起见进行编辑此谓词是为调用谓词时不是变量的 ListN 参数定义的。我无意中重新排序了您原来问题中的参数,因为在 Prolog 中,约定是严格输入参数应位于输出参数之前。因此,ListN 以及输入参数,RotatedList 是输出参数。所以这些是正确的查询:

?- rotate([a,b,c], 2, R).
?- rotate([a,b,c], 1, [c,a,b]).

但是这个:

?- rotate(L, 2, [a,b,c]).

找到一个答案后将进入无限递归。

阅读 SWI-Prolog 文档时,请留意标有“?”的谓词参数,如 length 所示。 。它们可以按本示例所示使用。

关于Prolog:将列表向右旋转 n 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430660/

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