Стандартные предикаты управления логическим выводом
Стандартные предикаты fail и cut(!) предназначены для управления процессом логического вывода. Встроенный предикат fail является тождественно ложным предикатом, который включает механизм автоматического возврата. Присутствие этого предиката в правиле вызывает возврат на согласование первой цели в резольвенте.
Предикат fail используется для программирования повторяющихся действий (циклических программ). В общем случае итерационное правило имеет следующий вид:
<заголовок итерационного правила>:¾<предикаты>,fail.
Рассмотрим пример программы, использующей предикат fail. Пусть программа включает утверждения о столицах различных стран:
city(‘Дели’, ’Индия’, ‘Азия’).
city(‘Прага’, ’Чехия’, ‘Европа’ ).
city(‘Лондон’, ’Англия’, ‘Европа’ ).
city(‘Рим’, ’Италия’, ‘Европа’ ).
city(‘Мехико’, ’Мексика’, ‘Америка’ ).
city(‘Пекин’, ’Китай’, ‘Азия’ ).
city(‘Токио’, ’Япония’, ‘Азия’ ).
show_cities:¾city(X,_, ‘Европа’),write(X),nl,fail.
display_cities:¾write(‘Столицы стран Европы’),nl, show_cities.
На запрос “display_cities.” Пролог¾система выдаст следующий ответ:
?¾ display_cities.
Столицы стран Европы
Прага
Лондон
Рим
no
Предикат отсечения (!) предназначен для запрещения поиска с возвратом. Если существуют два или более взаимоисключающих правила для одного и того же отношения, т. е. при любом запросе успех возможен только в одном из правил, то при успешном согласовании некоторого из правил нет необходимости проверять остальные правила, согласование которых будет заведомо неуспешно.
|
|
Допустим, надо написать программу, определяющую значение функции Y по формуле:
В алгоритмических языках в этом случае используется оператор if¾then¾else, блок¾схема которого показана на рис. 6.2
На языке Пролог в этом случае будет процедура из двух правил:
ps(X,Y):¾p(X),Y is f1(X).
ps(X,Y):¾ not(p(X)),Y is f2(X).
Поскольку выше указанные правила взаимно исключают друг друга, используя предикат отсечения процедуру можно представить в следующем виде:
ps(X,Y):¾p(X),!,Y is f1(X).
ps(X,Y):¾ Y is f2(X).
Таким образом, во втором правиле проверка условия “not(p(X))” не нужна.
Рассмотрим другой пример. Пусть требуется вычислить значение функции Y в зависимости от условия:
В этом случае программа будет содержать три правила:
ps(X,Y):¾X=<0,!,Y is 2*X+1.
ps(X,Y):¾X=<2,!,Y is X^2.
ps(X,Y): ¾ Y is 0.
Использование предиката отсечения «!» сокращает запись правил в Прологе и ограничивает перебор вариантов, в этом случае процедура вычисления запроса выполняется эффективнее.
Кроме предикатов управления логическим выводом fail и cut, в системе Arity Prolog существуют стандартные предикаты true, repeat и not, not(p) ¾ отрицание предиката p. Если p ¾ истина, то not(p) ¾ ложь, и наоборот. Предикат repeat истинен всегда. При бэктрекинге этот предикат вызывает повторное выполнение всех следующих за ним целей. Предикат true ¾ тождественно истинный предикат.
|
|
Дата добавления: 2018-04-04; просмотров: 543; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!