我创建了一个简单的 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 正常工作?
你的第一个问题是你的第二个定义失败了。这是您的程序的“概括”,但仍然失败。剩下的部分肯定有错误。 :- op(950,fy,*)。 *_。 阶乘(1,_
/*1*/)。 阶乘(数字,_/*阶乘*/):- 数量>1, 阶乘(Number-1, _/*阶乘1*/), *阶乘是阶乘1*数字。 ?-阶乘(2,N)。 错误的。