Prolog 程序是谓词的集合。
谓词是子句的集合。
子句具有以下形式
Head :- Body.
意思是“Head
如果为真,Body
则为真”。
有一个速记子句形式
Head.
这意味着相同
Head :- true.
true
始终为真的内置函数在哪里。
回到Body
子句的部分,Body
是一个可以采用以下形式之一的目标(A
, B
, 并C
表示任意目标):
Atom % This is true if Atom is true (see below).
A, B % This is true if A is true and B is true.
(A ; B) % This is true if A is true or B is true.
\+ A % This is true if A is not true.
(A -> B ; C) % If A is true then B must be true, else C must be true.
Prolog 中有一些关于评估顺序(从左到右)和“切割”(修剪搜索树)的特殊规则,但这些细节超出了本简短教程的范围。
现在,要确定 an 是否Atom
为真,Atom
可以是以下形式之一(X
并Y
表示任意项):
true % or some other builtin with given truth rules.
X = Y % True if X and Y are successfully unified.
p(X, Y, ...) % True if p(X, Y, ...) matches the head of some clause
% and the Body is true.
术语本质上是任何句法。
这里要发现的关键是 Prolog 没有任何功能!在函数式语言中,您可以定义一个add(X, Y)
计算结果为和的X
函数的函数Y
,在 Prolog 中,您定义一个谓词,其头部是add(X, Y, Z)
,如果它成功,则与表示和Z
的总和的术语统一。X
Y
鉴于这一切,我们可以在 Prolog 中定义您的规则如下:
add(0, Y, Y). % 0 + Y = Y.
add(Y, 0, Y). % Y + 0 = Y.
add(s(X), Y, s(Z)) :- add(X, Y, Z). % s(X) + Y = s(X + Y).
我0
用来表示零(!)并s(X)
表示X
.
考虑评估add(s(s(0)), s(0), Z)
:
add(s(s(0)), s(0), Z) % Only the third head for add matches, so...
---> Z = s(Z0), add(s(0), s(0), Z0).
add(s(0), s(0), Z0) % Only the third head for add matches, so...
---> Z0 = s(Z1), add(0, s(0), Z1).
add(0, s(0), Z1) % Only the first head for add matches, so...
---> Z1 = s(0).
将所有这些统一Z
放在一起,我们有Z = s(s(s(0)))
.
现在,您可能会问“如果一个子句中有多个头部匹配会发生什么”或“如果评估路径失败会发生什么?”,答案是“不确定性”、“回溯”,一般来说,阅读一个序言教科书!
希望这可以帮助。