我的申请表我有很多代理商,每个代理商都有自己的知识库 我最初的想法是拥有多个引擎实例,但swi prolog最多允许一个实例 另一种方法是在每个事实和规则中添加一个代表代理ID的附加术语,但这看起来非常麻烦。
例如,而不是:
position(10, 20).
do(action(X)):-...
我必须到处写:
position(agent0, 10, 20).
do(Agent, action(X)):-...
因为我会一次更新一个代理,即使我不知道怎么做,每次保存和恢复一切都可以。或者使用模块?
什么是分离不同知识库的好方法?
答案 0 :(得分:3)
我认为你建议在你的事实中添加一个原子ID以识别它对应的代理是一个很好的建议,但是同意这一点在回顾过程中加入你的代码可能很麻烦。
以下是其他一些建议,大致按照我的偏好顺序......
recorda/3
和谓词来分别使用代理ID记录每个代理的事实,然后使用recorded/2,3
来检索它们。几乎正是你想要的。 agent0:position(10,20)
。assert/2
明确跟踪您为每个代理断言的事实。通过保留标识特定代理所声明的所有事实的引用列表,您可以使用erase/1
快速撤消它们。请注意,使用带有clause/3
组合的子句引用来通过引用和retract/1
一起检索子句可能会撤回属于其他代理的like-clauses。[agent0-[fact1(..), fact2(..), ...], agent1-[...], ...]
并随时更新此术语。请注意,这不如使用数据库本身那么有效,因为它需要对特定事实进行大量线性扫描;哈希查找不能使用。