2016-03-30 3 views
2

Если у меня есть список [1,2,3,4,5], как я могу получить последовательные пары и выполнить операцию над ними? Например, я хочу получить (1,2) и выполнить doSomething на них. На следующей итерации я хочу получить (2,3) и так далее. Это то, что я до сих пор:Список прологов последовательных пар

listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]). 

я могу сделать первую итерацию, но я застрял при сравнении H2 и H3.

ответ

2

Во-первых, если у вас есть [1,2,3,4,5], то [H1,H2|T] наборы H1 = 1, H2 = 2, T = [3,4,5]. H1 и H2 - это два числа, над которыми вы хотите работать. [H2|T] = [2,3,4,5] делает список, который вы можете приступить к вычислению. (. Она начинается с 2,3 в конце концов, так рекурсии на это даст вам две следующие цифры, которые вы хотите)

Таким образом, ваш рекурсивный случай должен быть:

listpairs([H1,H2|T]) :- doSomething(H1,H2), listpairs([H2|T]). 

Ie: Take H1 и H2 из , сделайте с ними что-то, затем положите H2 обратно и повторите.

Во-вторых, вам нужен базовый вариант для только имея один элемент слева:

listpairs([H]). 

Если опустить это, вы никогда не достигнет базового варианта, если в списке есть, например, 5 элементов, так как мы всегда положили 1 назад. (Например, список вы рекурсия на никогда не будет пустым.)

+0

спасибо! Я не могу поверить, что это так. –

0

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

forall(append(_,[X,Y|_],List), doSomething(X,Y)). 
Смежные вопросы