スイッチを介して道路を接続する次のデータベースがあります。
例えば
switch(r2,w52=s).
switch(w52=s,w53=d).
データベースへの明示的なデポジットではなく、アルゴリズムでどのように決定できますか?? 助言がありますか?
スイッチを介して道路を接続する次のデータベースがあります。
例えば
switch(r2,w52=s).
switch(w52=s,w53=d).
データベースへの明示的なデポジットではなく、アルゴリズムでどのように決定できますか?? 助言がありますか?
Prolog で動的に生成されたファクトを作成および参照するには、いくつかのオプションがあります。
assert
基本的なものは、やなどのメタ述語を使用することretract
です。述語は、プログラムからファクトを追加および削除します。たとえば、assert(switch(w52=s,w53=d))
switch 句をプログラムに追加します。:- dynamic switch/2.
事前に申告する必要があります。assert を使用することの欠点は、バックトラックしないことです。つまり、ある述語で何らかのファクトをアサートし、バックトラックした場合、そのファクトは自動的にクリーンアップされません。
別のオプションは、これらのファクトをリスト内に蓄積し、プログラムにクエリを実行する代わりに、 or を使用して、特定のファクトがそのリストに含まれているかどうmember/2
かを確認することです。memberchk/2
例えば:
L = [switch(w52=s,w53=d), switch(w53=d,w54=d), ...]
member(switch(w53=A, w54=B), L) % Unifies A=d, B=d
アサーションを使用する場合とは異なり、このメソッドは他の Prolog 述語と同じように機能します。
最後に、2 フェーズ プログラムを実行できます。最初の段階で、計算して事実として使用したい用語をファイルに出力します。Prolog は完全な用語の記述をサポートしているため、それは簡単です。自分でフォーマットする必要はありません。その後、ファイルを参照してください。Prolog がファイルをコンパイルするため、事実を生成するよりも頻繁に読む場合、これが最も効率的な方法です。