Prolog列出连续对

时间:2016-03-30 23:25:09

标签: list loops prolog iteration

如果我有一个列表[1,2,3,4,5],我如何获得连续的对并对它们执行操作?例如,我想得到(1,2)并对它们执行doSomething。在下一次迭代中,我想获得(2,3),依此类推。这就是我到目前为止所做的:

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

我可以进行第一次迭代,但在比较H2和H3时我会陷入困境。

2 个答案:

答案 0 :(得分:2)

首先,如果您有[1,2,3,4,5],则[H1,H2|T]设置H1 = 1H2 = 2T = [3,4,5]。 H1和H2是您想要处理的两个数字。 [H2|T] = [2,3,4,5]生成您可以继续计算的列表。 (毕竟它从2,3开始,所以递归它会给你下两个你想要的数字。)

所以你的递归案例应该是:

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

即:将H1和H2取出,用它们做一些事情,然后把H2放回去并递归。

其次,你需要一个基础案例,只剩下一个元素:

listpairs([H]).

如果省略这一点,如果列表包含例如,您将永远不会达到基本情况5个元素,因为我们总是放1个。 (即,你递归的名单永远不会是空的。)

答案 1 :(得分:0)

而不是明确的“循环”,您可以使用这种惯用法:

forall(append(_,[X,Y|_],List), doSomething(X,Y)).