我一直在搜索許多現有的關於分解的相關的Prolog問題,但找不到像我想要的那樣通用的一個。我想指出,我已經能夠通過在列表變量之前使用2/3/4變量來將列表拆分成2/3/4個元素的列表。這個問題不同於那只是因爲它的通用性。因此,我的列表將總是包含N * N個項目,N事先未知(通常會從4到36變化,是的,N也是一個完美的正方形)。我想將它分成N個列表,每個列表包含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分鐘以來,我一直困在這裏。
謝謝。
完美!謝謝你的確切答案和簡潔的解釋。 – Donbhupi