2

私のアプリケーションでは、それぞれが独自の知識ベースを持つ多数のエージェントがいます。
私の当初のアイデアは複数のエンジンインスタンスを持つことでしたが、swiプロローグは最大で1つのインスタンスを許可します。
もう1つの方法は、エージェントIDを表す用語を各ファクトとルールに追加することですが、非常に面倒なようです。

たとえば、次の代わりに:

position(10, 20).
do(action(X)):-...

私はどこにでも書く必要があります:

position(agent0, 10, 20).
do(Agent, action(X)):-...

一度に1つのエージェントを更新するので、その方法がわからなくても、毎回すべてを保存して復元しても問題ない場合があります。またはモジュールを使用していますか?
異なる知識ベースを分離するための良い方法は何でしょうか?

4

1 に答える 1

4

対応するエージェントを識別するためにファクトにアトミックIDを追加するという提案は良いものだと思いますが、振り返ってみると、これをコードに追加するのは面倒かもしれないことに同意してください。

これが私の好みの大まかな順序で、他のいくつかの提案です...

  1. 記録されたデータベースを使用します。これにより、実際にアトミックキーを使用してファクトを記録できるため、おそらく、recorda/3述語を使用して、エージェントIDを使用して各エージェントのファクトを個別に記録し、を使用recorded/2,3してそれらを取得できます。ほぼ正確にあなたが望むもの。
  2. モジュールを使用します。おそらく、エージェントごとに新しいモジュール名を作成するだけで、名前空間の使用方法と同じように、エージェントごとにファクトを分離できます。たとえば、をアサートしagent0:position(10,20)ます。
  3. assert/2句参照を返すを使用して、各エージェントに対してアサートするファクトを明示的に追跡します。特定のエージェントに対して表明されたすべてのファクトを識別する参照のリストを保持することにより、を使用してそれらをすばやく撤回できますerase/1。との組み合わせで句参照を使用すると、clause/3それらの参照を介して句を取得するとretract/1、他のエージェントに属するlike-clauseが撤回される可能性があることに注意してください。
  4. プログラムの構造に応じて、次のようなリストに各エージェントのすべてのファクトを含む大規模なデータ構造を渡すだけで、[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...]この用語を更新できます。これは、特定のファクトに対して多くの線形スキャンを必要とするため、データベース自体を使用するほど効率的ではないことに注意してください。ハッシュルックアップは使用できません。
于 2012-12-17T06:43:47.897 に答える