Получение каждого второго элемента из кортежа в списке кортежей - PullRequest
0 голосов
/ 17 сентября 2018

Так что я недавно начал использовать пролог, так как я начал использовать AI и FOL.Я заметил довольно много различий с другими языками, которые я использовал, такими как Python и Java, и мне трудно "сравнивать" эти языки.

Основная проблема, с которой я сталкиваюсь, заключается в том, что у меня нетИдея, как создать правило для получения списка второго элемента кортежей в списке.

Входные данные представляют собой список кортежей, например: [(1,aa),(2,bb),(3,cc),(4,dd)].

Я пытаюсь написать такую ​​функцию, чтобы вывод представлял собой СПИСОК ВТОРОГО ПУНКТА КАЖДОГО РЯДА в списке, а именно [aa, bb, cc, dd]

Я уже пробовалделать что-то вроде "extract_second_item([(1,aa),(2,bb),(3,cc),(4,dd)], [(_ , output)|_])".Но когда я запускаю эту функцию, она возвращает только второй элемент первого кортежа (aa), но, очевидно, не остальные.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

На самом деле, кортеж является составным:

?- write_canonical((a,b,c)).
','(a,','(b,c))
true.

так что arg / 3 довольно функционально для извлечения второго аргумента по позиции из кортежа:

?- arg(2,(a,b),X).
X = b.

Вы можете решить свою проблему компактно, используя лямбда выражение

?- maplist([X,Y]>>arg(2,X,Y), [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

Кортежи не широко используются в Прологе, действительно, проблема имеет более простое решение, напрямую применяя сопоставление с образцом:

?- maplist([X,Y]>>(X=(_,Y)), [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

В лямбда-аргументах можно использовать сопоставление с образцом:

?- maplist([(_,Y),Y]>>true, [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

Вместо библиотеки (yall) вы можете выбрать библиотеку (лямбда), скорость торговли для переносимости:

?- use_module(library(lambda)).
true.

?- maplist(\X^Y^(X=(_,Y)), [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

В SWI-Prolog для этого требуется установить пакет ( lambda ),

?- pack_install(lambda).
0 голосов
/ 17 сентября 2018

Вам нужно использовать простую рекурсию:

extract_second_item([], []).
extract_second_item([(_,X)|T], [X|T2]):- extract_second_item(T,T2).

Теперь запрос:

?- extract_second_item([(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

Другой замечательный способ, предложенный @lurker, - это использование maplist/3:

Сначала мы определяем простой предикат, который возвращает второй элемент из кортежа:

second_item((_,X), X).

Затем мы сопоставляем second_item / 2 с каждым кортежем в списке, используя maplist/3:

?-maplist(second_item, [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...