You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:27:04