Стандартные предикаты управления логическим выводом



 

Стандартные предикаты 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; просмотров: 196;