You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:21