(这个问题关注search/6。)
我想知道是否有一种方法 - 而不是手动跟踪 - 每次找到单个变量的新解决方案时暂停执行search / 6?
我想完成此任务以进一步调查在约束模型中搜索期间发生的事情。
例如,如果您正在尝试解决经典的数独问题,并且已经为您的电路板编写了一组约束和打印方法,那么在设置约束后打印电路板会很有用,但在搜索之前,为了评估你的约束的强度。但是,一旦调用搜索来解决数独游戏,除非你进行跟踪,否则你不会真正了解在底层构建的单个结果。
如果可能出现以下情况,那将非常有用:
(这只是一个抽象的例子)
Traceback (most recent call last):
File "C:\Program Files\Git\mingw64/libexec/git-core\git-p4", line 3677, in <module>
main()
File "C:\Program Files\Git\mingw64/libexec/git-core\git-p4", line 3671, in main
if not cmd.run(args):
File "C:\Program Files\Git\mingw64/libexec/git-core\git-p4", line 3429, in run
die("fast-import failed: %s" % self.gitError.read())
File "C:\Program Files\Git\mingw64/libexec/git-core\git-p4", line 122, in die
raise Exception(msg)
Exception: fast-import failed: warning: Not updating refs/remotes/p4/master (new tip 85c94d84335bb1441a7f959b384729b2a4d633f4 does not contain 3222bdc29799d1fe5fff91c36524481b1469f1d9)
现在进行搜索:
% 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,_,_,_,_,_,_,_,_]]
答案 0 :(得分:2)
使用现有的可视化工具
查看Visualization Tools Manual。通过在代码中添加viewable_create/2注释,并从 TkECLiPSe&#39> 工具中启动可视化客户端,您可以获得所需的矩阵显示。菜单。
使用您自己的检测搜索程序
您可以使用用户定义的方法替换search/6中的indomain_xxx
选项方法,您可以在传播之前和/或之后打印信息。
如果这还不够,您可以用自己的内置search/6
替换整个内置?- 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
,这不是很难,例如, ECLiPSe Tutorial chapter on tree search或我对this question的回答。
使用数据驱动设施进行跟踪
使用ECLiPSe的数据驱动控制工具,您可以在变量发生某些事情时轻松显示信息。在最简单的情况下,您可以在变量实例化上执行某些操作:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="asset/css/vendor/bootstrap.min.css">
<link rel="stylesheet" href="asset/css/vendor/datatables/dataTables.jqueryui.min.css">
<link rel="stylesheet" href="asset/css/vendor/datatables/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="asset/css/vendor/datatables/responsive.bootstrap.min.css">
</head>
<body>
<table id="example" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
<thead>
<tr>
<th>First name</th>
<th>Last name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
<th>Extn.</th>
<th>E-mail</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tiger</td>
<td>Nixon</td>
<td>System Architect</td>
<td>Edinburgh</td>
<td>61</td>
<td>2011/04/25</td>
<td>$320,800</td>
<td>5421</td>
<td>t.nixon@datatables.net</td>
</tr>
<tr>
<td>Jennifer</td>
<td>Chang</td>
<td>Regional Director</td>
<td>Singapore</td>
<td>28</td>
<td>2010/11/14</td>
<td>$357,650</td>
<td>9239</td>
<td>j.chang@datatables.net</td>
</tr>
<tr>
<td>Zenaida</td>
<td>Frank</td>
<td>Software Engineer</td>
<td>New York</td>
<td>63</td>
<td>2010/01/04</td>
<td>$125,250</td>
<td>7439</td>
<td>z.frank@datatables.net</td>
</tr>
<tr>
<td>Zorita</td>
<td>Serrano</td>
<td>Software Engineer</td>
<td>San Francisco</td>
<td>56</td>
<td>2012/06/01</td>
<td>$115,000</td>
<td>4389</td>
<td>z.serrano@datatables.net</td>
</tr>
<tr>
<td>Jennifer</td>
<td>Acosta</td>
<td>Junior Javascript Developer</td>
<td>Edinburgh</td>
<td>43</td>
<td>2013/02/01</td>
<td>$75,650</td>
<td>3431</td>
<td>j.acosta@datatables.net</td>
</tr>
</tbody>
</table>
<script src="asset/js/vendor/jquery-1.12.0.min.js"></script>
<script src="asset/js/vendor/bootstrap.min.js"></script>
<script src="asset/js/vendor/jquery.responsiveTabs.min.js"></script>
<script src="asset/js/vendor/jquery.dataTables.min.js"></script>
<script src="asset/js/vendor/dataTables.bootstrap.min.js"></script>
<script src="asset/js/vendor/dataTables.responsive.min.js"></script>
<script src="asset/js/vendor/responsive.bootstrap.min.js"></script>
<script>
$(document).ready(function() {
$('#example').DataTable( {
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal( {
header: function ( row ) {
var data = row.data();
return 'Details for '+data[0]+' '+data[1];
}
} ),
renderer: function ( api, rowIdx, columns ) {
var data = $.map( columns, function ( col, i ) {
return '<tr>'+
'<td>'+col.title+':'+'</td> '+
'<td>'+col.data+'</td>'+
'</tr>';
} ).join('');
return $('<table class="table"/>').append( data );
}
}
}
} );
} );
</scirpt>
</body>
</html>
基于这个想法,即使它们发生在黑盒搜索例程中,您也可以编写code that allows you to follow labeling and propagation steps。有关详细信息,请参阅链接。