我是一名Prolog新手,正在完成一项给我带来巨大麻烦的任务。我必须编写一个通过 n 拼图解决 n 的程序;解决方案的谓词有两个参数game(Size, SolList)
,其中Size是板的大小,SolList是列表形式的拼图解决方案。以下是教授提供的用于生成董事会的代码:
generate_board(N, Board) :-
generate_board(N, N, Board), !.
generate_board(0, _, []).
generate_board(1, Columns, [LastRow]) :-
row(Columns, LastRow).
generate_board(Rows, Columns, [R1|RestOfBoard]) :-
row(Columns, R1),
NewRows is Rows - 1,
generate_board(NewRows, Columns, RestOfBoard).
解决难题需要“点击”棋盘上的某些方块。我想要做的是生成一个正方形列表 - 例如,当Size = 5时,列表的长度为25,从0到24 - in(如果可能的话)generate_board/2
谓词。然后,我希望Prolog记住该列表,并在使用不同的谓词解决难题并提出解决方案时,在列表的必要元素上注册“点击”并将其输出到控制台中。我不知道如何解决Prolog中列表的本地特性,所以我不知道如何跳过这个障碍。
答案 0 :(得分:1)
如果您不能像评论中所建议的那样只传递列表,那么“记住”它的好方法就是断言和撤回它。
例如:
https://api.instagram.com/v1/tags/inlombardia365/media/recent?access_token={MY_ACCESS_TOKEN}&count=100
你做但必须要小心。如果setup_board :-
generate_board(5, L),
assert(board(L)).
do_something :-
retract(board(L)),
process_board(L, L1),
assert(board(L1)).
失败,您的董事会将被撤回,但不会宣布新的董事会。
您可以使用Prolog“if - > then”:
解决此问题process_board(L, L1)
换句话说,如果do_something :-
retract(board(L)),
(process_board(L, L1) -> assert(board(L1)) ; assert(board(L))).
成功,则断言新电路板,否则重新插入旧电路板。