prolog中的哈希表

ned*_*ned 27 dictionary hashtable prolog data-structures

前几天我在prolog中解决了一个谜题,并意识到如果我使用其他编程语言,我会使用哈希表/字典,但据我所知,这在prolog中是不可能的.

所以我的第一个问题是,是否有任何prolog支持类似字典的数据结构与哈希表的性能特征?

其次,我想到,由于大多数prolog使用哈希表来存储谓词,我可以编写一个包装器谓词来断言和收回事实,创建一个字典接口来利用谓词的底层哈希表.但是我会获得散列表的性能特征,还是会增加会降低性能的开销?

And*_*ahl 9

一些Prolog环境具有关联列表,可用于创建和编辑字典:

编辑:

您可以通过在外语中实现谓词来获得更好的性能,例如:

  • 还要检查YAP Prolog,它非常高效并且实现了多种数据结构(AVL树,Splay树,红黑树等):http://www.dcc.fc.up.pt/~vsc/Yap/ (2认同)
  • @Jay,SWI-Prolog使用AVL树作为`library(assoc)` (2认同)

Dav*_*fer 7

我刚刚发现:

SWI-Prolog版本7引入了dicts作为抽象对象,具有用于访问成员的具体现代语法和功能符号,以及用户定义的访问函数.

语法如下:

Tag{Key1:Value1, Key2:Value2, ...}

请参阅Dicts:具有命名参数的结构以获取详细信息.

注意 :

  • 这些是该语言的一等公民
  • dicts之间统一的语义可能在未来发生变化
  • 之前用于提供的.2运算符已被重新用于通过类似的表达式访问dict成员 point{x:1,y:2}.x
  • 可以破坏性地修改Dicts,但不建议这样做,"非逻辑",更不用说非功能性.
  • 当前的底层实现是"使用仿函数的复合术语dict.第一个参数是标记.其余参数创建一个排序键值对的数组"

因此,Prolog使用在过去10年中涌现的"地图"数据类型(例如Clojure中的地图)来捕捉许多语言.