Prolog编程中的实用计算、数据结构与递归
1. Prolog中的实用计算
在Prolog中使用表达式时,实际上是在混合不同的知识编码风格。从逻辑角度看,“sum”和“product”是数字之间的关系,就像“father”和“mother”是人与人之间的关系。早期的Prolog会将计算写成逻辑关系的形式,例如:
?- product(3, 4, P), sum(2, P, S), sum(S, 5, What).
但这种方式存在两个问题:一是使用起来不方便,二是会让人误以为Prolog有针对数字的搜索策略,而实际上并没有。因此,现在更多地使用表达式。
如果要实现数值算法,通常需要定义Prolog谓词,因为一般无法在表达式中定义额外的函数。下面来看几个具体的例子。
1.1 定义 close_enough
谓词
定义一个谓词 close_enough/2
,当两个数字的差值在0.0001以内时,该谓词成功。这样可以在比较浮点数计算结果时避免舍入误差的影响。代码如下:
close_enough(X, X) :-!.
close_enough(X, Y) :- X < Y, Y - X < 0.0001.
close_enough(X, Y) :- X > Y, close_enough(Y, X).
- 第一个子句处理两个参数相等的情况,