首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWI Prolog多知识库

SWI Prolog多知识库
EN

Stack Overflow用户
提问于 2012-12-16 21:26:33
回答 1查看 1.1K关注 0票数 2

在我的应用程序中,我有许多代理,每个代理都有自己的知识库。

我最初的想法是拥有多个引擎实例,但swi prolog最多只允许一个实例。

另一种方法是在每个事实和规则中添加一个表示代理id的附加术语,但这似乎非常繁琐。

例如,而不是:

代码语言:javascript
复制
position(10, 20).
do(action(X)):-...

我将不得不到处写:

代码语言:javascript
复制
position(agent0, 10, 20).
do(Agent, action(X)):-...

因为我会一次更新一个代理,即使每次保存和恢复所有内容都可以,即使我不知道如何做到这一点。或者使用模块?

分离不同知识库的好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-17 14:43:48

我认为你建议在事实中添加一个原子ID来标识它所对应的代理,这是一个很好的建议,但是我同意,在回顾过去的时候,将这添加到你的代码中可能会很麻烦。

这里有一些其他的建议,大致按照我的喜好排序。

  1. 使用recorded database。这样,您实际上可以使用原子键来记录事实,因此可以使用recorda/3和like谓词分别使用代理ID记录每个代理的事实,然后使用recorded/2,3来检索它们。几乎就是你想要的。
  2. 使用modules。假设您可以简单地为每个代理创建新的模块名称,从而将每个代理的事实分开,这与名称空间的使用方式非常相似。例如,使用返回子句引用的assert/2断言agent0:position(10,20).
  3. Keep显式跟踪您为每个代理断言的事实。通过保存一个引用列表,其中标识了为特定代理断言的所有事实,您可以使用erase/1快速收回它们。请注意,将子句引用与clause/3结合使用来通过引用和retract/1检索子句可能会将属于其他agents.
  4. Depending的like-子句撤回到您的程序的结构上,您可以简单地传递一个大型数据结构,其中包含列表中每个代理的所有事实,如:[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...],并在执行过程中更新此术语。请注意,这不像使用数据库本身那样高效,因为它需要对特定事实进行大量线性扫描;不能使用散列查找。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13901717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档