Matrix 为益智解算器prolog程序生成矩阵

Matrix 为益智解算器prolog程序生成矩阵,matrix,prolog,Matrix,Prolog,我已经编写了一个prolog程序来解决和显示类似数独的难题的解决方案。起初,如果网格为4x4,我会使用类似的方式: main:- Matrix = [[_,_,_,_],[_,_,_,_],[_,_,_,_],[_,_,_,_]], solve_puzzle(Matrix), display_matrix(Matrix). 但我希望能够设置矩阵的大小,所以我写了以下内容: generate_list(N, [ ]) :- N =< 0, !. gen

我已经编写了一个prolog程序来解决和显示类似数独的难题的解决方案。起初,如果网格为4x4,我会使用类似的方式:

main:-
     Matrix = [[_,_,_,_],[_,_,_,_],[_,_,_,_],[_,_,_,_]],
     solve_puzzle(Matrix),
     display_matrix(Matrix).
但我希望能够设置矩阵的大小,所以我写了以下内容:

generate_list(N, [ ]) :-
    N =< 0, !.
generate_list(N, [_ | T]) :-
    N > 0,
    N2 is N - 1,
    generate_list(N2, T).

generate_matrix(_, N, []) :-
    N =< 0, !.
generate_matrix(M, N, [R|T]) :-
    generate_list(M,R),
    N2 is N - 1,
    generate_matrix(M, N2, T).

但这似乎减慢了我的程序。是否有更好的方法生成N x M矩阵?

length/2
maplist/2
组合在这里效果很好:

length_list(N, List) :- length(List, N).

generate_matrix(Cols, Rows, Matrix) :-
    length_list(Rows, Matrix),
    maplist(length_list(Cols), Matrix).
我定义了
length\u list/2
将length参数放在第一位,以便在
maplist/2
中使用它

length/2
是关系型的,因此当您使用实例化的长度(例如,
N
)调用
length/2
,但将list参数作为变量时,它会导致
[\uu,…,\u]
使用
N
元素。因此,第一个
length\u列表
创建了一个列表,
矩阵
,它看起来像是,
[\uuu,\uu,…,\u]
,具有长度
。然后,对于
矩阵
的每个元素(行
R
),下面的
maplist/2
将调用
length\u list(Cols,R)
,它将生成一个长度
Cols
[\uuuu,…,\uu]
列表,以代替每个

maplist/2
将调用第一个参数作为第二个参数列表中每个元素的谓词。由于我们给它提供了
length\u list(Cols)
,它在调用
[\uu,…,\u]
中的每个元素,
调用(length\u list(Cols),
,这相当于,
调用(length\u list(Cols,)
,它将用
[\uu,…,,\u,…,
实例化
,长度为
Cols
的匿名变量列表


我用SWI Prolog的
time/1
做了一些快速计时检查,上面的方法似乎要快得多。

如果你想创建一个给定大小的列表,
N
,只需使用
length(list,N)
。奇怪的是你竟然能够注意到(甚至测量到)由于此代码,您的程序速度减慢。“你能展示一下你掌握的时间吗?”鲍里斯说得很有道理。您是在创建大量的小矩阵,还是一个或几个非常大的矩阵?还是很多大的?:)
length_list(N, List) :- length(List, N).

generate_matrix(Cols, Rows, Matrix) :-
    length_list(Rows, Matrix),
    maplist(length_list(Cols), Matrix).