首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog- Mappings (关联数组)

Prolog- Mappings (关联数组)
EN

Stack Overflow用户
提问于 2015-03-27 22:31:41
回答 2查看 1.1K关注 0票数 5

我正在学习prolog,想知道是否有人给我关于如何做这个问题的指导,这是这个领域中的第一个,知道如何做这个问题真的会帮助我进步。提前谢谢你。

使用Prolog定义一个谓词mapof(K,M,V),这样,当使用K实例化到一个键,而M实例化到一个映射来调用时,mapof会将变量V实例化为与映射M中的K相关联的值(或其中一个值)。如果K在映射M中不作为键出现,则谓词应该失败。

EN

回答 2

Stack Overflow用户

发布于 2015-03-28 00:36:48

这真的取决于你想要如何表示你的“映射”。在Prolog中,事实表是最明显的方法。对于两个映射mn

代码语言:javascript
复制
m(a, 1).
m(b, 2).
m(c, 3). % and so on

n(a, foo).
n(b, bar).
n(c, baz). % and so on

然后,您的mapof将类似于以下内容:

代码语言:javascript
复制
mapof(K, m, V) :- m(K, V).
mapof(K, n, V) :- n(K, V).

或者:

代码语言:javascript
复制
mapof(K, M, V) :- call(M, K, V).

列表可以用来表示映射,如@Yasel所示,但是Prolog中的列表[a, b, c]是一个嵌套的术语,如.(a, .(b, .(c, [])))。您通常不会将关联数组表示为单链表,对吧?

在SWI-Prolog中,有一个库比使用简单的列表表示为Prolog术语的可回溯关联数组更好:library(assoc)。使用它,您可以:

代码语言:javascript
复制
mapof(K, M, V) :- gen_assoc(K, M, V).

这个库将关联数组表示为AVL树。您可以在SWI-Prolog代码源代码中找到另外两个关联数组实现:一个使用RB-trees,另一个使用non-backtrackable RB-trees

如果您的关联数组中包含的键值对超过100个,那么这里提到的所有三个库都可能比简单的键值对列表[k1-v1, k2-v2...]更有效。这并不意味着使用对列表并执行member(Key-Value, List_of_pairs)是错误的;对于简单的情况,这是最便宜的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2015-03-27 23:19:02

您可以使用内置的谓词member/2构建谓词mapof/3,如下所示:

代码语言:javascript
复制
mapof(K, M, V):- member((K,V), M).

咨询:

代码语言:javascript
复制
?- mapof(k1, [(k, a),(k1,b),(k2,c),(k1,d)], V).
V = b ;
V = d.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29303158

复制
相关文章

相似问题

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