这是我用Prolog编写的阶乘代码的问题

崔秀贤

我编写了两个代码以使用Prolog计算阶乘。
首先是

factorial(0, 1).
factorial(N, Result) :-
   N > 0, factorial(N - 1, Interim), Result is N * Interim.

,第二个是

factorial(0, 1).
factorial(N, Result) :-
   N > 0, M is N - 1, factorial(M, Interim), Result is N * Interim.

当第一个代码有堆栈溢出错误时,第二个代码正常运行。

我为测试编写了以下代码。

sum_2(N, R) :- R is N + 2.
sum_f(N, R) :- sum_2(N + 2, R).

上面的代码正常执行。

我不明白为什么用于计算阶乘的第一个代码是堆栈溢出错误。

如果您能告诉我原因,我将不胜感激。

伊莎贝尔·纽比(Isabelle Newbie)

您确定第一个版本的堆栈溢出吗?你怎么称呼它?像这样的呼叫factorial(5, Result)应该失败,即导致回答像falseno

Prolog不像其他编程语言那样“评估表达式”。像这样的术语N - 1只是数据:带有函子-和两个自变量Nand的术语1即使N势必有些数字,比如说5,术语依然只是5 - 14只是映射到4,如果你专门请教了is谓词或算术比较谓词的一个(>=<=:=等),对其进行评估。

因此,如果将第一个factorial谓词称为factorial(5, Result)则会发生以下情况:

  • 目标factorial(5, Result)与不统一factorial(0, 1),将跳过此子句
  • 目标factorial(5, Result)与相结合factorial(N, Result)与统一者N = 5,这一条款的身体与此结合执行
    • 目标5 > 0成功
    • 调用factorial(5 - 1, Interim)已执行:
      • 目标factorial(5 - 1, Interim)与不统一factorial(0, 1),将跳过此子句
      • 目标factorial(5 - 1, Interim)相结合与factorial(N, Result)用的统一者N = 5 - 1Interim = Result,这一条款的身体与此结合执行
        • 目标5 - 1 > 0成功
        • 调用factorial((5 - 1) - 1, Interim)已执行:
          • ...

这最终调用factorial具有越来越大的方面55 - 1(5 - 1) - 1((5 - 1) - 1) - 1,等。由于这些术语都不曾与统一0,因此计算将永远不会成功。由于这些术语中的每一个都与的新副本统一在一起N,因此第二个子句始终匹配,但最终您会遇到一个包含足够- 1步骤的术语,以致目标N > 0将失败,并且查询factorial(5, Result)将失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用python制作阶乘代码有什么问题,?

用列表编写阶乘函数

用Clojure编写的阶乘函数的性能低下

用while循环python编写阶乘

我编写了这段代码,以用javascript在Esri的Arcgis地图上显示标记,但这不起作用,请在我的代码中描述问题?

我编写的这段代码有什么问题?

我被困在为以下问题编写python代码

如何理解我为某个问题编写的 Python 代码

用C编写队列,我的代码哪里出错了

这是顺序乘法器的代码。代码的问题是未注册输出。我如何注册输出

阶乘问题

我在用python编写的阶乘程序中出错

这是我的导师的接口问题?

为什么我不能在我的 TextBox 中编写和显示文本,这是用 Style 和 ControlTemplate 制作的?

从概念上讲,这是使用goroutines的正确方法(我的代码有什么问题)

这是别人的代码。我试图让它工作,但不知道出了什么问题。

用于查找阶乘的Python代码出现问题

Prolog阶乘谓词

Pangram代码-无法理解我编写的代码中的问题-始终返回false

我用/ usr / bin / curl编写的代码有效,但是我用php curl编写的代码不起作用。我在哪里弄错了?

我已经用C语言编写了代码,但是没有用?

编写For循环以评估阶乘

用Smarty编写PHP代码

用Python编写源代码

用Python编写CSV的问题

我对 JavaScript 阶乘的尝试有什么问题?

我的阶乘函数逻辑有什么问题?

用c ++编写的此文件处理代码有什么问题?

XSB Prolog:编写我自己的setof函数