2012-11-07 48 views
1

我目前有一个(Key,Value)对的列表,我想抽出所有在另一个函数中使用的密钥。在Prolog对列表中找到密钥

这样的,我有一个名为

PairsList 

名单,我想

retractall(map(Key,_). 

我曾尝试:

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

但只是抛出一个语法错误。

任何帮助将超级!

回答

2

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方式

1

如果使用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]. 
+0

要小心效率。 lambda需要一点点爱,至少当我上次测试时,没有办法让变量副本可选... – CapelliC

+0

@chac:'maplist/3'类似。 SWI的有效支持仍在等待其实现。 – false