我正在尝试在Prolog中编写一个子句,它接受一个列表并返回边的谓词。例如:
?- listpairs([1, 2, 3], X, Y).
X = 1
Y = 2;
X = 2
Y = 3;
这是我到目前为止所尝试过的,并没有到达任何地方。
listpairs([H], H, H).
listpairs([H1,H2|T], X, Y) :-
X is H1,
Y is H2,
listpairs([H2|T], X, Y).
如果有人可以提供帮助,我将不胜感激。
问题是通过写:
X is H1,
Y is H2
X,Y得到实例化,这意味着它们的值不能进一步改变,因此你的谓词将会公开,因为在下一次递归迭代中你试图重新实例化X,Y。
尝试:
listpairs([H1,H2], H1, H2).
listpairs([H1,H2,_|_], H1, H2).
listpairs([_,H2|T], X, Y) :- listpairs([H2|T], X, Y).
例:
?- listpairs([1, 2, 3, 4, 5], X, Y).
X = 1,
Y = 2 ;
X = 2,
Y = 3 ;
X = 3,
Y = 4 ;
X = 4,
Y = 5 ;
false.