2013-11-14 7 views
2

У меня есть список пар: [{1, а}, {2, б}, {3, с}, {4, д}]Пролог: извлечь один список из списка пар

Как я могу извлечь второй элемент каждой пары и сделать отдельный список?

Итак: [а, Ь, с, d]

Извините, я новичок в Прологе, и взглянули вокруг для ответа, но не смог найти его.

ответ

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). 

Но вы можете сами решить шляпа лучше всего работает, просто имейте в виду:

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

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

Хороший материал на Прологе, среди прочего:

  • Amzi Inc. Приключения в Прологе (веб)
  • Learn Prolog Now! (паутина)
  • «Искусство Пролога», Стерлинг и Шапиро (книга).
+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

Смежные вопросы