2013-04-26 73 views

回答

1

好,使长度为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). 
+1

CLP(FD)版本似乎不太正确呢? - 矩阵(2,2,行)'例如产生一个太深的嵌套列表。 – mat 2013-04-27 09:29:29

3

考虑:

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). 
相关问题