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

Prolog开发咨询:如何判断列表数字经四则运算可得到目标数

Prolog 实现数字组合运算匹配目标值

核心思路

通过递归分解数字列表:每次选取两个数字,用四种运算符计算可能结果,将结果与剩余数字组成新列表,继续递归判断是否能得到目标值。当列表仅剩一个元素时,直接匹配目标值。

完整代码

% 基础情况:单元素列表匹配目标
numbers([X], X).

% 递归分解列表,尝试所有数字组合与运算
numbers(List, Target) :-
    select(A, List, Temp),
    select(B, Temp, Rest),
    operation(A, B, Res),
    numbers([Res|Rest], Target).

% 定义四种运算,除法排除除数为0的情况
operation(A, B, A + B).
operation(A, B, A - B).
operation(A, B, A * B).
operation(A, B, A / B) :- B =\= 0.

% 处理浮点数与整数的等价匹配(如4.0与4视为相等)
numbers(List, Target) :-
    numbers(List, Temp),
    Temp =:= Target.

代码说明

  • 基础匹配:直接覆盖你已实现的“目标数在列表中”的场景。
  • 递归分解:利用Prolog内置的select/3谓词拆分列表,无需额外模块。两次select选取两个不同数字,剩余元素组成新列表。
  • 运算规则:枚举加减乘除四种运算,除法额外校验除数不为0,避免运行错误。
  • 数值兼容:最后一个谓词处理浮点数与整数的相等判断,确保类似8/2=4的结果能匹配整数目标4。

测试用例

% 示例1:4+3=7
?- numbers([3,4,1,2],7).
true .

% 示例2:(7-3)*(7-1)=24
?- numbers([1,7,7,3],24).
true .

% 除法案例:8/(2/3)=12
?- numbers([8,3,2],12).
true .

注意点

  • 实现会自动遍历所有可能的数字组合与运算顺序,只要存在有效组合就返回true。
  • 小列表场景下,无需额外优化重复路径;若处理大列表,可添加约束减少冗余计算。
  • 除法产生的浮点数通过=:=/2自动与整数匹配,无需手动类型转换。

内容的提问来源于stack exchange,提问作者Programmer101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:15:35