1

(この質問はsearch/6に関するものです。)

単一の変数の新しい解決策が見つかるたびに、手動でトレースするのではなく、search/6 の実行を一時停止する方法があるかどうか疑問に思っていましたか?

制約のあるモデルでの検索中に何が起こっているかをさらに調査するために、これを達成したいと考えています。

たとえば、古典的な数独問題を解こうとしていて、ボードに一連の制約と印刷メソッドを記述している場合、制約を設定した後、検索する前にボードを印刷すると便利です。制約の強さを評価します。ただし、数独を解決するために search が呼び出されると、トレースを実行しない限り、その下に構築されている単一の結果の概要を実際に把握することはできません。

次のようなことが可能であれば、非常に便利です。

(これは単なる抽象的な例です)

% 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

既存の可視化ツールの使用

Visualization Tools Manualをご覧ください。コードに viewable_create /2注釈を追加し、 TkECLiPSe の [ツール] メニューからVisualization Clientを起動することで、必要な種類のマトリックス表示を取得できます。

インストルメント化された独自の検索ルーチンの使用

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 に答える