Prolog 实施“;对于(+;N1,+;N2,+;步骤,N)”;在序言中

Prolog 实施“;对于(+;N1,+;N2,+;步骤,N)”;在序言中,prolog,backtracking,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). 我认为in必须在N=7之后显示单词True,但它显示为false。 我想在我写的代码中,我遗漏了一些东西 错误的不应该打扰你;正如@nhahtdh已经指出的

问题是当我实现此问题时:

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).
我认为in必须在
N=7之后显示
单词
True
,但它显示为
false

我想在我写的代码中,我遗漏了一些东西

错误的
不应该打扰你;正如@nhahtdh已经指出的,它只是通知您Prolog的回溯引擎已经没有路径了

但是,如果您坚持,可以使用剪切来防止
错误

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).
用于(N1,N2,步骤,N1):-N1=N2!。
对于(N1,N2,u,N1):-N1=

来源:

最后,我的老师告诉我另一种更容易实现
True
的方法

for(N1,_,_,N1). 

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

for(_,_,_,_).
用于(N1,,,N1)。
对于(N1,N2,步骤,N):-N1
这是正确的
false
表示不再有满足条件的N。我相信,与示例中一样,在执行过程中,N=7后必须显示为“True”;Thanx,但我想对你来说有点困难。试着找出第二线的切割位置会花费我太多的时间。你是正确的。即使它给我的是真实的,也是有缺陷的。
for(N1,_,_,N1). 

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

for(_,_,_,_).