prolog - 所有正因数的总和

标签 prolog

查询 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 = 12F = 1Y 未绑定(bind)。所以它尝试这样做:

:- X>Y

这是

12 > _G350

其中_G350Y,一个未实例化的变量。

问题在于算术谓词如 (>)/2 (以及 (+)/2(*)/2等..)要求要比较的两个变量都已实例化。您不能这样查询:

?- 12 > X

并期望 Prolog 引擎找到与 X 的所有绑定(bind),使得 X 小于 12。因此您需要重新考虑解决问题的方法,请记住,您只能使用数字进行算术运算,而不能使用数字和变量进行算术运算。

关于prolog - 所有正因数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689956/

相关文章:

prolog - 使用 prolog 将结果打印在 txt 文件中

prolog - Prolog assert/1 对传递的术语做了什么?

list - 反向/回文的递归Prolog谓词

list - 如何获取列表方案和序言的第一个、中间和最后一个元素?

prolog - 最通用的高阶约束,描述相对于关系排序的整数序列

prolog - 如何在 Prolog 中找到集合的基数?

prolog - 如何编写序言数学函数?

module - 在导出谓词的模块中重新定义运算符优先级

prolog - 关于解决CLP中整数约束的问题

algorithm - Prolog排列