【问题标题】:Logic behind MY factorial function in prologprolog中MY阶乘函数背后的逻辑
【发布时间】:2023-03-12 17:00:01
【问题描述】:

我知道在 Prolog 中提出了关于阶乘函数的问题。我在人们提供的答案中发现了很多代码。但我的问题是,我为事实编写了两个代码。第一个函数仅适用于fact(1,X),fact(2,X),fact(3,X)。从 4 开始,结果为false。我想知道这个函数事实背后的逻辑,以及为什么它无法为大量数字提供结果。

fact(1,1).
fact(N,F):-fact(N1,F1),N is N1+1,F is F1*N,!.

fact1(1,1).
fact1(N,F):-N>1,N1 is N-1,fact1(N1,F1),F is F1*N.

?- fact(2,X).
X = 2.
?- fact(3,X).
X = 6.
?- fact(4,X).
false.
?- fact(5,X).
false.
?- fact(15,X).
false.

fact1 函数给出了完美的答案,

?- fact1(5,X).
X = 120 ;
false.

?- fact1(50,X).
X = 30414093201713378043612608166064768844377641568960512000000000000 ;

我想知道fact() 函数逻辑上有什么问题。您还可以对fact() 进行轻微修改,使其工作。我怀疑这可能是因为剪切(!),他们说这是 Prolog 中的冒险目标。

【问题讨论】:

    标签: prolog logic


    【解决方案1】:

    当我对 Prolog 谓词一无所知时,我总是询问系统:

    有哪些解决方案

    就 Prolog 而言,这意味着我询问最一般的查询,其中每个参数都是一个新变量。

    fact/2为例,我会问:

    ?- 事实(N, F)。

    在这个例子中,我得到了准确的 2 个解决方案

    N = F,F = 1; N = F,F = 2。

    所以,系统告诉我:这个谓词实际上只有 2 种可能性:一种是 N 是 1,另一种是 N 是 2。

    另一方面,系统还告诉我有N为3的解决方案:

    ?- 事实(3,F)。 F = 6。

    所以,我们可能首先要问:

    它是什么?有两种解决方案还是三种,甚至更多??

    还有:

    我们想要一个产生矛盾答案的谓词吗?

    结果:fact(4, _) 失败

    考虑以下一般谓词骨架:

    事实(N,F):- some_predicate(N1, F1), N #= N1+1, F #= F1*N, ...

    在您的特定情况下,some_predicate/2fact/2。我已概括您的具体 sn-p 以获得更一般的解释并避免可能出现的任何混淆仅因为您的具体案例巧合地涉及 递归 em>谓词。无论谓词是否递归,以下内容都成立:

    如果您知道(就像我们现在所做的那样)some_predicate/2只有有解决方案,其中N1 是 1 或 2,那么 N不能是 4

    从逻辑上解释了,使用fact/2纯代数属性,为什么fact(4, _)会失败

    特别注意不需要跟踪执行。仅通过逻辑推理,我们就找到了您的查询不能成立的原因。

    回家!/0,你喝醉了!

    让我们首先从您的版本中删除!/0

    事实(1, 1)。 事实(N,F):- 事实(N1,F1), N #= N1+1, F#= F1*N。

    我们观察到这解决了问题:

    ?- 事实(N, F)。 N = F,F = 1; N = F,F = 2; N = 3, F = 6 ; N = 4, F = 24 ; 等等

    根据这些答案,我们还得到:

    ?- 事实(3,F)。 F = 6。

    作为回报,我们现在得到其他个问题,但至少我们避免了答案中的具体矛盾

    我建议您坚持使用 Prolog 的纯单调核心,以便从该语言中获益最多。一旦你离开这个子集,你的程序的推理将变得非常困难,你将失去你几乎自动获得的最有价值的属性。见

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      相关资源
      最近更新 更多