从头到尾开始

时间:2013-02-14 06:51:20

标签: prolog

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

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

4 个答案:

答案 0 :(得分:2)

这里是一个简单的程序

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)).

对于任何实际用途,您应该检查between / 3是否有效。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这应该有效。这考虑了From&lt; = To。如果你想检查是否

,可以写一点复杂
findSequence(X,X,[X]):-!.
findSequence(From,To,[From|Rest]):-SuccFrom is From +1, findSequence(SuccFrom ,To, Rest).

返回一个列表,即:

?-findSequence(1,3,List).
List=[1,2,3].
yes

答案 3 :(得分:0)

这是一个有趣的案例,你所要求的并不是特别难,但你设法以如此迂回的方式问它,我们花了很多时间试图找出你想要的东西。您根本不需要序列(即列表),您需要连续的答案。并且你希望它能够处理所有整数,而不仅仅是自然数 - 这在你的例子中是隐含的,但没有说明。此外,您的示例不适用于天真的解决方案,因为-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(X, Y, Z) :- 
  min(X, Y, Low),
  max(X, Y, High),
  Z in Low..High,
  label([Z]).

这会照顾你的用例和明显的用例。