2013-11-22 3 views
4

У меня есть список сложных терминов с тем же функтором и arity, но разными аргументами. Что-то вроде этого:Получить список чисел из списка сложных терминов

Elements = [element(a, 1), element(b,2), element(c,3)] 

И от этого я хочу, чтобы создать новый список, содержащий только вторые аргументы каждого сложного термина в списке, как это:

Numbers = [1,2,3] 

Есть ли способ спроектировать предикат для решения этой проблемы для любой длины входного списка?

+2

Да, это очень просто. У вас есть какие-то попытки? Подсказка: вы можете использовать 'element (_, N)' будет предоставлять все значения 'N' при обратном трассировке. Кроме того, посмотрите на 'findall' или' setof'. – lurker

+1

Спасибо за комментарий. Да, уже потратил пару часов без результата (я очень новичок в Prolog). Большинство моих попыток вращались вокруг 'element (_, N)', но я узнаю, что я понимаю, как использовать его только для известного количества аргументов, что здесь не так. Попытаюсь использовать 'foreach' &' setof', спасибо за совет. – Timofey

+0

Это 'findall' не' foreach'. ;) Если вы покажете свои попытки, вы получите дополнительную помощь в SO. :) – lurker

ответ

1

ответ Timofey с findall/3: findall(X,member(element(_,X), Elements),Numbers).

Решение с помощью рекурсивного предиката:

element_indexes([], []). 
element_indexes([element(_,N)|Es],[N|Ns]) :- 
    element_indexes(Es, Ns). 
+1

@Timofey: нажмите кнопку accept, отметив этот ответ как полезный. Это лучший способ получить репутацию на SO! – CapelliC

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