0

我正在尝试创建一个 Prolog 程序 divisor_sum 来总结数字 X(不包括 X)的所有除数。

acc_divisor_sum(X,_,X).
acc_divisor_sum(X,Y,C):- A=:=0, A is X mod N, C is N+1, Y is Y+C, acc_divisor_sum(X,Y,C).
acc_divisor_sum(X,Y,C):- A=\=0, A is X mod N, C is N+1, acc_divisor_sum(X,Y,C).
divisor_sum(X,Y):- acc_divisor_sum(X,Y,1).

我得到的错误。

   ?- divisor_sum(12,Y).
ERROR: =:=/2: Arguments are not sufficiently instantiated
^  Exception: (9) _L144=:=0 ? creep
   Exception: (8) acc_divisor_sum(12, _G204, 1) ? creep

我的代码有什么问题?谢谢你的帮助。

4

2 回答 2

2

There is no bound A yet. You need to move the =:=-test after the A is ....

于 2012-12-04T12:07:55.347 回答
0

我认为您应该使用带有 4 个 args 的谓词:

% @arg1 : Number to study
% @arg2 : current divisor
% @arg3 : current sum of divisors
% @arg4 : final sum of divisors
acc_divisor_sum(X, Div, S, TT)

现在,当0 是 X mod N成功时,你知道另一个除数,你可以在搜索中获得时间。

于 2012-12-04T14:21:42.650 回答