如何在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
相关产品推荐
相关产品推荐

