List 序言:将一个列表拆分为N个列表,每个列表包含N个项目

List 序言:将一个列表拆分为N个列表,每个列表包含N个项目,list,prolog,sudoku,declarative,clpfd,prolog-coroutining,List,Prolog,Sudoku,Declarative,Clpfd,Prolog Coroutining,我一直在搜索与拆分相关的许多现有Prolog问题,但找不到像我想要的那样通用的问题。我想指出的是,我已经能够通过在列表变量之前使用管道传输的2/3/4变量将列表拆分为包含2/3/4个元素的列表。这个问题与那个问题不同,只是因为它具有一般性 因此,我的列表将始终包含N*N项,N在处理之前未知,通常从4到36不等,是的,N也是一个完美的正方形。我想把它分成一个N个列表,每个列表包含N个项目,因为这样我就可以把它当作一个矩阵来处理,从而可以进行转置和某些类似的操作。我还没有真正能够在逻辑方面走得太远,

我一直在搜索与拆分相关的许多现有Prolog问题,但找不到像我想要的那样通用的问题。我想指出的是,我已经能够通过在列表变量之前使用管道传输的2/3/4变量将列表拆分为包含2/3/4个元素的列表。这个问题与那个问题不同,只是因为它具有一般性

因此,我的列表将始终包含N*N项,N在处理之前未知,通常从4到36不等,是的,N也是一个完美的正方形。我想把它分成一个N个列表,每个列表包含N个项目,因为这样我就可以把它当作一个矩阵来处理,从而可以进行转置和某些类似的操作。我还没有真正能够在逻辑方面走得太远,因为我对声明式编程还比较陌生;请参见下面我的未完成错误尝试:

listmodel(1,L):- L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16].
size(L,N) :- length(L,N1), N is round(sqrt(N1)).

% add_tail(+Liste, +Element, -ResultantList)
add_tail([],L,[L]).
add_tail([X|L1],L2,[X|LI]):-add_tail(L1,L2,LI).

% partition the list containing N*N items into a list of N lists containing N elements each.
% part(+Liste, +Size, -ResultantList)
part([],_,DL).
part(L,N,DL) :-
    length(P,N), % P(refix) initialized
    append(P,S,L), % S(uffix) contains rest of L, using append in (-,-,+) mode
    add_tail(DL,P,DL1), %add P(first N elements) as first element of DL.
    part(S,N,DL1).
现在运行?-列表模型1,L,sizeL,N,partL,N,DL。将生成DL=[],因为这是它在part谓词的第一个add_tail调用中初始化的结果。我似乎不知道如何将所有元素存储在通过递归保留的列表中

任何形式的帮助/指导都将不胜感激。我被困在这里已经超过23小时10分钟了

谢谢。

这应该可以做到:

part([], _, []). part(L, N, [DL|DLTail]) :- length(DL, N), append(DL, LTail, L), part(LTail, N, DLTail). 基本情况是第一个/最后一个参数是空列表

递归步骤获取N个元素的新列表,从L中获取前N个元素,这将是第三个参数的项目之一,并递归调用。

这应该可以做到:

part([], _, []). part(L, N, [DL|DLTail]) :- length(DL, N), append(DL, LTail, L), part(LTail, N, DLTail). 基本情况是第一个/最后一个参数是空列表


递归步骤获取N个元素的新列表,从L中获取前N个元素,这将是第三个参数的项之一,并递归调用。

要将多功能性和有利的终止属性结合起来吗? 使用

列表前缀n后缀/4的一些示例查询:

使用列表\行\宽度/3的示例查询:

就像它应该的那样工作

脚注1:无需使用其他控制流机制,如。

想要将多功能性和良好的终端特性结合起来吗? 使用

列表前缀n后缀/4的一些示例查询:

使用列表\行\宽度/3的示例查询:

就像它应该的那样工作

脚注1:无需使用其他控制流机制,如。

完美!谢谢你精确的回答和简洁的解释。太好了!谢谢你精确的回答和简洁的解释。 list_prefix_n_suffix(Zs, Xs, N, Ys) :- list_prefix_n0_n_suffix(Zs, Xs, 0,N, Ys). list_prefix_n0_n_suffix(Zs, Xs, N0,N, Ys) :- zcompare(Order, N0, N), rel_list_prefix_n0_n_suffix(Order, Zs, Xs, N0,N, Ys). rel_list_prefix_n0_n_suffix(=, Ys, [], _,_, Ys). rel_list_prefix_n0_n_suffix(<, [Z|Zs], [Z|Xs], N0,N, Ys) :- N1 #= N0 + 1, list_prefix_n0_n_suffix(Zs, Xs, N1,N, Ys). ?- list_prefix_n_suffix([a,b,c], Xs,-1, Ys). false. % OK: too small ?- list_prefix_n_suffix([a,b,c], Xs, 0, Ys). Xs = [], Ys = [a,b,c]. % succeeds deterministically ?- list_prefix_n_suffix([a,b,c], Xs, 4, Ys). false. % OK: too big ?- list_prefix_n_suffix([a,b,c], Xs, N, Ys). Xs = [] , N = 0, Ys = [a,b,c] ; Xs = [a] , N = 1, Ys = [b,c] ; Xs = [a,b] , N = 2, Ys = [c] ; Xs = [a,b,c], N = 3, Ys = [] ; false. % terminates universally list_rows_width([], [], _N). list_rows_width([E|Es0], [[R|Rs]|Rss], N) :- list_prefix_n_suffix([E|Es0], [R|Rs], N, Es), list_rows_width(Es, Rss, N). ?- list_rows_width([a,b,c,d,e,f], Rows, 4). false. % OK: 6 is not divisible by 4 ?- list_rows_width([a,b,c,d,e,f], Rows, 3). Rows = [[a,b,c],[d,e,f]]. % succeeds deterministically ?- list_rows_width([a,b,c,d,e,f,g,h,i,j,k,l], Rows, N). N = 1, Rows = [[a],[b],[c],[d],[e],[f],[g],[h],[i],[j],[k],[l]] ; N = 2, Rows = [[a, b],[c, d],[e, f],[g, h],[i, j],[k, l]] ; N = 3, Rows = [[a, b, c],[d, e, f],[g, h, i],[j, k, l]] ; N = 4, Rows = [[a, b, c, d],[e, f, g, h],[i, j, k, l]] ; N = 6, Rows = [[a, b, c, d, e, f],[g, h, i, j, k, l]] ; N = 12, Rows = [[a, b, c, d, e, f, g, h, i, j, k, l]] ; false. % terminates universally