列出Prolog中的元组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出Prolog中的元组相关的知识,希望对你有一定的参考价值。

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

以上是关于列出Prolog中的元组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Haskell 中连接幻像类型中的元组?

有没有办法在 Prolog 中扩展爱因斯坦的谜语?

选择满足 SQL 中条件的元组列表

在prolog中列出连续的对

如何通过循环传递 isinstance 中的元组? [复制]

对于非常大的元组/文件/数据库记录/numpy.ndarray,linux“更多”类似于python中的代码?