我目前有一个(Key,Value)对列表,我想拉出所有在另一个函数中使用的键。
这样我有一个名为
的列表PairsList
我想要
retractall(map(Key,_).
我试过了:
retractall(map(PairsList[(Key,_)],_).
但这只会引发语法错误。
任何帮助都会超级棒!
答案 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].