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