我什么时候可以安全地避免在 Prolog 中存储临时计算?

问题描述 投票:0回答:1

我创建了一个简单的 Prolog 程序来计算数字的阶乘:

factorial(1,1).
factorial(Number, Factorial):-
   Number>1,Number1 is Number-1,
   factorial(Number1, Factorial1),
   Factorial is Factorial1*Number.

它工作正常,但正如您所注意到的,在递归调用阶乘谓词之前,我必须将

Number
变量的一个减法存储在一个名为
Number1
的新变量中。问题是,当我尝试调用谓词而不在调用者中创建新变量时,它总是输出 false:

factorial(1,1).
factorial(Number, Factorial):-
   Number>1,
   factorial(Number-1, Factorial1),
   Factorial is Factorial1*Number.

?- factorial(5,N).
false.

但是,考虑到上述函数适用于正确的版本,我制作了另一个函数来计算两个

N
K
值的二项式数,如下所示:

binomial(N,K,R):-factorial(N,FN),factorial(K,FK),factorial(N-K,FNK),R is FN//(FK*FNK).

?- binomial(8,5,N).
N = 56 ;
false.

在这种情况下,

N-K
计算直接插入到阶乘谓词调用中,无需将值存储在变量中,并且可以正常工作。所以我的问题是;如果我需要进行计算作为另一个谓词的输入,我可以在何时何地确保 Prolog 正常工作?

prolog arithmetic-expressions unification
1个回答
0
投票

你的第一个问题是你的第二个定义失败了。这是您的程序的“概括”,但仍然失败。剩下的部分肯定有错误。 :- op(950,fy,*)。 *_。 阶乘(1,_

/*1*/
)。
阶乘(数字,_/*阶乘*/):-
   数量>1,
   阶乘(Number-1, _/*阶乘1*/),
   * 阶乘是阶乘1*数字。

?-阶乘(2,N)。
   错误的。

    
	
© www.soinside.com 2019 - 2024. All rights reserved.