2013-11-14 105 views
2

我有對的列表:[{1,},{2,B},{3,C},{4,d}]Prolog的:從對的列表中提取的單個列表

我怎樣才能提取每一對的第二個元素,並創建一個單獨的列表?

所以:[A,B,C,d]

對不起,我是新來的Prolog,和周圍一看答案,但無法找到它。

回答

3

你所顯示的不是一個成對的列表。這就是:

[1-a, 2-b, 3-c, 4-d]. 

有了這個列表,你可以這樣做:

?- pairs_values([1-a, 2-b, 3-c, 4-d], V). 
V = [a, b, c, d]. 

?- pairs_keys([1-a, 2-b, 3-c, 4-d], K). 
K = [1, 2, 3, 4]. 

而且,做了謂詞是明確的:

seconds([], []). 
seconds([_A-B|Pairs], [B|Secs]) :- 
    seconds(Pairs, Secs). 

如果你堅持,當然,:

secs([], []). 
secs([{_A, B}|Pairs], [B|Secs]) :- 
    secs(Pairs, Secs). 

但是你可以自己決定w帽子效果最好,只要記住:

?- write_canonical({1,a}). 
{}(','(1,a)) 
true. 

?- write_canonical(1-a). 
-(1,a) 
true. 

好材料上序言,其中包括:

  • 暗洗公司冒險在序言(網絡)
  • 瞭解Prolog的現在! (網絡)
  • 「藝術的序言」,斯特林和夏皮羅(書)。
+0

對不起,這是一個錯誤。你說得對,[1-a,2-b,3-c,4-d]就是我想要的。順便說一句,謝謝你的參考。 – Hydar77

2

隨着SWI-Prolog的唯一,你可以做

:- use_module(library(lambda)). 
extract_second(In, Out) :- 
    maplist(\X^Y^(X = {_,Y}), In, Out). 

你可以得到庫(拉姆達)有:http://www.swi-prolog.org/download/pack/lambda-1.0.0.tgz

+1

給定[此處](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord#implementation)的定義適用於任何符合Prolog的系統 - 包括SICStus! – false