如何在Prolog中找到从开始编号到结束编号的序列。我的功能应该是
findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6
答案 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]).
这会照顾你的用例和明显的用例。