Prolog拆分列表为正负两个独立列表时代码运行报错问题
问题根源
- 参数模式错误:你在
divide的递归规则和终止规则里,把输出参数强制写为[Y]、[Z]单元素列表结构,限定了正负列表只能有1个元素,当要存入第2个元素时,Prolog无法将多元素列表和单元素结构统一,直接触发匹配失败。 - 拼接逻辑错误:
split谓词里每次都直接把单个元素赋值给Y/Z,没有累加之前已经存入的元素,即使参数改对也无法得到完整的正负列表。 - 递归传参逻辑错误:递归调用
divide(T,Y,Z)时,直接把当前的Y/Z传下去,相当于要求子递归的输出和当前层的Y/Z完全一致,不可能实现元素累加。
修复后代码
% 终止条件:空输入对应空的正负列表 divide([], [], []). % 递归分支1:头元素是正数,拼接到正列表头部 divide([H|T], [H|RestY], Z) :- H > 0, divide(T, RestY, Z). % 递归分支2:头元素是非正数(负数/0),拼接到负列表头部 divide([H|T], Y, [H|RestZ]) :- H =< 0, divide(T, Y, RestZ).
测试效果
执行查询divide([1,-2,3], Y, Z),会直接返回结果:Y = [1, 3], Z = [-2]
如果需要在终止时打印结果,可以修改终止规则:
divide([], Y, Z) :- write('正数列表:'), write(Y), nl, write('负数列表:'), write(Z), nl.
注:如果需要单独过滤0,可以新增分支调整逻辑,比如将0丢弃、或者单独存入第三个列表都可以。
内容的提问来源于stack exchange,提问作者Spicy_Cacti
相关产品推荐
相关产品推荐

