【发布时间】:2016-01-25 16:53:11
【问题描述】:
我一直在搜索与拆分相关的许多现有 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).
现在运行?- listmodel(1,L),size(L,N),part(L,N,DL). 将产生DL=[],因为这是它在part 谓词中的第一个add_tail 调用中被初始化的内容。我似乎无法弄清楚如何将所有元素存储在通过递归保留的列表中。
任何帮助/指导将不胜感激。我被困在这里已经超过 23 小时 10 分钟了。
谢谢。
【问题讨论】:
标签: list prolog sudoku declarative