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
相关产品推荐
相关产品推荐

