- •Глава 3 управление ходом выполнения программы
- •3. 1. Как выполняется запрос в прологе
- •Три семантические модели
- •Выполнение запроса
- •Правила, описывающие унификацию термов
- •Пример с программой "дядя"
- •Активация запроса
- •Унификация запроса
- •Обработка тела фразы
- •Обработка подцели "брат"
- •Обработка подцели "отец"
- •Неудача запроса и возврат назад
- •Поиск третьего ответа
- •Поиск несуществующих ответов
- •Выполнение запроса к правилу "регистрация"
- •Автоматический просмотр выполнения программы
- •3.2. Предикат "сократить" Пространство поиска запроса
- •Предикат "сократить" останавливает возврат назад
- •Влияние предиката "сократить" на составной запрос
- •Влияние предиката "сократить" на процедуру
- •Предикат "сократить" как подцель в составном запросе
- •Использование предиката "сократить" для того, чтобы сделать процедуру детерминированной
- •Применение предиката "сократить" для отбрасывания части пространства поиска
- •Ограничение сферы действия предиката "сократить"
- •Общее правило ограничения сферы действия предиката "сократить"
- •3. 3. Отрицание как неудача запроса Негативная информация
- •Предположение о замкнутости мира
- •Тогда и только тогда, когда
- •Предположение об открытости мира
- •Отрицание в явной форме
- •Пример процедуры, поведение которой соответствует предположению об открытости мира
- •3. 4. Встроенные предикаты, предназначенные для обеспечения ввода-вывода Побочные эффекты ввода-вывода
- •Пример запроса, в котором используется предикат "read"
- •3. 5. Встроенные предикаты, предназначенные для управления файлами
- •3. 6. Проверка типа терма
- •Использование предикатов "var" и "nonvar"
- •3. 7. Действия с текущей программой
- •Изменение значения факта
- •Алгоритм поиска с возрастом, в котором используется предикат "assert"
- •Процедура, которая учится у пользователя
- •Программа, которая модифицирует сама себя
- •3. 8. Компараторы
- •3. 9. Прочие встроенные предикаты
- •Программа ввода "вводполя"
- •3. 10. Операции Расширяемость синтаксиса языка Пролог
- •Инфиксная операция ",", обладающая правой ассоциативностью
- •Инфиксная операция, не обладающая свойством ассоциативности
- •Объявление операций
- •3. 11. Преобразование процедурного алгоритма в программу на языке пролог Сравнение поиска с возвратом и рекурсии
- •Цикл "пока"
- •Рекурсия
- •Поиск с возвратом
- •Применение предиката "findall"
- •Библиографические заметки
- •Упражнения
3. 5. Встроенные предикаты, предназначенные для управления файлами
В языке Пролог существуют понятия текущего входного потока (из которого предикаты ввода считывают символы) и текущего выходного потока (в который предикаты вывода записывают символы). По умолчанию считается, что оба этих потока связаны с пользовательским терминалом. Приводимые далее предикаты позволяют связывать каждый из этих потоков с файлами.
see (F) Здесь F - имя файла. Если существует файл с таким именем, допускающий чтение, то он открывается и связывается с текущим входным потоком. Любые вызовы предикатов ввода, скажем, предикатов "read", "getO" и т. д., будут приводить к считыванию символов из этого файла.
seeing (F) Этот предикат унифицирует "F" с именем файла, который в настоящее время соответствует текущему входному потоку. Если текущий входной поток ассоциируется с пользовательским терминалом, то F унифицируется с константой « user».
seen Если файл был связан с текущим входным потоком при помощи предиката "see/1", то предикат "seen" закрывает этот файл и опять связывает с текущим входным потоком пользовательский терминал.
Пример:
|? - see (' данные '), % открыть входной
%файл
read (R), % считать терм
write (R), % обработать терм
seen. % закрыть файл
tell (F) Здесь F - имя файла. Этот файл создается или открывается как выходной и связывается с текущим выходным потоком. Любые вызовы предикатов вывода, скажем, "write", "put" и т. д., будут приводить к записи символов в этот файл.
telling (F) Этот предикат конкретизирует F именем файла, который в настоящее время соответствует текущему выходному потоку. Если текущий выходной поток направлен на пользовательский терминал, то F конкретизируется значением «user».
told Если файл был связан с текущим выходным потоком при помощи предиката "tell/1", то предикат "told" закрывает этот файл и опять направляет текущий выходной поток на пользовательский терминал.
3. 6. Проверка типа терма
В языке Пролог имеются встроенные предикаты, предназначенные для проверки типа терма.
var (X) Предикат "var" даст значение истина, если его аргумент будет неконкретизированной переменной.
Пример:
|? -var (X).
да
|? - Х= Лондон, var (X).
нет
В следующем примере "true" — это встроенный предикат, который всегда дает истину. Он часто используется в конструкциях с "или" (символ;).
вывод_по_умолч (X): -
(var (X), Х = 'внимание: переменная'; true),
write (X), n1.
|?—вывод_по_умолч (привет).
привет
да
|? -вывод_по_умолч (Х).
внимание: переменная
да
nonvar (X) Предикат "nonvar" будет истинным, если его аргументом будет терм любого вида, кроме неконкретизированной переменной.
Пример:
|? - Х = [париж, лондон, нью_йорк, токио],
nonvar (X).
Да
integer (X) Предикат "integer" даст значение истина, если его аргументом будет целая константа или переменная, конкретизированная целым числом.
atom (X) Предикат "atom" будет истинным, если его аргументом служит нецелая константа, например:
|? - atom (17).
нет
|? -atom (отец (X)).
нет
|?—аtom (париж).
да