2

我目前有一个(键,值)对列表,我想提取所有键以在另一个函数中使用。

这样我就有一个名为

PairsList 

我想

retractall(map(Key,_).

我努力了:

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

但这只会引发语法错误。

任何帮助都会很棒!

4

2 回答 2

2

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

  • 如果你可以使用 SWI-Prolog,有这个有趣的库(pairs)。而不是(A,B)uses A-B,但对于表示更改,您会获得很多。使用该库,您将使用的内置函数是pairs_keys (Pairs, Keys)

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

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

    键(对,键):- maplist(键,对,键)。
    键((K,_),K)。
    

    请注意,这样我们可以重用从“实际”对表示中抽象出来的逻辑:只需添加

    键(K - _,K)。
    处理首选的 Prolog 方式

于 2012-11-08T00:37:19.647 回答
1

如果你使用 SWI-Prolog 和 module(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].
于 2012-11-08T00:13:17.243 回答