Prolog递归实现两列表元素配对代码返回false,如何排查?
Prolog 双列表两两配对代码bug修复
原代码核心错误
代码返回false主要是3个逻辑错误:
- Prolog的变量是单次绑定的,无法修改,你在
start规则中把同一个Z同时传给makepairs和后续递归的start,要求单元素配对列表等于所有元素的总配对列表,逻辑冲突 makepairs中append([pair(X,H)], [], Z)的写法会直接把Z固定为仅包含当前单个配对的列表,无法拼接后续生成的其他配对- 没有写递归结果的拼接逻辑,每一步生成的配对没有合并到最终输出列表中,递归终止条件也没有正确绑定输出值
修正后可运行代码
start([H|T], Y, FinalZ) :- makepairs(H, Y, CurrentPairs), start(T, Y, RestPairs), append(CurrentPairs, RestPairs, FinalZ). start([], _Y, []). makepairs(X, [H|T], [pair(X,H)|RestPairs]) :- makepairs(X, T, RestPairs). makepairs(_X, [], []).
测试效果
输入查询:?- start([a,b], [c,d], Z).
返回结果符合预期:Z = [pair(a,c), pair(a,d), pair(b,c), pair(b,d)].
内容的提问来源于stack exchange,提问作者Lyricfy Contact
相关产品推荐
相关产品推荐

