0

按照四步抽象设计过程定义递归规则来计算数学函数。您必须指明(使用代码注释)使用哪个步骤。注意,Prolog 规则不返回值。您需要使用参数来保存返回值。您不能使用指数运算符**来计算表达式。

编写一个递归规则factbar(F, X, Y, N)来计算F = ((2*X + Y)^N)!(expbar 的阶乘)。该规则必须调用(使用)您设计的规则 expbar..

现在为了执行此操作F = ((2*X + Y)^N),我已经编写了代码,但我不知道如何在 Prolog 中编写阶乘:

expbar(R, X, Y, N) :-
   X > 0, Y > 0, N > 0,
   R is (2 * X + Y) ** N.

虽然我在我的程序中使用 ** 作为指数,但我不知道如何使用其他方式。

4

1 回答 1

1

我不知道“四步抽象设计过程”是什么,你也没有包括那个细节。因此,您将获得我的两步递归函数设计过程。你的谓词是对的,只是你没有定义pow/3一个计算幂的函数。这显然是你任务的关键。我们开始做吧。

第一步:确定你的基本情况。对于算术函数,基本情况涉及算术恒等式。对于求幂,恒等式是 1。换句话说,X**1 = X。写下来:

pow(X,1,X).

因为这是一个有两个输入和一个结果的函数,所以我们将它编码为一个 arity-3 谓词。这个事实简单地说 X 的 1 次方是 X。

第二步。现在考虑归纳的情况。如果我有 X**N,我可以将其扩展为 X * (X**(N-1))。通过求幂的定义和归纳规则,这样就完成了谓词的定义。用 Prolog 语法对其进行编码:

pow(X,N,Y) :-
  N > 1,
  succ(N0, N),
  pow(X, N0, Y0),
  Y is X * Y0, !.

这为您提供了计算指数的谓词。如果您在谓词中替换了您的使用**/2expbar/4则您满足了分配的要求。

于 2013-07-09T05:01:03.053 回答