在prolog中,递归是如何工作的

在prolog中,递归是如何工作的,prolog,Prolog,我的目标是取X和Y之间的数字,然后生成Z num_between(3,6, All) 例如,若X为3,Y为6,则Z是X和Y之间的数字列表(包括X和Y)。类似于num_介于3,6、[3,4,5,6]之间的值应该为true。以下是我目前掌握的情况: num_between(0,0, []). num_between(X,Y, All) :- increase(X, New) , % increase number X++ \+(X = Y) ,

我的目标是取X和Y之间的数字,然后生成Z

num_between(3,6, All)
例如,若X为3,Y为6,则Z是X和Y之间的数字列表(包括X和Y)。类似于num_介于3,6、[3,4,5,6]之间的值应该为true。以下是我目前掌握的情况:

num_between(0,0, []).
num_between(X,Y, All) :- 
  increase(X, New) ,           % increase number X++
  \+(X = Y) ,                  % check if  X is not equal to Y
  num_between(New,Y,[All|X]) . % requestion ???

increase(F,N) :- N is F+1 .
递增/1正在工作并返回所需的数字,但 当递归在/3之间通过num_时,它将不亮起:X为6,然后按照我的意愿失败, 但我无法保存号码或返回号码。全部=[3,4,5,6]


有人能帮忙吗

您必须同时更改基本大小写和递归子句:

num_between(X, X, [X]).
num_between(X, Y, [X|L]):-
  X < Y,
  increase(X, New),
  num_between(New, Y, L).
第一个子句是基本情况,它声明从X到X的数字只是[X]


递归子句指出,小于数字Y的数字X应该在输出列表中,因此头的第三个参数中的[X | L]是,然后它增加了值,我只是用你的helper过程来实现它,然后用第一个参数的新值递归地调用它自己。

你的base子句是不正确的:因为你从来没有减少X或Y,除非Y从零开始,而X从非正值开始,否则它们永远不会达到零。base子句应如下所示:

num_between(X, Y, []) :- X > Y.
num_between(X, Y, [X|Tail]) :-
    X =< Y,
    Next is X + 1,
    num_between(Next, Y, Tail).
这可以确保当用户输入无效的向后范围(例如从6到3)时,得到一个空结果

现在转到main子句:您只需检查范围是否有效,获取下一个值,并进行递归调用,如下所示:

num_between(X, Y, []) :- X > Y.
num_between(X, Y, [X|Tail]) :-
    X =< Y,
    Next is X + 1,
    num_between(Next, Y, Tail).

您通过递归调用链传递所有扩展后的结果。这应该是另一种方式-您需要传入一个尾部来收集结果,然后在递归调用结束时将X预先挂起到该尾部。

我将沿着以下几行来写:

numbers_between( X , X , [X]    ) .   % if X and Y have converged, we have the empty list
numbers_between( X , Y , [X|Zs] ) :-  % otherwise, add X to the result list
  X < Y ,                             % - assuming X is less than Y
  X1 is X+1 ,                         % - increment X
  numbers_between(X1,Y,Zs)            % - recurse down
  .                                   %
numbers_between( X , Y , [X|Zs] ) :-  % otherwise, add X to the result list
  X > Y ,                             % - assuming X > Y
  X1 is X-1 ,                         % - decrement X
  numbers_between(X1,Y,Zs)            % - recurse down
  .                                   %

如果Y>X呢?从来没有[]的理由吗?谢谢。这是一个很好的解释,它的工作正是我想要的。