高级编程

一个简单的求和程序

运行结果是

原因是当运行到sum_to(1, R)的时候,尽管sum_to(1, 1)已经提供解,但是sum_to(N, R)的第二个定义还会运行,称为回溯(Backtracking)。

糟糕的是:这个运行是无法终止的。

解决前面的问题可以用剪切(Cut)技术,将程序改为

剪切技术体现在"!"上, 相应的运行结果是:

如果不用剪切技术, 还有另外一种解决方案,就是加入一句"\+(N = 1)":

运行结果是:

一个飞鸟的例子

要纠正这个错误,可以使用cut with failure组合,改为

再运行就对了

考虑以下两种方法实现阶乘:

Prolog系统需要维持一个不断增长的堆栈。

使用加速器(Accumulator),避免维护堆栈。

无加速器版的实现不断调用自己完成计算,而有加速器版的实现使用Acc作为加速变量(中间变量).

计算Fibonacci数列

加速效果在N=38的时候已经很明显,不用加速器运行时间很长,而使用加速器非常快。