我目前有一個(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