在我的应用程序中,我有许多代理,每个代理都有自己的知识库。
我最初的想法是拥有多个引擎实例,但swi prolog最多只允许一个实例。
另一种方法是在每个事实和规则中添加一个表示代理id的附加术语,但这似乎非常繁琐。
例如,而不是:
position(10, 20).
do(action(X)):-...我将不得不到处写:
position(agent0, 10, 20).
do(Agent, action(X)):-...因为我会一次更新一个代理,即使每次保存和恢复所有内容都可以,即使我不知道如何做到这一点。或者使用模块?
分离不同知识库的好方法是什么?
发布于 2012-12-17 14:43:48
我认为你建议在事实中添加一个原子ID来标识它所对应的代理,这是一个很好的建议,但是我同意,在回顾过去的时候,将这添加到你的代码中可能会很麻烦。
这里有一些其他的建议,大致按照我的喜好排序。
recorda/3和like谓词分别使用代理ID记录每个代理的事实,然后使用recorded/2,3来检索它们。几乎就是你想要的。assert/2断言agent0:position(10,20).erase/1快速收回它们。请注意,将子句引用与clause/3结合使用来通过引用和retract/1检索子句可能会将属于其他agents.[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...],并在执行过程中更新此术语。请注意,这不像使用数据库本身那样高效,因为它需要对特定事实进行大量线性扫描;不能使用散列查找。https://stackoverflow.com/questions/13901717
复制相似问题