1
我需要列表女巫將是某種矩陣,大小爲N×N爲相同的N,我不知道如何聲明所有列表中的元素必須是包含N個元素的列表?序言:列表(大小爲N×N)
我需要列表女巫將是某種矩陣,大小爲N×N爲相同的N,我不知道如何聲明所有列表中的元素必須是包含N個元素的列表?序言:列表(大小爲N×N)
好,使長度爲N的列表的最簡單的方法是用length/2
:
?- length(L, 5).
L = [_G1233, _G1236, _G1239, _G1242, _G1245].
您可以輕鬆地將一個多次得到你想要的結果:
make_matrix(N, M) :- once(make_matrix(0, N, M)).
make_matrix(N, N, []).
make_matrix(I, N, [Row|Rows]) :-
length(Row, N),
I1 is I + 1,
make_matrix(I1, N, Rows).
使用:
?- make_matrix(5, M).
M = [[_G479, _G482, _G485, _G488, _G491],
[_G497, _G500, _G503, _G506, _G509],
[_G515, _G518, _G521, _G524, _G527],
[_G533, _G536, _G539, _G542, _G545],
[_G551, _G554, _G557, _G560|...]].
有可能是更優雅的方法來做到這一點。
編輯:這裏是做這一個較爲普遍的方式不裁員,並與clpfd
:
:- use_module(library(clpfd)).
matrix(1,M,[L]) :- length(L, M).
matrix(N,M,[Row1|L]) :-
N #> 1,
N0 #= N-1,
length(L, M),
matrix(N0,M,L).
考慮:
n_matrix(N, Rows) :-
length(Rows, N),
maplist(length_list(N), Rows).
length_list(L, Ls) :- length(Ls, L).
例子:
?- n_matrix(2, Rows).
Rows = [[_G294, _G297], [_G300, _G303]].
另外,您可以使用findall/3
:
n_matrix(N, Rows) :-
findall(Row, (between(1,N,_),length(Row, N)), Rows).
CLP(FD)版本似乎不太正確呢? - 矩陣(2,2,行)'例如產生一個太深的嵌套列表。 – mat 2013-04-27 09:29:29