![]() Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Стандартные предикаты управления логическим выводом.
Стандартные предикаты fail и cut(!) предназначены для управления процессом логического вывода. Встроенный предикат fail является тождественно ложным предикатом, который включает механизм автоматического возврата. Присутствие этого предиката в правиле вызывает возврат на согласование первой цели в резольвенте. Предикат fail используется для программирования повторяющихся действий (циклических программ). В общем случае итерационное правило имеет следующий вид: <заголовок итерационного правила>:¾<предикаты>,fail.
Рассмотрим пример программы, использующей предикат fail. Пусть программа включает утверждения о столицах различных стран: city(‘Прага’, ’Чехия’, ‘Европа’ ). city(‘Лондон’, ’Англия’, ‘Европа’ ). city(‘Рим’, ’Италия’, ‘Европа’ ). city(‘Мехико’, ’Мексика’, ‘Америка’ ). city(‘Пекин’, ’Китай’, ‘Азия’ ). city(‘Токио’, ’Япония’, ‘Азия’ ). display_cities:¾write(‘Столицы стран Европы’),nl, show_cities. На запрос “display_cities.” Пролог¾система выдаст следующий ответ:
Предикат отсечения (!) предназначен для запрещения поиска с возвратом. Если существуют два или более взаимоисключающих правила для одного и того же отношения, т. е. при любом запросе успех возможен только в одном из правил, то при успешном согласовании некоторого из правил нет необходимости проверять остальные правила, согласование которых будет заведомо неуспешно. Допустим, надо написать программу, определяющую значение функции Y по формуле:
В алгоритмических языках в этом случае используется оператор if¾then¾else, блок¾схема которого показана на рис. 6.2
На языке Пролог в этом случае будет процедура из двух правил: Поскольку выше указанные правила взаимно исключают друг друга, используя предикат отсечения процедуру можно представить в следующем виде: ps(X,Y):¾p(X),!,Y is f1(X). Таким образом, во втором правиле проверка условия “not(p(X))” не нужна. Рассмотрим другой пример. Пусть требуется вычислить значение функции Y в зависимости от условия:
В этом случае программа будет содержать три правила: Использование предиката отсечения «!» сокращает запись правил в Прологе и ограничивает перебор вариантов, в этом случае процедура вычисления запроса выполняется эффективнее. Кроме предикатов управления логическим выводом fail и cut, в системе Arity Prolog существуют стандартные предикаты true, repeat и not, not(p) ¾ отрицание предиката p. Если p ¾ истина, то not(p) ¾ ложь, и наоборот. Предикат repeat истинен всегда. При бэктрекинге этот предикат вызывает повторное выполнение всех следующих за ним целей. Предикат true ¾ тождественно истинный предикат.
|
|||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 533. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |