- •Глава 4 Вычислительная модель логических программ
- •4.1. Унификация
- •4.2. Абстрактный интерпретатор логических программ
- •Упражнения к разд. 4.2
- •4.3. Дополнительные сведения
- •Глава 5 Теория логических программ
- •5.1. Семантика
- •5.2. Корректность программы
- •5.3. Сложность
- •5.4. Деревья поиска
- •5.5. Отрицание в логическом программировании
- •5.6. Дополнительные сведения
- •Часть II Язык Пролог
- •Глава 6 Чистый Пролог
- •6.1. Вычислительная модель Пролога
- •Нет (больше) решений
- •Упражнения к разд. 6.1
- •6.2. Сравнение с традиционными языками программирования
- •6.3. Дополнительные сведения
- •Глава 7 Программирование на чистом Прологе
- •7.1. Порядок правил
- •7.3. Порядок целей
- •7.5. Рекурсивное программирование в чистом Прологе
- •7.6. Дополнительные сведения
6.3. Дополнительные сведения
Возникновение Пролога покрыто тайной. Известно только то, что два создателя языка Роберт Ковальский, в то время работавший в Эдинбурге, и Алан Колмероэ из Марселя - разрабатывали в начале 70-х гг. сходные идеи и даже в течение одного лета работали вместе. В результате были сформулированы основные положения логического программирования и вычислительная модель (Kowalski, 1974), описан и реализован первый язык логического программирования - Пролог (Colmerauer et al, 1973).
Использование логики в качестве основы практического языка программирования во многом обязано исследованиям эффективных методов реализации, начатым в работе (Warren, 1977). Транслятор Уоррена выделял специальные случаи унификации и преобразовывал их в эффективные последовательности обычных операций работы с памятью.
Возникали версии языка Пролог, содержащие дополнительные средства управления, например IC-Пролог (Clark, Mc Cabe, 1979), однако было показано, что из-за большого увеличения времени работы программ их нельзя рассматривать в качестве альтернатив Прологу. Отдельные интересные версии языка будут упоминаться в соответствующих разделах книги.
Другую ветвь языков логического программирования, косвенно возникшую из IC-Пролога, составляют параллельные логические языки. Сначала появился Реляционный Язык (Clark, Gregory, 1981), далее последовали: Параллельный Пролог (Shapiro, 1983b), Parlog (Clark, Gregory, 1984), GHC (Ueda, 1985) и несколько других версий.
Литература к версиям, упоминаемым в тексте: Пролог-II-(Van Gengham, 1982), IC-Пролог (Clark at al„ 1982) и MU-Пролог-(Naish, 1985a).
Благодаря работе (Kowalski, 1974) синтаксис Пролога основан на способе записи утверждений в логике. Исходный марсельский интерпретатор использовал терминологию позитивных и негативных формул, возникшую в теории резолюций. Правило АВ,...,В записывалось в виде + А - В...- B.
Уоррен и его коллеги перенесли Marseille-Пролог на компьютер DEC-10, и это решение оказало большое влияние на дальнейшие работы. Многие системы придерживаются соглашений версии Пролог-10 (Warren et al., 1979), более известной под названием Edinburgh-Пролог. Основные характеристики этой версии описаны в широко распространенном введении в Пролог (Clocksin, Mellish, 1984). Edinburgh-Пролог излагается в нашей книге в основном в соответствии с описанием (Bowen et al., 1981).
Недавняя статья (Coben, 1986) продолжает исследования связи языка Пролог с традиционными языками программирования.
Глава 7 Программирование на чистом Прологе
Основная цель логического программирования - создать возможность разработки программ на языке высокого уровня. В идеале программист должен записать аксиомы, определяющие требуемые отношения, полностью игнорируя, каким образом эти аксиомы будут использоваться в процессе выполнения. Имеющиеся языки логического программирования, и, в частности. Пролог, все еще далеки от этого идеала декларативного программирования. Нельзя игнорировать конкретный. четко определенный способ моделирования абстрактного интерпретатора в реализации каждого языка. Эффективное логическое программирование требует знания и использования этого способа.
В настоящей главе обсуждаются возможности вычислительной модели Пролога для создания логических программ. Рассматриваются новые аспекты программирования. Программист должен не только уделять внимание корректной и полной аксиоматизации отношения, но и рассматривать его выполнение в соответствии с вычислительной моделью.