【问题标题】:Generate a matrix for a puzzle solver prolog program为解谜程序 prolog 程序生成矩阵
【发布时间】:2015-03-22 02:57:32
【问题描述】:

我编写了一个序言程序来解决和显示数独之类的谜题的解决方案。起初,如果网格是例如,我使用了类似的东西。 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).

然后我可以这样做:

main:-
    Rows = 4, Columns = 4,
    generate_matrix(Columns,Rows,Matrix),
    solve_puzzle(Matrix),
    display_matrix(Matrix).

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

【问题讨论】:

  • 如果你想创建一个给定大小的列表,N,只需使用length(List, N)
  • 奇怪的是,由于这段代码,您应该能够注意到(甚至衡量)您的程序变慢。你能显示你得到的时间吗?
  • @Boris 提出了一个很好的观点。您是在创建大量的小矩阵,还是创建一个或几个非常大的矩阵?还是很多大的? :)

标签: matrix prolog


【解决方案1】:

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 将针对Matrix 的每个元素(行R)调用length_list(Cols, R),它会产生一个列表,[_, _, ..., _],长度为Cols

maplist/2 将调用第一个参数作为第二个参数的每个元素的谓词,一个列表。因为我们给它length_list(Cols),所以它调用[_, _, ..., _]中的每个元素,call(length_list(Cols), _),相当于call(length_list(Cols, _)),它将用[_, _, ..., _]实例化_,一个匿名变量列表长度为Cols

我使用 SWI Prolog 的 time/1 进行了一些快速时序检查,上述方法似乎要快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多