gpt4 book ai didi

matrix - 为解谜器 prolog 程序生成矩阵

转载 作者:行者123 更新时间:2023-12-02 07:06:32 28 4
gpt4 key购买 nike

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

最佳答案

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 是关系型的,因此当您使用实例化的长度(例如 N)调用 length/2 时,但使用列表参数作为变量,它会产生带有 N 元素的 [_,_, ..., _] 。因此,第一个 length_list 创建一个列表,Matrix,看起来像,长度为 [_, _, _, ..., _] 。然后,下面的maplist/2将为Matrix的每个元素(行R)调用length_list(Cols, R) 生成一个长度为 Cols 的列表 [_, _, ..., _] 来代替每个 _。/p>

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

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

关于matrix - 为解谜器 prolog 程序生成矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183474/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com