1

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

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

4 回答 4

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

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

于 2013-02-14T17:49:00.167 回答
0

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

于 2013-02-14T08:08:02.763 回答
0

这应该有效。这考虑了From<=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
于 2013-02-14T13:59:38.237 回答
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]).

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

于 2013-02-14T17:29:42.870 回答