SWI Prolog多个知识库

时间:2012-12-16 13:26:33

标签: prolog swi-prolog

我的申请表我有很多代理商,每个代理商都有自己的知识库 我最初的想法是拥有多个引擎实例,但swi prolog最多允许一个实例 另一种方法是在每个事实和规则中添加一个代表代理ID的附加术语,但这看起来非常麻烦。

例如,而不是:

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

我必须到处写:

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

因为我会一次更新一个代理,即使我不知道怎么做,每次保存和恢复一切都可以。或者使用模块?
什么是分离不同知识库的好方法?

1 个答案:

答案 0 :(得分:3)

我认为你建议在你的事实中添加一个原子ID以识别它对应的代理是一个很好的建议,但是同意这一点在回顾过程中加入你的代码可能很麻烦。

以下是其他一些建议,大致按照我的偏好顺序......

  1. 使用recorded database。有了这个,您实际上可以使用原子密钥记录事实,因此可能使用recorda/3和谓词来分别使用代理ID记录每个代理的事实,然后使用recorded/2,3来检索它们。几乎正是你想要的。
  2. 使用modules。据推测,您可以简单地为每个代理创建新的模块名称,从而将每个代理的事实分开,就像命名空间的使用方式一样。例如,断言agent0:position(10,20)
  3. 使用返回子句引用的assert/2明确跟踪您为每个代理断言的事实。通过保留标识特定代理所声明的所有事实的引用列表,您可以使用erase/1快速撤消它们。请注意,使用带有clause/3组合的子句引用来通过引用和retract/1一起检索子句可能会撤回属于其他代理的like-clauses。
  4. 根据程序的结构,您可以简单地在一个列表中传递包含每个代理的所有事实的大型数据结构,如:[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...]并随时更新此术语。请注意,这不如使用数据库本身那么有效,因为它需要对特定事实进行大量线性扫描;哈希查找不能使用。