为拼图求解程序prolog程序生成矩阵

时间:2015-03-21 13:50:30

标签: matrix prolog

我已经编写了一个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矩阵?

1 个答案:

答案 0 :(得分:4)

length/2maplist/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进行了一些快速计时检查,上述方法似乎要快得多。