我已经编写了一个prolog程序来解决和显示数独难题的解决方案。如果网格是例如,我首先使用这样的东西。 4×4:
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).
然后我可以这样做:
main:-
Rows = 4, Columns = 4,
generate_matrix(Columns,Rows,Matrix),
solve_puzzle(Matrix),
display_matrix(Matrix).
但这似乎会减慢我的计划速度。有没有更好的方法来生成N x M矩阵?
答案 0 :(得分:4)
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_list/2
将长度参数放在第一位,以便在maplist/2
中使用它。
length/2
是关系型的,因此当您使用实例化的长度(例如length/2
)调用N
,但将list参数作为变量时,会生成[_,_, ..., _]
N
个元素。因此,第一个length_list
会创建一个名为Matrix
的列表[_, _, _, ..., _]
,其长度为Rows
。然后,对于maplist/2
的每个元素(行R
),以下Matrix
将调用length_list(Cols, R)
来代替每个_
列表,{{{长度为[_, _, ..., _]
的1}}。
Cols
将第一个参数作为谓词调用第二个参数的每个元素,一个列表。由于我们提供了maplist/2
,因此它会调用length_list(Cols)
中[_, _, ..., _]
中的每个元素,它等同于call(length_list(Cols), _)
,它将实例化call(length_list(Cols, _))
} _
,一个长度为[_, _, ..., _]
的匿名变量列表。
我使用SWI Prolog Cols
进行了一些快速计时检查,上述方法似乎要快得多。