基本用法
让我们考虑谓词 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
这是当使用谓词时提到列表的末尾,这里 []
表示列表不包含其他元素。