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

如何在Prolog中无cut递归实现指定行的Pascal's triangle查询

你原来的代码中cut的作用是阻止匹配到前两个基础子句后继续回溯到递归子句,只要让三个子句的触发条件完全互斥,就可以彻底去掉所有cut。

核心修改点是给递归子句加上N > 2的数值约束,保证只有行号大于2的时候才会走递归逻辑,和前面N=1、N=2的两个基础子句不会产生匹配冲突。另外你写的sumC谓词的两个子句本身模式互斥(第一个匹配长度为2的列表,第二个匹配长度≥3的列表),本身就不需要额外加cut。

完整无cut实现代码如下:

sumC([X,Y],[Z]) :- Z is X + Y.
sumC([X,Y|L], Z):- 
    H is X + Y,
    sumC([Y|L], L2),
    Z = [H | L2].

ptriangle(1, [1]).
ptriangle(2, [1, 1]).
ptriangle(N, L) :- 
    N > 2,
    Ant is N - 1,
    ptriangle(Ant, L2),
    sumC(L2, R),
    append([1 | R], [1], L).

测试调用完全符合预期:

  • 调用ptriangle(3, X). 会返回 X = [1, 2, 1]
  • 调用ptriangle(4, X). 会返回 X = [1, 3, 3, 1]

如果需要兼容非法输入的处理,可以额外在递归子句前加N为正整数的校验逻辑,不需要修改核心递归结构。

内容的提问来源于stack exchange,提问作者compscigirl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:00