1

我现在正在尝试使用 sw-prolog 中的 assoc 库来创建一个关系 prolog 程序。我需要一个可以存储多个值的字典。这可以使用列表作为值轻松完成。

但是,我经常需要查找所有键、单个值——即识别包含一个特定值项的所有键。(但是,value 的数量通常限制为最多几十个项目)。

如果我只使用从键映射到多个值的关联存储,那么我需要遍历所有键,获取值,然后检查一个值是否是它的成员。

这效率不高,而且似乎也无法使用大量键进行扩展。

有没有更有效的方法来做到这一点?

我可以为每个值项管理其自己的“反向”键值存储,但这似乎效率很低。此外,如果我要使用 prolog 事实存储(带有 assert/ 和撤回),将每个键值对存储为一个单独的事实,我可能会免费获得这些查找“索引”。

这里关系方法的正确设计选择是什么?

[edit-1]:顺便说一句,一个“解决方案”可能是允许在 assoc 库中有多个键,以防值在内部被“索引” - 但是, assoc 库不支持这个(就我知道)。

[edit-2]:查看 swi-prolog 中的其他库,我注意到未加权的图表。也许使用图结构来处理键和值之间的这种多对多关系会更有效。并且,与关系方法保持一致。

[edit-3): 或者,ugraph 可能不是一个好主意,因为没有输入节点(和链接)。我需要在结构上指出哪个节点是键,哪些是值。

谢谢你,

丹尼尔

4

0 回答 0