Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
31
Добавлен:
13.11.2019
Размер:
1.36 Mб
Скачать

6.5.2. Ввод/вывод символов.

Для ввода символов (литер), набираемых на клавиатуре, могут использоваться предикаты get(<литера>) и get0(<литера>). Предикат get(X) вводит любую литеру, для которой существует код ASCII, и присваивает ее переменной X. Предикат get0(X) вводит только печатаемые символы, а управляющие символы пропускает X.

Для вывода символов (литер) на экран видеомонитора используется предикат put(<код литеры>). Например, в ответ на запрос

?  put(104), put(101), put(108), put(108), put(111).

система выдаст слово hello.

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

Стандартные предикаты 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  тождественно истинный предикат.