Recursion 从数字中减去1(Prolog中的递归)

Recursion 从数字中减去1(Prolog中的递归),recursion,prolog,Recursion,Prolog,我试图理解如何用Prolog编写递归函数。我提供了一个包含以下代码的示例: reduceBy1(Input,Output) :- (Input > 0 -> Output is Input - 1). 调用reduceBy1(10,输出)。结果9。到目前为止,一切顺利。但如何将输出传递回ReduceBy1\2?以下是一种方法: reduceBy1(0,[]). reduceBy1(H,[H|T]) :- (H>0-> H1

我试图理解如何用Prolog编写递归函数。我提供了一个包含以下代码的示例:

reduceBy1(Input,Output) :-
    (Input > 0 -> Output is Input - 1). 
调用reduceBy1(10,输出)。结果9。到目前为止,一切顺利。但如何将输出传递回ReduceBy1\2?

以下是一种方法:

reduceBy1(0,[]).
reduceBy1(H,[H|T]) :-
         (H>0-> 
         H1 is H-1,
         reduceBy1(H1,T)).
假设您输入一个数字,现在您希望它按降序打印所有数字。输出列表应以1结尾

第一个谓词是基本情况:它表示当输入(在我们的情况下是H)为0时,以及列表中的任何内容时,程序应该停止。基本谓词是带有结束条件的谓词。对于下一个谓词,我们将H作为输入,[H | T]作为输出,这意味着以输入编号开始输出,这就是为什么[H | T]。然后检查输入是否大于0,然后减去1并保存到H1。现在我们给reduceBy1新的值H1,它成为新的输入,T是开始将数字存储为列表的输出。程序遍历每个谓词以查看哪个谓词是成功的。如果输入为=0[当数字不断递减直到达到那种情况时,就会发生这种情况],因此当它检查基谓词时,它是成功的。程序结束时给出列表中在该点存储的内容

?-reduceBy1(6,L).
L = [6, 5, 4, 3, 2, 1]

?-reduceBy1(10,L).
L = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

?-reduceBy1(-5,L).
False

我不清楚为什么这里需要递归谓词。只是为了学习。不过,告诉我你将如何实现它。@HaiseSaski:但是没有什么需要“枚举/迭代/拆分”的。因此,此处递归不相关(无法执行)。递归是指在数据结构的某一部分上执行相同/相似的任务。所以递归只适用于列表?它不能用于变量?递归不能用于可拆分的对象。例如,一棵树可以被子树拆分,一个列表可以被它的头和尾拆分,等等。但是一个标量数字并没有太多可拆分的部分。此外,递归是用来循环的。但是用1进行减法根本不需要循环。