在Prolog对列表中找到键

时间:2012-11-07 22:39:31

标签: lambda prolog

我目前有一个(Key,Value)对列表,我想拉出所有在另一个函数中使用的键。

这样我有一个名为

的列表
PairsList 

我想要

retractall(map(Key,_).

我试过了:

retractall(map(PairsList[(Key,_)],_).

但这只会引发语法错误。

任何帮助都会超级棒!

2 个答案:

答案 0 :(得分:2)

retractall它是一个功能强大的Prolog内存工具,对动态信息管理很有用,但重要的是不要滥用它。在你的问题中,似乎无关紧要。如果你有一对(Key,Value)列表,那么

  • 如果你可以使用SWI-Prolog,那就有这个有趣的库(pairs)。 而不是(A,B)使用A-B,而是为了表示更改,您获得了很多。使用该库,您将使用的内置版本是pairs_keys(Pairs,Keys)

  • 没有任何库,函数(但它是一个关系,不是一个函数)在纯Prolog中写起来真的很容易。

    keys([(Key,_)|Pairs], [Key|Keys]) :- keys(Pairs, Keys).
    keys([], []).
    
  • 我认为最好的方法是使用库中的maplist(apply)和一个非常简单的谓词:

    keys(Pairs, Keys) :- maplist(key, Pairs, Keys).
    key((K, _), K).
    

    请注意,通过这种方式,我们可以重用“实际”对表示中的逻辑抽象:只需添加

    key(K - _, K).
    处理首选的Prolog方式

答案 1 :(得分:1)

如果您使用SWI-Prolog和模块(lambda),您可以编写

maplist(\X^Y^(X = (Y,_)), L, L1),

例如这段代码:

:- use_module(library(lambda)).


t(L, L1) :-
    maplist(\X^Y^(X = (Y,_)), L, L1).

给出

?- t([(1,a), (2,b), (3,c)], L).
L = [1,2,3].