Prolog 99问题:列表游程编码程序执行过程问询
拆解Prolog中transform/2的完整执行流程
咱们一步步来梳理transform([[a,a],[b,b,b],[c,c]], L2)的执行过程,帮你把每一步的匹配和递归逻辑搞明白:
初始调用
首先调用transform([[a,a],[b,b,b],[c,c]], L2),第一条规则transform([],[])显然不匹配(因为第一个参数不是空列表),所以触发第二条规则:
transform([[X|Xs]|Ys],[[N,X]|Zs]) :- length([X|Xs],N), transform(Ys,Zs).
第一步:处理第一个分组[a,a]
- 变量绑定:
[X|Xs] = [a,a]→X = a,Xs = [a];Ys = [[b,b,b],[c,c]] - 执行
length([a,a], N)→ 计算得到N = 2 - 现在需要递归求解
transform([[b,b,b],[c,c]], Zs),此时L2暂时绑定为[[2,a]|Zs]
第二步:处理第二个分组[b,b,b]
递归调用transform([[b,b,b],[c,c]], Zs),同样匹配第二条规则:
- 变量绑定:
[X|Xs] = [b,b,b]→X = b,Xs = [b,b];Ys = [[c,c]] - 执行
length([b,b,b], N)→ 计算得到N = 3 - 递归求解
transform([[c,c]], Zs1),此时Zs绑定为[[3,b]|Zs1],所以L2现在是[[2,a], [3,b]|Zs1]
第三步:处理第三个分组[c,c]
递归调用transform([[c,c]], Zs1),匹配第二条规则:
- 变量绑定:
[X|Xs] = [c,c]→X = c,Xs = [c];Ys = [] - 执行
length([c,c], N)→ 计算得到N = 2 - 递归求解
transform([], Zs2),此时Zs1绑定为[[2,c]|Zs2],L2更新为[[2,a], [3,b], [2,c]|Zs2]
第四步:递归终止
调用transform([], Zs2),此时完全匹配第一条规则transform([],[]),所以Zs2 = []
最终结果拼接
把所有递归的结果回溯拼接起来:
Zs1 = [[2,c]|[]] = [[2,c]]Zs = [[3,b]|[[2,c]]] = [[3,b],[2,c]]L2 = [[2,a]|[[3,b],[2,c]]] = [[2,a], [3,b], [2,c]]
这样就得到了你看到的最终输出啦~
内容的提问来源于stack exchange,提问作者xava
相关产品推荐
相关产品推荐

