2012-11-07 47 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