1

(这个问题是关于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 ;
4

1 回答 1

2

使用现有的可视化工具

查看可视化工具手册。您可以通过在代码中添加viewable_create/2注释并从TkECLiPSe 的工具菜单启动可视化客户端来获得所需的矩阵显示。

使用您自己的检测搜索例程

您可以将search/6indomain_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

基于这个想法,您可以编写允许您遵循标记和传播步骤的代码,即使它们发生在黑盒搜索例程中。有关详细信息,请参阅链接。

于 2016-03-27T14:18:43.753 回答