【问题标题】:SWI Prolog multiple knowledge basesSWI Prolog 多个知识库
【发布时间】:2012-12-16 13:26:32
【问题描述】:

在我的应用程序中,我有许多代理,每个代理都有自己的知识库。
我最初的想法是拥有多个引擎实例,但 swi prolog 最多允许一个实例。
另一种方法是在每个事实和规则中添加一个表示代理 id 的附加项,但这似乎很麻烦。

例如,而不是:

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

我必须到处写:

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

因为我会一次更新一个代理,即使每次都保存和恢复所有内容也可能没问题,即使我不知道该怎么做。还是使用模块?
分离不同知识库的好方法是什么?

【问题讨论】:

  • Logtalk
  • 谢谢,我正在研究它...

标签: prolog swi-prolog


【解决方案1】:

我认为您建议在事实中添加一个原子 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 一起检索子句可能会收回属于其他代理的类似子句。
  4. 根据程序的结构,您可以简单地传递一个包含每个代理的所有事实的大型数据结构,例如:[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...],并随时更新该术语。请注意,这不如使用数据库本身高效,因为它需要对特定事实进行大量线性扫描;无法使用哈希查找。

【讨论】:

  • 关于模块:问题是需要(例如) position/2 必须 用 agent0 限定它的规则:即您需要将模块标识符传递给每个这样的规则,正是OP抱怨的。我真的很想看到一个可行的解决方法,因为我(25 年前!)编写了一个具有这些功能的面向对象的 Prolog 解释器......
  • 感谢两位的替代方案。 Logtalk 看起来是一个非常强大的工具,对于像我这样第一次使用 prolog 的人来说,拥有一些面向对象的元素是令人放心的。我不知道任何一个记录的数据库,这似乎非常容易和快速使用。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多