查询 sum(X,Y)
将回答 X 的所有正除数的总和(不包括 X 本身)
比如说,sum(12,Y)
将回答 Y=16
,因为 1,2,3,4,6 是 12 的约数。
我打算实现以下序言程序,但它失败了,说某些变量未实例化。
sum(X,Y) :- f(X,Y,1).
f(X,Y,F) :- X>Y,X>F, 0 is X mod F, F1 is F+1, f(X,Y1,F1), Y is F+Y1.
f(X,Y,F) :- X>Y,X>F, not(0 is X mod F), F1 is F+1, f(X,Y,F1).
上面的程序有什么问题?
感谢您的帮助!
最佳答案
我不会向您展示如何编写 sum_of_divisors 函数,因为它没有太多指导意义。相反,我可以尝试向您展示如何了解 sum(12,Y)
查询出了什么问题。
让我们看看错误:
?- sum(12, Y).
ERROR: >/2: Arguments are not sufficiently instantiated
Exception: (8) f(12, _G215, 1) ? a
% Execution Aborted
查询后
?- sum(12, Y).
Prolog 引擎读取 sum(X,Y) :- f(X,Y,1).
,因此它计算第二个谓词:
f(X,Y,F)
其中,X = 12
、F = 1
和 Y
未绑定(bind)。所以它尝试这样做:
:- X>Y
这是
12 > _G350
其中_G350
是Y
,一个未实例化的变量。
问题在于算术谓词如 (>)/2
(以及 (+)/2
和 (*)/2
等..)要求要比较的两个变量都已实例化。您不能这样查询:
?- 12 > X
并期望 Prolog 引擎找到与 X
的所有绑定(bind),使得 X
小于 12。因此您需要重新考虑解决问题的方法,请记住,您只能使用数字进行算术运算,而不能使用数字和变量进行算术运算。
关于prolog - 所有正因数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689956/