проверить( Условие), % Условие выполнено?
выполнить( Действие).
проверить( []). % Пустое условие
проверить( [Усл | Остальные]) :- % проверить конъюнкцию
call( Усл), % условий
проверить( Остальные).
выполнить( [ стоп] ) :- !. % Прекратить выполнение
выполнить( []) :- % Пустое действие (цикл завершен)
пуск. % Перейти к следующему циклу
выполнить [Д | Остальные] ) :-
саll( Д),
выполнить( Остальные).
заменить( А, В) :- % Заменить в базе данных А на В
retract( A), !,
assert( В).
Рис. 16.5. Простой интерпретатор для программ, управляемых образцами.
Простой интерпретатор для программ, управляемых образцами, показан на рис. 16.5. Следует признать, что в интерпретаторе допущены значительные упрощения. Так, например, в него заложено чрезвычайно простое и жесткое правило разрешения конфликтов: всегда запускать
?- пуск.
16.3. Простая программа для автоматического доказательства теорем
В настоящем разделе мы реализуем простую программу для автоматического доказательства теорем в виде системы, управляемой образцами. Эта программа будет основана на
Задачу доказательства теорем можно сформулировать так: дана формула, необходимо показать, что эта формула является теоремой, т.е. она верна всегда, независимо от интерпретации встречающихся в ней символов. Например, утверждение, записанное в виде формулы
и означающее "
Мы будем использовать в качестве операторов следующие символы:
~ отрицание, читается как "не"
& конъюнкцию, читается как "и"
v дизъюнкцию, читается как "или"
=> импликацию, читается как "следует"
Согласно правилам предпочтения операторов, оператор "не" связывает утверждения сильнее, чем "и", "или" и "следует".
Метод резолюции предполагает, что мы рассматриваем отрицание исходной формулы и пытаемся показать, что полученная формула противоречива. Если это действительно так, то исходная формула представляет собой тавтологию. Таким образом, основную идею можно сформулировать так: доказательство противоречивости формулы с отрицанием эквивалентно доказательству того, что исходная формула (без отрицания) есть теорема (т.е. верна всегда). Процесс, приводящий к искомому противоречию, состоит из отдельных шагов, на каждом из которых применяется резолюция.
Давайте проиллюстрируем этот принцип на примере. Предположим, что мы хотим доказать, что теоремой является следующая пропозициональная формула:
(
Смысл этой формулы таков: если из
Прежде чем начать применять процесс резолюции ("резолюционный процесс"), необходимо представить отрицание нашей формулы в наиболее приспособленной для этого форме. Такой формой является
(
& (
Здесь
Любую пропозициональную формулу нетрудно преобразовать в такую форму. В нашем случае это делается следующим образом. У нас есть исходная формула
(
Ее отрицание имеет вид