Prolog intgr/1谓词优化:按指定顺序生成正负整数
解决Prolog intgr/1谓词的顺序与重复问题
原代码的问题在于递归逻辑是深度优先的无界搜索,每次递归调用intgr(Y)后同时生成Y+1和Y-1,这会导致回溯时重复生成已出现的数值(比如从1回溯到0后生成-1,再从-1回溯生成0),同时输出顺序会被递归分支打乱。
要实现0;1;-1;2;-2;…的有序输出,需要分层生成整数:先输出0,再依次生成绝对值为1、2、3…的正负整数,每个绝对值只对应一对正负值,避免重复。
修正后的代码
intgr(0). intgr(X) :- intgr_pos_neg(1, X). % 生成当前绝对值的正整数 intgr_pos_neg(N, N). % 生成当前绝对值的负整数 intgr_pos_neg(N, -N). % 递增绝对值,进入下一层 intgr_pos_neg(N, X) :- N1 is N + 1, intgr_pos_neg(N1, X).
代码说明
- 主谓词
intgr/1首先匹配0,满足第一个输出项; - 调用辅助谓词
intgr_pos_neg/2,从绝对值1开始:- 先生成正整数
N,回溯后生成负整数-N; - 再通过递归将
N递增,进入下一层绝对值的生成,以此循环。
- 先生成正整数
这样查询?- intgr(X)时,会严格按照0;1;-1;2;-2;3;-3;…的顺序输出,且不会出现重复值。
内容的提问来源于stack exchange,提问作者vinicio
相关产品推荐
相关产品推荐

