На самом деле, кортеж является составным:
?- 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).