(此问题与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 ;
使用现有的可视化工具
看一下《可视化工具手册》。通过在代码中添加viewable_create / 2批注,然后从TkECLiPSe的“工具”菜单中启动可视化客户端,可以获得所需的矩阵显示。
使用您自己的检测式搜索例程
您可以将search / 6中的indomain_xxx
选择方法替换为用户定义的方法,在其中您可以在传播之前和/或之后打印信息。
如果这还不够,您可以用search/6
自己的内置组件替换整个组件,这不太困难,例如,请参阅《ECLiPSe教程》中有关树搜索的章节或我对此问题的回答。
使用数据驱动的工具进行跟踪
使用ECLiPSe的数据驱动控制工具,当变量发生某些变化时,您可以非常轻松地显示信息。在最简单的情况下,您可以对变量实例化做一些事情:
?- suspend(printf("X was instantiated to %w%n",[X]), 1, X->inst),
writeln(start), X=3, writeln(end).
start
X was instantiated to 3
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句