(这个问题是关于search/6。)
我想知道是否有一种方法 - 而不是手动跟踪 - 每次找到单个变量的新解决方案时暂停执行 search/6?
我想完成此操作以进一步调查在约束模型中搜索期间发生的情况。
例如,如果您正在尝试解决经典的数独问题,并且您已经为您的棋盘编写了一组约束和打印方法,那么在设置约束之后但在搜索之前打印棋盘会很有用,以便评估约束的强度。但是,一旦调用了搜索来解决数独问题,除非您进行跟踪,否则您并不能真正了解在其下构建的单个结果。
如果在以下方面有可能,那将非常有用:
(这只是一个抽象的例子)
% Let's imagine this is a (very poorly) constrained sudoku board
?- problem(Sudoku),constraint(Sudoku),print(Sudoku).
[[1,3,_,2,_,_,7,4,_],
[_,2,5,_,1,_,_,_,_],
[4,8,_,_,6,_,_,5,_],
[_,_,_,7,8,_,2,1,_],
[5,_,_,_,9,_,3,7,_],
[9,_,_,_,3,_,_,_,5],
[_,4,_,_,_,6,8,9,_],
[_,5,3,_,_,1,4,_,_],
[6,_,_,_,_,_,_,_,_]]
现在进行搜索:
?- problem(Sudoku),constraint(Sudoku),search_pause(Sudoku,BT),print(Sudoku,BT).
[[1,3,6,2,_,_,7,4,_],
[_,2,5,_,1,_,_,_,_],
[4,8,_,_,6,_,_,5,_],
[_,_,_,7,8,_,2,1,_],
[5,_,_,_,9,_,3,7,_],
[9,_,_,_,3,_,_,_,5],
[_,4,_,_,_,6,8,9,_],
[_,5,3,_,_,1,4,_,_],
[6,_,_,_,_,_,_,_,_]]
Board[1,3] = 6
Backtracks = 1
more ;