Lambda 在Prolog Pairs列表中查找键

Lambda 在Prolog Pairs列表中查找键,lambda,prolog,Lambda,Prolog,我目前有一个(键,值)对的列表,我想取出所有的键用于另一个函数 这样我就有了一个叫做 PairsList 我想 retractall(map(Key,_). 我试过: retractall(map(PairsList[(Key,_)],_). 但这只是抛出了一个语法错误 任何帮助都会很棒 如果使用SWI Prolog和模块(lambda),则可以编写 maplist(\X^Y^(X = (Y,_)), L, L1), 例如,此代码: :- use_module(library(lamb

我目前有一个(键,值)对的列表,我想取出所有的键用于另一个函数

这样我就有了一个叫做

PairsList 
我想

retractall(map(Key,_).
我试过:

retractall(map(PairsList[(Key,_)],_).
但这只是抛出了一个语法错误


任何帮助都会很棒

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

maplist(\X^Y^(X = (Y,_)), L, L1),
例如,此代码:

:- use_module(library(lambda)).


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

它是一个强大的Prolog内存工具,对于动态信息管理非常有用,但重要的是不要滥用它。在你的问题中,这似乎无关紧要。如果您有一个对(键、值)列表,那么

  • 如果您可以使用SWI Prolog,那么有一个有趣的库()。 而不是
    (A,B)
    使用
    A-B
    ,但是对于表示形式的更改,您获得了很多。对于该库,您将使用的内置项是(对、键)

  • 没有任何库,函数(但它是一个关系,不是函数)很容易用纯Prolog编写

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

    keys(Pairs, Keys) :- maplist(key, Pairs, Keys). key((K, _), K). 键(对,键):-maplist(键,对,键)。 键((K,uu),K)。 注意,通过这种方式,我们可以重用从“实际”对表示中提取的逻辑:只需添加 key(K - _, K). 键(K-UK)。以首选的Prolog方式处理


注意效率。lambda仍然需要一点爱,至少在我上次测试时,没有办法让变量副本成为可选的…@chac:maplist/3的情况也是如此!SWI中的高效支持仍在等待实现。 key(K - _, K).