search/6
ECLiPSeシステムで見つけることができる最も複雑な述語の1つであるため、できるだけ簡単に答えようとします。
ただし、より詳細なフォローアップの質問は、ECLiPSeユーザーのメーリングリストで尋ねた方がよいでしょう。
search/6
述語は、CLP問題の解決策の検索を制御するための一般的な述語です。これにより、ユーザーは検索ツリーの形状(ブランチに沿った変数の順序、ブランチの順序、およびアクセスされる検索ツリーの部分)を制御できます。述語には6つのパラメーターがありますsearch(+L, ++Arg, ++Select, +Choice, ++Method, +Option)
。(+
および++
パラメータのモードを示します)
最初の2つのパラメーターは一緒になります。L
変数のリストまたは用語のリストのいずれかです。前者の場合はArg
0である必要があり、後者の場合Arg
は、検索中にインスタンス化する必要がある変数の位置を示します。例:
search([A,B],0,input_order,indomain,complete,[]).
また
search([p(1,A),p(2,B)],2,input_order,indomain,complete,[]).
どちらの場合も、変数A
とB
は検索中にインスタンス化されます。
3番目のパラメーターは選択方法です。このメソッドは、インスタンス化search/6
するリストから次の変数を選択するために使用されます。L
最も簡単なオプションはinput_order
次のとおりです。検索は、リスト内の変数を単純に繰り返します。上記の例では、A
最初にインスタンス化してから、をインスタンス化しますB
。他のオプションは、ドメインサイズや変数に付加された制約の数を考慮し、それに応じて選択を行います。たとえば、first_fail
ドメインが最小の変数を選択します。の現在のドメインがA
で[1,2,3]
ありB
、ドメインを持っている場合[1,3]
、B
最初に選択され、インスタンス化されます。複数の変数が同じ最小ドメインサイズを持っている場合、入力順にこれらの最初のものが選択されます。ドメインサイズを考慮した選択方法では、制約が達成する伝播の量に応じて、検索中にドメインサイズが変化(縮小)するため、動的な変数の順序付けが実現されます。
他の選択方法は、一目瞭然です。
独自の選択メソッドを定義することもできます。ただし、それを実装する述語がアリティ2を持っている場合、つまり2つのパラメーターを持っている場合に限ります。述語は、入力として変数を取り、いくつかの基準値を計算する必要があります。基準値が最小の変数が選択されます。
4番目のパラメーターは選択方法です。変数が選択されると、選択メソッドは、検索中にそのドメイン内の値が試行される順序を制御します。
最も単純なオプションはindomain
、変数の現在のドメインの値を昇順で選択するです。つまり、変数A
にドメインがある[1,3,5]
場合、検索は最初A
に1にバインドされ、バックトラックで3にバインドされ、最後に5にバインドされます。3からindomain_middle
始まり、1、5の順になります。
より複雑な選択方法(つまり、以外indomain
)は、バックトラッキングで試行された値を削除します。つまり、基本的に。のような追加の制約を追加しますA#\=1
。これにより、追加の伝播が発生し、実行不可能性の早期検出が可能になる場合があります。search/6
質問でリンクしたドキュメントから、n-queensの例を実行したときの効果を確認できます。
ここでも、独自の選択方法を定義することもできます。述語はアリティ1または3である必要があります。アリティが1の場合、述語は1つの変数を入力として受け取り、それを値にバインドします(または、変数のドメインを変更する他の選択を行います)。アリティが3の場合、2つの追加パラメーターを使用して、選択に使用できるいくつかの状態情報を渡すことができます。
5番目のパラメーターは検索方法です。これは、検索が探索する検索ツリーのセクションのサイズを制御します(一方、selectionメソッドはツリーのブランチに沿った変数の順序を制御し、choiceメソッドは検索ツリーのブランチの順序を制御します)。
最も簡単なオプションはcomplete
、ツリーが使い果たされるまでツリーを左から右に検索するです。他のすべてのオプション(対称性の破れを除く)は不完全な検索方法です。つまり、検索ツリーに未探索のままのブランチがあります。解決策がそのような未踏の枝の葉にある場合、それは見つかりません。不完全な検索方法で解決策を見つけることができるように、選択方法と選択方法が検索ツリーを形成することを確認する必要があります。たとえば、このオプションbbs
は、検索中に作成できるバックトラックの数を制限します。その数がなくなると、検索は停止します。
対称性の破れは、何らかの方法で他のブランチと同等(対称)のブランチのみを除外します。
search/6
6番目のパラメーターは、ドキュメントで説明されている、可能な追加オプションのリストです。通常、それらは必要ありません。