簡體   English   中英

ECLiPSe CLP:在ic庫中由search / 6找到的子結果之間暫停

[英]ECLiPSe CLP : Pause between subresults found by search/6 in ic library

(此問題與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替換整個內置的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

基於此思想,您可以編寫代碼,即使在黑盒搜索例程中發生標記和傳播步驟 ,也可以遵循這些步驟 有關詳細信息,請參見鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM