Lambda 序言:从对列表中提取单个列表

Lambda 序言:从对列表中提取单个列表,lambda,prolog,Lambda,Prolog,我有一个成对的列表:[{1,a},{2,b},{3,c},{4,d}] 如何提取每对中的第二个元素并将其作为单独的列表 所以:[a、b、c、d] 很抱歉,我对Prolog不熟悉,环顾四周寻找答案,但找不到。您显示的不是成对的列表。这是: [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,

我有一个成对的列表:[{1,a},{2,b},{3,c},{4,d}]

如何提取每对中的第二个元素并将其作为单独的列表

所以:[a、b、c、d]


很抱歉,我对Prolog不熟悉,环顾四周寻找答案,但找不到。

您显示的不是成对的列表。这是:

[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).
但你可以自己决定什么最有效,只要记住:

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

?- write_canonical(1-a).
-(1,a)
true.
关于序言的好材料,除其他外:

  • Amzi Inc.Prolog中的冒险(网络)
  • 现在就学习序言吧!(网络)
  • 《序言的艺术》,斯特林和夏皮罗(书)

仅使用SWI Prolog,您可以

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

您可以在那里找到library(lambda):

对不起,这是个错误。你说得对,[1-a,2-b,3-c,4-d]是我想要的。顺便说一句,谢谢参考。给出的定义适用于任何符合标准的Prolog系统-包括SICStus!