Prolog递归减法

Prolog递归减法,prolog,Prolog,几天前我学了prolog,我有点执着于这个问题。我想递归地减去一个数,直到这个数小于0。在伪代码中,类似于: N:=0 while(Y>=X) { Y := Y-X N := N+1 Y := Y+2 } 例如,如果我有Y=20和X=10,那么我们会得到N=2和Y=4 有什么想法吗?提前谢谢。谢谢你的帮助。我正在使用SWI Prolog 编辑1 到目前为止,我所完成的是(尽管我不确定它是否正确): 我很难找到我的基本案例,我不知道如何实现它。另外,在足够的中,我已

几天前我学了prolog,我有点执着于这个问题。我想递归地减去一个数,直到这个数小于0。在伪代码中,类似于:

N:=0
while(Y>=X)
{
    Y := Y-X
    N := N+1
    Y := Y+2
}
例如,如果我有
Y=20
X=10
,那么我们会得到
N=2
Y=4

有什么想法吗?提前谢谢。谢谢你的帮助。我正在使用SWI Prolog

编辑1 到目前为止,我所完成的是(尽管我不确定它是否正确):


我很难找到我的基本案例,我不知道如何实现它。另外,在
足够的
中,我已经实现了,显然当
Y所有递归函数都需要至少一个基本情况时。在什么情况下,函数应该说,好的,我有答案,不需要递归

在这种情况下,伪代码循环就完成了,对吗

通常我们用以下格式编写:

factorial(0,1).                          % The factorial of 0 is 1.
factorial(N,Factorial) :-
   N>0,                                   % You may need to test applicability 
                                          %    of this recursive clause
   NMinus1 is N-1,                        % maybe some setup
   factorial(NMinus1,FactorialOfNMinus1), %recursive call
   Factorial is N*FactorialOfNMinus1).    %and maybe some code after
我不想为你做家庭作业,但这会让你走:

sufficient(X,Y,M,N,F) :- %whatever condition means you're done, 
                         % and results = whatever they should
sufficient(X,Y,M,N,F) :- %whatever condition means you aren't done
                         % and setting up results w/ a recursive call

还有一个提示:看起来M是一个临时变量,不必是参数。

@TopologicalSort已编辑!先试试!你可以在那里定义加法,这和减法是一样的@false你能详细说明一下吗?假设:
nat_nat_dif(A,B,D):-nat_nat_sum(B,D,A)。
如果X和Y已知,则不需要后续算法
is
就足够了。是的,M是一个临时变量。我把它拿走了。然而,我仍然看不到基本案例需要如何实现。在过去的几天里,我一直被困在那里。如果我将它实现为
足够(X,Y,0,F):-Y>=X
,这显然是错误的,因为如果我在SWI Prolog提示符中以相同的方式调用它,它甚至不会递归。你能提供更多的建议吗?另外,我用以下内容更改了第二个
fulfund
:-F是Y-X,加上(N,1,N),F是F+2,fulfund(X,F,N,F)。
如果你有一个新版本:编辑你原来的帖子?当我试图编译您的新版本时,我遇到了第一个子句缺少句点的问题。当我解决这个问题时,我遇到了一个问题,
plus(N,1,N)
不起作用(我知道F是F+2也不起作用),这可能是你最大的问题:在PROLOG中,就像在逻辑中一样,F=F+2是无意义的:F不能比它本身多2!如果你想要比F高2的东西,就需要一个新名字。FPlus2是F+2,可以了!我的错!如果你有兴趣的话,我会在10分钟内编辑它。我可能需要稍后再看一遍,但现在,让我说:是的,
F是Y-X
是减法,应该可以,只要你到达那条线时Y和X都有值,它们应该有值。当我现在运行它时,它会抱怨它不能将1加到M,得到N,因为M没有值。正如您所指出的,D和E没有用处,因为它们与传入的参数(X、Y、M、N、F)没有任何关系。根据您在最近的编辑中所做的评论,似乎您正在考虑传入N和F,这意味着N和F将更改值,但您不能这样做。D和E与N和F的关系如何?把它写进你的代码里。(我不会具体说明,但我们知道F与上面的Y和X的关系。)
factorial(0,1).                          % The factorial of 0 is 1.
factorial(N,Factorial) :-
   N>0,                                   % You may need to test applicability 
                                          %    of this recursive clause
   NMinus1 is N-1,                        % maybe some setup
   factorial(NMinus1,FactorialOfNMinus1), %recursive call
   Factorial is N*FactorialOfNMinus1).    %and maybe some code after
sufficient(X,Y,M,N,F) :- %whatever condition means you're done, 
                         % and results = whatever they should
sufficient(X,Y,M,N,F) :- %whatever condition means you aren't done
                         % and setting up results w/ a recursive call