如何在prolog中为内部列表创建具有特定宽度的列表列表?

如何在prolog中为内部列表创建具有特定宽度的列表列表?,prolog,Prolog,我正在尝试创建一个列表,其中我的输入是一个大的扁平网格,我需要将网格中的元素调整为较小的列表。 例如,我有这样一个列表:[1,2,3,4,5,6,7,8],我想将列表列表创建为[[1,2,3,4],[5,6,7,8]],在这种情况下,我将每个内部列表中的元素调整为宽度(4)。如果我的列表只有7个元素,那么结果应该是[[1,2,3,4]],我应该忽略其余元素,因为它们不会形成另一个宽度为4的列表。这是我的代码,我遇到了“全局堆栈外”错误,我无法解决它 代码: 列出列表([],W,L)。 列表到列表

我正在尝试创建一个列表,其中我的输入是一个大的扁平网格,我需要将网格中的元素调整为较小的列表。
例如,我有这样一个列表:[1,2,3,4,5,6,7,8],我想将列表列表创建为[[1,2,3,4],[5,6,7,8]],在这种情况下,我将每个内部列表中的元素调整为宽度(4)。如果我的列表只有7个元素,那么结果应该是[[1,2,3,4]],我应该忽略其余元素,因为它们不会形成另一个宽度为4的列表。这是我的代码,我遇到了“全局堆栈外”错误,我无法解决它

代码:

列出列表([],W,L)。
列表到列表([H | T],W,[X1]|[Xr]]):
长度([X1],R),
R=W,
附加(Xr、H、Rs),
列出列表(T、W、Xr)。
length(S,W)
生成一个自由变量列表,因此,如果该列表可以是前缀,只需存储在结果中即可


您也可以尝试不剪切,以更好地理解行为。

您可以用
R=1替换
length([X1],R),
,谢谢,它起作用了(Y),我处理了剩余元素小于所需宽度的情况。我不想添加额外的元素,这会使列表小于所需宽度。例如,如果我的列表是[1,2,3,4,5,6,7],宽度是3,那么我希望我的列表是[[1,2,3],[4,5,6]],而不是[[1,2,3],[4,5,6],[7]]。我想省略7,它对我不起作用。你是怎么做到的对不起,我确信最初的问题明确要求添加剩余的元素-我的坏。。。
list_to_llists([],W,L).
list_to_llists([H|T],W,[[X1]|[Xr]]):- 
    length([X1],R),
    R<W,           
    append(X1,H,Rs),
    list_to_llists(T,W,Rs).
list_to_llists([H|T],W,[[X1]|[Xr]]):-
    length([X1],R),
    R>=W,
    append(Xr,H,Rs),
    list_to_llists(T,W,Xr).
list_to_llists(L,W,[S|R]):-
    length(S,W),
    append(S,T,L),
    !, list_to_llists(T,W,R).
list_to_llists(L,_,[L]).