基本用法

让我们考虑谓词 sumDif/2,验证列表的结构是否与几个约束相匹配。第一个术语表示要分析的列表,第二个术语表示另一个列表,其中包含第一个列表中我们的约束未知的部分。

为了演示,sumDif/2 识别一个算术表达式来求和 n 个整数。

sumDif([X, +|OpenList], Hole) :-
    integer(X),
    sumDif(OpenList, Hole).

我们知道要验证的列表的第一个元素是整数,这里用 X 表示,后面跟着加法符号(+)。稍后仍需要处理的列表的剩余部分(OpenList)在该级别保持未经验证。Hole 代表我们不需要验证的列表部分。

让我们给出谓词 sumDif/2 的另一个定义来完成算术表达式的验证:

sumDif([X|Hole], Hole) :-
    integer(X).

我们期望在开始列表的开头直接使用一个名为 X 的整数。有趣的是,列表 Hole 的剩余部分未知,这就是差异列表的全部目的:列表的结构在某一点上是已知的。

最后,在评估列表时会出现缺失的部分:

?- sumDif([1,+,2,+,3], []).
true

这是当使用谓词时提到列表的末尾,这里 [] 表示列表不包含其他元素。