List Prolog列出连续对

List Prolog列出连续对,list,loops,prolog,iteration,List,Loops,Prolog,Iteration,如果我有一个列表[1,2,3,4,5],我如何获得连续对并对其执行操作?例如,我想得到(1,2)并对它们进行剂量测量。在下一次迭代中,我想得到(2,3),以此类推。这就是我到目前为止所做的: listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]). 我可以做第一次迭代,但在比较H2和H3时我被卡住了。首先,如果你有[1,2,3,4,5],然后[H1,H2 | T]设置H1=1,H2=2,T=[3,4,5]。H1和H2是您想要

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

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

我可以做第一次迭代,但在比较H2和H3时我被卡住了。

首先,如果你有
[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]).
例如:取出H1和H2,对它们做些什么,然后将H2放回并递归

其次,您需要一个只剩下一个元素的基本情况:

listpairs([H]).

如果你忽略了这一点,如果列表中有5个元素,你就永远不会得到一个基本情况,因为我们总是把1放回去。(即,您递归的列表永远不会为空。)

您可以使用这种惯用方法,而不是显式的“循环”:

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