Пусть заданы факты о книгах, их авторах и количестве страниц. Необходимо составить правило о том, какой роман можно считать большим, и реализовать это на Турбо-Прологе. Ниже приводится один из вариантов решения поставленной задачи.
Пример 1. Работа с фактами, правилами и переменными
domains
% Описание доменов пользователя
заглавие, автор = symbol
страниц = integer
predicates
% Описание предикатов пользователя
книга(заглавие, страниц)
написал(автор, заглавие)
большой_роман(заглавие)
clauses
% Факты
написал(горький, "МАТЬ").
написал(шолохов, "ТИХИЙ ДОН").
книга("ТИХИЙ ДОН",1250).
книга("МАТЬ", 310).
/* Правило, определяющее,
какая книга считается большим романом */
большой_роман(Заглавие) :-
написал(_, Заглавие), %Автор в этом случае безразличен
книга(Заглавие, Страниц),
Страниц > 300.
Эта реализация не содержит внутренних целей, так как предполагается, что пользователь работает в среде ТП и может задавать различные вопросы в режиме диалога. Например,
Goal:написал(Кто,Что)
При ответе на этот вопрос ТП производит УНИФИКАЦИЮ значений переменных Кто с обьектами "автор" и Что с обьектами "заглавие". B результате выдается ответ:
Кто=горький Что="МАТЬ"
Кто=шолохов Что="ТИХИЙ ДОН"
2 Solutions
Или такой запрос:
Goal:большой_роман(Заглавие)
В нашей базе данных хранятся два романа, которые можно считать большими, поскольку их объем превышает 300 страниц.
Поэтому ТП выдаст следующее решение:
Заглавие="МАТЬ"
Заглавие="ТИХИЙ ДОН"
2 Solutions
В приведенном выше примере ТП выдает все альтернативные решения. Это не всегда нужно и в ТП предусмотрен специальный механизм - отсечение ненужных решений с помощью встроенного
предиката "!", а в качестве решения принимается ПЕРВЫЙ до от-
сечения истинный результат.
Пусть задана информация об автомобилях, их цене, модели и цвете. Необходимо купить яркий автомобиль по цене не выше 25000. Ниже приводится вариант решения этой задачи.
Пример 2 Покупка яркого автомобиля по цене < 25000
predicates
покупка_автомобиля(symbol, symbol)
автомобиль(symbol, symbol, integer)
цвета(symbol, symbol)
clauses
покупка_автомобиля(Model, Color) :-
автомобиль(Model, Color, Price),
цвета(Color, яркий),!,
% рассматриваются только яркие автомобили
Price < 25000.
автомобиль(москвич, зеленый, 25000).
автомобиль(запорожец, красный, 24000).
автомобиль(corvette, черный, 26000).
автомобиль(porsche, красный, 54000).
цвета(красный, яркий).
цвета(черный, неяркий).
цвета(зеленый, умеренный).
В данной реализации приоритет имеют только яркие автомобили. Знак ! –отсечение, действует на предикаты
автомобиль(Model, Color, Price), цвета(Color, яркий)
Поэтому в ответ на внешний запрос
Goal:покупка_автомобиля(Модель,Цвет)
ТП выдаст решение:
Модель=запорожец Цвет=красный
1 Solutions
Но если факты по объектам "запорожец" и "porsche" поменять местами, то ответ ТП будет отрицательный, так как все остальные яркие автомобили НЕ РАССМАТРИВАЮТСЯ, а цена "porsche" более 25000. В этом и заключается суть отсечения и программист должен сам следить за корректностью описываемой на ТП задачи.