列出Prolog中的元组

问题描述 投票:2回答:1

我正在尝试在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).

如果有人可以提供帮助,我将不胜感激。

list prolog
1个回答
2
投票

问题是通过写:

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.
© www.soinside.com 2019 - 2024. All rights reserved.