2013-11-14 59 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