这真的取决于你想如何表示你的“映射”。在 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 将类似于:
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, .(c, [])))。您通常不会将关联数组表示为单链表,对吧?
在 SWI-Prolog 中有一个库,它比使用简单列表更好地表示为 Prolog 术语的可回溯关联数组:library(assoc)。有了它,你可以做到:
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) 是错误的;对于简单的情况,这是最便宜的解决方案。