Будем говорить, что состояние S
1
переводится программой P в состояние S
k
(обо-
значение S
1
→* S
k
), если существует такая последовательность состояний S
2
, ..., S
k
−
1
, что
S
i
→ S
i
+1
для любого i≤k. Последовательность S
1
, ..., S
k
называется SLD-выводом из P и S
1
.
Подстановка θ называется ответом на запрос G к программе P, если
<G, ε> →* <, θ>.
Ответ θ содержит требуемые значения целевых переменных из запроса G.
Таким образом, SLD-резолюция позволяет выводить из одних состояний другие.
Мы начинаем с исходного состояния <G, ε> и пытаемся, исходя из программы P, свести
запрос G к более простым запросам путем построения SLD-вывода. Наша цель − прийти в
такое состояние, когда все вопросы решены, и извлечь требуемый ответ.
Система SLD-резолюции является корректной, т. е. если θ - ответ на запрос G вида
?- A
1
, ..., A
n
к программе P, то формула
(A
1
&...&A
n
) θ
является логическим следствием P. Более того, SLD-резолюция полна в том смысле, что
если G(X
1
, ..., X
k
) − запрос к программе P, содержащий переменные X
1
, ..., X
k
, и если
G(t
1
, ..., t
k
) − логическое следствие P, то
<G, ε> →* <, θ>,
причем G(t
1
, ..., t
k
) − частный случай Gθ, то есть G(t
1
, ..., t
k
) = Gθθ
1
для некоторой подста-
новки
θ
1
.
7.2 Хорновская логическая программа
Определение. Хорновским дизъюнктом называется дизъюнкт, содержащий не бо-
лее одного позитивного литерала. Дизъюнкт, состоящий только из одного позитивного
литерала, называется фактом. Дизъюнкт, имеющий позитивный и негативные литералы
называется правилом.
Логическая или, точнее, хорновская логическая программа состоит из набора хор-
новских дизъюнктов. Структура этих дизъюнктов такова, что, с одной стороны, с их по-
мощью довольно естественно описываются многие задачи, а с другой стороны, они до-
пускают простую процедурную интерпретацию.
Факты в программе описываются в привычном виде, например,
P(t1, t2, t3).
Наличие в программе факта P(t
1
, ..., t
n
), содержащего (в своих аргументах) переменные X
1
,
..., X
m
, означает, что для любых объектов X
1
, ..., X
m
имеет место P(t
1
, ..., t
n
).
Правило A
1
&...&A
n
⊃A
0
, где A
i
- атомарные формулы, в обозначениях Пролога при-
нято записывать по-иному:
A0 :- A1, ..., An.
Если в таком правиле встречаются переменные X1, ..., Xm, то читается оно следующим об-
разом: для всех объектов X1, ..., Xm из A1, ..., An следует A0 (или, что эквивалентно, для
всех X1, ..., Xm, если верны утверждения A1, ..., An, то верно также A0).
Запросом к логической программы называется формула вида A
1
&...&A
n
, где все A
i
–
атомарные формулы. Следуя синтаксису Пролога, вместо этой формулы мы написали бы
?- A1, ..., An.
Запрос, не содержащий переменных, читается так: верно ли, что A1, ... и An? Если же в
атомарных формулах содержатся переменные X1, ..., Xm, то его следует читать иначе: для
каких объектов X1, ..., Xm верно A1, ... и An? При этом, разумеется, считается, что машине
«известна» только та информация, которая представлена в программе (и, быть может,
свойства некоторых встроенных предикатов и функций, таких, как < или +), и ответ на
запрос должен логически вытекать из этой информации.
Таким образом, логические программы имеют простую и естественную семантику:
запрос
?- A1, ..., An.
43