Prolog实现两数是否为Amicable(亲和数)判断的技术咨询
Prolog亲和数判断程序完整实现
首先修正原有基础代码的语法和逻辑缺陷:
原有代码存在以下问题:
- 变量
N误写为小写n,Prolog中变量首字母必须大写 round(sqrt(N))缺少右闭合括号- 仅返回了小于等于平方根的除数,遗漏了配对的大于平方根的除数
- 谓词名首字母大写不符合Prolog编码规范,会被识别为变量
完整代码实现
% 计算N的所有正除数 divisor(N, D) :- integer(N), N > 0, UpperBound is round(sqrt(N)), between(1, UpperBound, TmpD), 0 is N mod TmpD, (D = TmpD ; (D is N // TmpD, D \= TmpD)). % 计算N的所有真除数(排除N本身) proper_divisor(N, D) :- divisor(N, D), D =\= N. % 计算N的所有真除数的和 sum_proper_divisors(N, Sum) :- findall(D, proper_divisor(N, D), Divisors), sum_list(Divisors, Sum). % 亲和数判断接口:满足X≠Y,且X的真除数和等于Y,Y的真除数和等于X 'Amicable'(X, Y) :- integer(X), X > 0, integer(Y), Y > 0, X =\= Y, sum_proper_divisors(X, SumX), sum_proper_divisors(Y, SumY), SumX =:= Y, SumY =:= X.
使用说明
调用示例:
- 查询
'Amicable'(220, 284).返回true - 查询
'Amicable'(1184, 1210).返回true - 查询
'Amicable'(220, 221).返回false
如果不需要谓词名首字母大写,可将最后一个谓词改名为amicable(X,Y),调用时直接写amicable(220,284)即可。
内容的提问来源于stack exchange,提问作者wazbil123
相关产品推荐
相关产品推荐

