在prolog中实现“for(+ N1,+ N2,+ Step,N)”

时间:2015-04-16 05:43:41

标签: prolog backtracking

问题是当我实现这个问题时:

for(+N1,+N2,+Step,N)

for(1,7,2,N).
N=1;
N=3;
N=5;
N=7
true

我所做的代码是:

for(N1,_,_,N1). 

for(N1,N2,Step,N):- N1 < N2, N1S is N1 + Step, for(N1S,N2,Step,N).

但是当它运行时它会显示:

?- for(1,7,2,N).
N = 1 ;
N = 3 ;
N = 5 ;
N = 7 ;
false.

我认为必须在N=7; True之后显示,但它显示为false。 我想在我写的代码中,有一些我想念的东西。

2 个答案:

答案 0 :(得分:1)

false不应该打扰你;就像@nhahtdh已经指出的那样,只是在那里通知你Prolog的回溯引擎没有路径。

但是如果你坚持, 可以通过使用剪切来阻止false

for(N1, N2, Step, N1) :- N1 =< N2, N1 + Step > N2, !.
for(N1, N2, _, N1) :- N1 =< N2.
for(N1, N2, Step, N) :- N1S is N1 + Step, N1S =< N2, for(N1S, N2, Step, N).

来源:Can you write between/3 in pure prolog?

答案 1 :(得分:-2)

我的老师告诉我另一个更容易的方法,最后用True来实现。

for(N1,_,_,N1). 

for(N1,N2,Step,N):- N1 < N2, N1S is N1 + Step, for(N1S,N2,Step,N).

for(_,_,_,_).