Программа 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.
В Прологе есть некоторые особые правила, касающиеся порядка оценки (слева направо) и «срезов» (которые сокращают дерево поиска), но это тонкая деталь, котораявыходит за рамки этого краткого руководства.
Теперь, чтобы решить, является ли 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.
Термин - это, по сути, любой фрагмент синтаксиса.
Ключевым моментом здесь является то, что ПрологНет функций!Где на функциональном языке вы можете определить функцию add(X, Y)
, которая оценивается как сумма X
и Y
, в Прологе вы определяете предикат с головой add(X, Y, Z)
, который, в случае успеха, объединяет Z
стермин, обозначающий сумму X
и Y
.
Учитывая все это, мы можем определить ваши правила в Прологе следующим образом:
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)))
.
Теперь вы можете спросить «что произойдет, если в предложении будет найдено более одной головы» или «что произойдет, если путь оценки потерпит неудачу?», на что даны ответы «недетерминизм»"," backtracking "и, вообще, прочитайте учебник Пролога!
Надеюсь, это поможет.