Prolog 起止号码

Prolog 起止号码,prolog,Prolog,如何在Prolog中找到从起始编号到结束编号的顺序。我的功能应该是 findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6 考虑使用一个递归谓词,在该谓词中,从起始值(-4)到结束值(-6)累积(在列表中)值 这应该行得通。这考虑到了这是一个有趣的例子,你问的不是特别难,但你设法以一种迂回的方式问,我们花了很多时间试图弄清楚你想要什么。你根本不想要一个序列(即列表),你想要的是连续的答案。您希望它能够处理所有整数,而不仅仅是自然数——这在您的示例中是隐含的,但没

如何在Prolog中找到从起始编号到结束编号的顺序。我的功能应该是

findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6

考虑使用一个递归谓词,在该谓词中,从起始值(-4)到结束值(-6)累积(在列表中)值

这应该行得通。这考虑到了这是一个有趣的例子,你问的不是特别难,但你设法以一种迂回的方式问,我们花了很多时间试图弄清楚你想要什么。你根本不想要一个序列(即列表),你想要的是连续的答案。您希望它能够处理所有整数,而不仅仅是自然数——这在您的示例中是隐含的,但没有说明。另外,您的示例不适用于naive解决方案,因为-4大于-6,这与该谓词通常的编写方式相反

为了解决所有这些问题,我相信最简单的事情就是需要库
clpfd

:- use_module(library(clpfd)).
我们需要几个助手谓词:

min(X, Y, Z) :- X < Y -> Z = X ; Z = Y.
max(X, Y, Z) :- X < Y -> Z = Y ; Z = X.

这将考虑到您的用例和显而易见的用例。

这里是一个简单的过程

findSequence(N, N, N) :- !.
findSequence(S, E, N) :-
    S < E, (N = S ; T is S + 1, findSequence(T, E, N)).
findSequence(S, E, N) :-
    S > E, (N = S ; T is S - 1, findSequence(T, E, N)).
findSequence(N,N,N):-!。
查找顺序(S、E、N):-
SE,(N=S;T是S-1,findSequence(T,E,N))。

对于任何实际使用,您应该检查/3是否可以工作。

?-findSequence(-4,-6,S)。
循环。这里的问题是-4>-6。。。如果要反向执行,请将+1更改为-1。因此,正确的调用方法是:findSequence(-6,-4,S)。问题是您对切割的使用不正确。尝试
findSequence(1,3,[[uu,[uu,[uu,[uu,[u124;]])
,这应该会失败。对于
-4
-6
可能会失败(如果您限制自己),也可能会成功。但不是循环。使用findSequence(1,3,[,,,|])时,您正在尝试查找至少有4个成员的序列,这当然会失败,因为从1到3的列表只有3个成员。因此,请检查用作第三个参数的列表模式。尝试findSequence(1,3,[,| |])。切割是为了防止其他结果出错。尝试findSequence(1,3,[|,| |])。我写了以下两行,如果我跟踪它按照我的预期进行,但它正在打印最终值:
以下两行在哪里?@DanieLyons和Alejandro:我写了以下findSequence(X,X,X)。findSequence(X,Y,Z):-Y>X,X1是X+1,findSequence(X1,Y,Z)。这里的问题是打印最终值。我想为递归中的每个X值打印它。在
X1是X+1
findSequence(X1,Y,Z)
之间添加
write(X)
。它像12345一样打印。。。我想打印输出变量=X
min(X, Y, Z) :- X < Y -> Z = X ; Z = Y.
max(X, Y, Z) :- X < Y -> Z = Y ; Z = X.
findSequence(X, Y, Z) :- 
  min(X, Y, Low),
  max(X, Y, High),
  Z in Low..High,
  label([Z]).
findSequence(N, N, N) :- !.
findSequence(S, E, N) :-
    S < E, (N = S ; T is S + 1, findSequence(T, E, N)).
findSequence(S, E, N) :-
    S > E, (N = S ; T is S - 1, findSequence(T, E, N)).