我目前有一个(Key,Value)对的列表,我想抽出所有在另一个函数中使用的密钥。在Prolog对列表中找到密钥
这样的,我有一个名为
PairsList
名单,我想
retractall(map(Key,_).
我曾尝试:
retractall(map(PairsList[(Key,_)],_).
但只是抛出一个语法错误。
任何帮助将超级!
我目前有一个(Key,Value)对的列表,我想抽出所有在另一个函数中使用的密钥。在Prolog对列表中找到密钥
这样的,我有一个名为
PairsList
名单,我想
retractall(map(Key,_).
我曾尝试:
retractall(map(PairsList[(Key,_)],_).
但只是抛出一个语法错误。
任何帮助将超级!
retractall这是一个强大的Prolog记忆工具,对动态信息管理很有用,但重要的是不要滥用它。在你的问题中,似乎不相关。如果你有对(键,值)的列表,然后
如果你可以使用SWI-Prolog的,有这个有趣的库(pairs)。 而不是(A,B)
使用A-B
,但对于表示变化你获得很多。与该库,你可以使用内置的是pairs_keys(对,键)
没有任何库函数(但它是一个关系,不函数)是很容易的在纯序言写。
keys([(Key,_)|Pairs], [Key|Keys]) :- keys(Pairs, Keys). keys([], []).
我认为最好的方法是使用从库(apply)MAPLIST,和一个非常简单的断言:
keys(Pairs, Keys) :- maplist(key, Pairs, Keys). key((K, _), K).
注意,这样,我们可以重复使用的逻辑,从“实际”对抽象代表性:只需加上
key(K - _, K).来处理首选的Prolog方式
如果使用SWI-Prolog语言和模块(拉姆达),你可以写
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].
要小心效率。 lambda需要一点点爱,至少当我上次测试时,没有办法让变量副本可选... – CapelliC
@chac:'maplist/3'类似。 SWI的有效支持仍在等待其实现。 – false