- •Глава 8
- •8.1. Системные арифметические предикаты
- •8.3. Замена рекурсии итерацией
- •8.4. Дополнительные сведения
- •Глава 9 Анализ структуры термов
- •9.1. Типовые предикаты
- •9.2. Составные термы
- •9.3. Дополнительные сведения
- •Глава 10
- •10.1 Типовые металогические предикаты
- •10.2. Сравнение неосновных термов
- •10.3. Использование переменных в качестве объектов
- •10.4. Доступность метапеременных
- •10.5. Дополнительные сведения
10.4. Доступность метапеременных
Характерной особенностью Пролога является эквивалентность программ и данных - и то и другое может быть представлено логическими термами. Для того чтобы можно было использовать эту эквивалентность, необходимо, чтобы программы можно было рассматривать в качестве данных, а данные можно было бы превращать в программы. В данном разделе описывается средство, позволяющее превращать терм в цель. Смысл предиката Call(X) в Прологе состоит в передаче терма Х в качестве цели для решения.
На практике в большинстве реализации языка Пролог отсутствует введенное нами ограничение для логических программ, а именно: цели в теле предложения должны быть термами, отличными от переменных. Доступность метапеременных означает, что в качестве целей в конъюнктивных вопросах и в теле предложений разрешается использовать переменные. В процессе вычисления в момент обращения к такой переменной ей должно быть сопоставлено значение-терм. Если переменной не сопоставлено значение в момент обращения, то возникает ошибочная ситуация. Доступность метапеременных является синтаксическим средством, обеспечивающим условия применения предиката call.
Доступность метапеременных является важным инструментом метапрограммирования, используемым, в частности, при построении метаинтерпретаторов и оболочек. Два важных примера подобных программ - простая оболочка (программа 12.6) и метаинтерпретатор (программа 19.1) будут обсуждаться в последующих главах. Это же средство существенно используется при определении отрицания (программа 11.5) и при определении предикатов высших порядков, описанных в разд. 17.3.
В заключение приведем пример использования метапеременных в определении логической дизъюнкции, обозначенной инфиксным бинарным оператором “;”. Цель (X; Y) выполнена, если Х и Y выполнено. Определение оформлено как программа 10.8.
X;Y
Х или Y
X; Y X.
X; Y Y.
Программа10.8. Логическая дизъюнкция.
10.5. Дополнительные сведения
Блестящее обсуждение системных металогических предикатов в Прологе-10 и описание их использования можно найти в (O'Keefe, 1983b).
Процедура унификации Параллельного Пролога, написанная на Прологе, имеется в работе (Shapiro, 1983).
Предикаты freeze, melt и melt_new были введены в статье (Nakashima, Ueda, 1984), там же обсуждается их использование в Прологе-10.
Название freeze предполагалось использовать для других раширений чистого Пролога. Наиболее радикальным из них является предикат geler (Colmerauer, 1982b), позволяющий приостанавливать решение целей и предоставляющий программисту дополнительные средства управления порядком целей.