在Prolog之外访问其谓词中的列表

时间:2016-03-24 23:42:05

标签: list scope prolog

我是一名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中列表的本地特性,所以我不知道如何跳过这个障碍。

1 个答案:

答案 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))). 成功,则断言新电路板,否则重新插入旧电路板。