List Prolog-映射(关联数组)

List Prolog-映射(关联数组),list,prolog,List,Prolog,我正在学习prolog,想知道是否有人能给我指导如何做这个问题,这是这个领域的第一个问题,知道如何做这个问题将真正帮助我进步。先谢谢你 使用Prolog定义谓词mapof(K,M,V),这样,当K实例化为键,M实例化为映射时,mapof将变量V实例化为值(或其中一个值)与映射M中的K关联。如果K在映射M中没有显示为键,则谓词应失败。使用内置谓词member/2您可以像这样构建谓词mapof/3: mapof(K, M, V):- member((K,V), M). 咨询: ?- mapof(k

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


使用Prolog定义谓词mapof(K,M,V),这样,当K实例化为键,M实例化为映射时,mapof将变量V实例化为值(或其中一个值)与映射M中的K关联。如果K在映射M中没有显示为键,则谓词应失败。

使用内置谓词
member/2
您可以像这样构建谓词
mapof/3

mapof(K, M, V):- member((K,V), M).
咨询:

?- mapof(k1, [(k, a),(k1,b),(k2,c),(k1,d)], V).
V = b ;
V = d.

这实际上取决于您希望如何表示“映射”。在Prolog中,事实表是最明显的方法。对于两个映射
m
n

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(K, m, V) :- m(K, V).
mapof(K, n, V) :- n(K, V).
或者可能:

mapof(K, M, V) :- call(M, K, V).
列表可以用来表示映射,如@Yasel所示,但是Prolog中的列表
[A,b,c]
是一个嵌套的术语,类似于
(A,.(b,[]))
。通常不会将关联数组表示为单链表,对吗

在SWI Prolog中有一个库,它比使用简单列表来表示Prolog术语的可回溯关联数组要好。有了它,您可以:

mapof(K, M, V) :- gen_assoc(K, M, V).
此库将关联数组表示为AVL树。您可以在SWI Prolog代码源中找到另外两个关联数组实现:一个使用,另一个使用


如果关联数组中的键值对超过100个,那么这里提到的所有三个库可能比简单的键值对列表更有效。这并不意味着使用对列表和执行
成员(键值,对列表)
是错误的;这是简单情况下最便宜的解决方案。

将其列为一个配对列表:
K-V
而不是
(K,V)
[K-a,k1-b..]
而不是
[(K,a),(k1,b)]
。成对比Prolog中的“元组”更为传统。对问题进行破坏性编辑绝对不合适。阅读指南。