0

スイッチを介して道路を接続する次のデータベースがあります。

例えば

switch(r2,w52=s).
switch(w52=s,w53=d).

データベースへの明示的なデポジットではなく、アルゴリズムでどのように決定できますか?? 助言がありますか?

4

1 に答える 1

0

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 がファイルをコンパイルするため、事実を生成するよりも頻繁に読む場合、これが最も効率的な方法です。

于 2013-01-20T12:26:29.467 に答える