首页 > 解决方案 > 从数字中减去 1(Prolog 中的递归)

问题描述

我试图了解如何在 Prolog 中编写递归函数。我提供了以下代码:

reduceBy1(Input,Output) :-
    (Input > 0 -> Output is Input - 1). 

调用 reduceBy1(10,Output)。结果为 9。到目前为止,一切都很好。但是我如何将 Output 传回 redcyBy1\2 ?

标签: recursionprolog

解决方案


这是一种方法:

reduceBy1(0,[]).
reduceBy1(H,[H|T]) :-
         (H>0-> 
         H1 is H-1,
         reduceBy1(H1,T)).

假设您提供一个数字作为输入,现在您希望它按降序打印所有数字。输出列表应以 1 结尾。

第一个谓词是基本情况:它表示当在我们的例子中为 H 的 Input 为 0 并且列表中的任何内容时,程序都应该停止。基础谓词是带有结束条件的谓词。对于下一个谓词,我们将 H 作为输入,将 [H|T] 作为输出,意思是从输入数字开始输出,这就是为什么 [H|T]。然后检查 Input 是否大于 0,然后减去 1 并将其保存到 H1。现在我们给 reduceBy1 新值 H1 ,它成为新的 input , 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

推荐阅读