我正在学习prolog,想知道是否有人给我关于如何做这个问题的指导,这是这个领域中的第一个,知道如何做这个问题真的会帮助我进步。提前谢谢你。
使用Prolog定义一个谓词mapof(K,M,V),这样,当使用K实例化到一个键,而M实例化到一个映射来调用时,mapof会将变量V实例化为与映射M中的K相关联的值(或其中一个值)。如果K在映射M中不作为键出现,则谓词应该失败。
发布于 2015-03-28 00:36:48
这真的取决于你想要如何表示你的“映射”。在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)是错误的;对于简单的情况,这是最便宜的解决方案。
发布于 2015-03-27 23:19:02
您可以使用内置的谓词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.https://stackoverflow.com/questions/29303158
复制相似问题