Скачиваний:
53
Добавлен:
01.05.2014
Размер:
565.76 Кб
Скачать

Часть II Язык Пролог

При реализации языка, основанного на вычислительной модели логического программирования, следует обратить внимание на три проблемы. Первая проблема связана с уточнением порядка выборов, оставшихся неопределенными в абстрактном интерпретаторе. Вторая проблема связана с увеличением выразительной силы исходной вычислительной модели логического программирования за счет добавления металогических и внелогических средств. И наконец, следует предусмотреть использование некоторых особенностей применяемого компьютера, таких, как быстрая арифметика, возможности ввода-вывода. В этой части книги описывается, как данные проблемы решаются в языке Пролог, наиболее развитом языке, основанном на логическом программировании.

Глава 6 Чистый Пролог

Программа на чистом Прологе - это логическая программа, в которой задан порядок предложений и целей в теле каждого предложения. Абстрактный интерпретатор логических программ видоизменен так, чтобы использовать информацию о заданных порядках. В настоящей главе описываются отличия вычислительной модели программ на Прологе от модели логических программ; модель для Пролога сравнивается с более привычными языками программирования.

Взаимосвязь логического, программирования и языка Пролог напоминает взаимосвязь лямбда-исчисления и языка Лисп.0ба этих языка являются конкретной реализацией абстрактных вычислительных моделей. Логические программы, испоняемые с помощью вычислительной модели Пролога, называются программами на чистом Прологе. Чистый Пролог представляет собой приближенную реализацию вычислительной модели логического программирования на последовательной машине. Конечно, данная реализация не является единственно возможной. Она является, однако, одной из наилучших с практической точки зрения-совмещения свойств абстрактного интерпретатора с возможностью эффективного выполнения.

6.1. Вычислительная модель Пролога

При построении на основе абстрактного интерпретатора некоторого интерпретатора для конкретного языка программирования необходимо принять два важных решения. Во-первых, следует ограничить произвол в выборе редуцируемой цели в резольвенте, т.е. уточнить метод расписания. Во-вторых, нужно реализовать недетерминированный выбор предложения программы, используемого в редукции.

Существуют разные языки программирования, использующие различные способы выбора. Грубо говоря, они делятся на два класса. Пролог и его расширения (например, Пролог-11, IC-Пролог и MU-Пролог) основаны на последовательном выполнении. Другие языки, такие, как Parlog, Параллельный Пролог и GHC. основаны на параллельном выполнении. Последовательные языки отличаются от параллельных методом реализации недетерминизма. Отличие Пролога от его версий состоит в методе выбора редуцируемой цели.

Выполнение программ на Прологе заключается в работе абстрактного интерпретатора, при которой вместо произвольной цели выбирается самая левая цель, а недетерминированный выбор предложения заменяется последовательным поиском унифицируемого правила и механизмом возврата.

Другими словами, в Прологе используется стековый метод расписания. В Прологе резольвента используется как стек - для редукции выбирается верхняя цель, производные цели помещаются в стек резольвенты.

В дополнение к методу стека Пролог моделирует недетерминированный выбор редуцирующего правила с помощью последовательного поиска и механизма возврата. При попытке редуцировать цель выбирается первое предложение, заголовок которого унифицируем с данной целью. Если не существует правила, унифицируемого с выбранной целью, то вычисление восстанавливается на стадии последнего сделанного выбора и выбирается следующее унифицируемое предложение.

Вычисление цели G относительно программы Р, написанной на Прологе, состоит в порождении всех решений цели G относительно программы Р. В терминах логического программирования вычисление цели G в Прологе является полным обходом в глубину конкретного дерева поиска цели G, в котором всегда выбирается самая левая цель.

Существует много версий языка Пролог. Они отличаются синтаксисом, некоторыми особенностями исполнения и удобством программирования. Мы в основном следуем версии Edinburgh-Пролог. Все наши программы пригодны и для выполнения в версии Wisdom-Пролог. Синтаксис в нашей версии совпадает с тем, который ранее использовался в логических программах. На самом деле многие логические программы будут правильно выполняться без какого-либо изменения записи.

Протокол вычисления в Прологе является некоторым расширением протокола логической программы при использовании абстрактного интерпретатора, описанного в разд. 4.2. Мы еще раз рассмотрим вычисления, приведенные в гл. 4 и 5, чтобы отметить сходства и различия. Рассмотрим вопрос сын(X, аран)?. относительно программы 1.2, упрощенной библейской базы данных, повторно записанной в верхней части рис.6.1. Вычисление приведено в основной части рис. 6.1, Оно соответствует обходу в глубину первого дерева поиска на рис. 5.2. Данное вычисление является расширением первого протокола на рис. 4.4, так как поиск производится во всем дереве поиска.

Список обозначений, использовавшихся ранее в протоколах, следует расширить для описания отказов и возвратов. Символ после цели означает, что цель недоказуема, т.е. в программе отсутствует предложение, заголовок которого унифицируем с целью. Встретив недоказуемую цель, вычисление переходит к цели, указанной механизмом возврата. Соответствующая цель уже появлялась в качестве предыдущей цели в протоколе на том же самом уровне и может быть идентифицирована именами переменной. В соответствии с правилами Edinburgh-пролога символ «;» после решения означает, что вычисление продолжается для поиска

отец(авраам,исаак). мужчина(исаак).

отец(аран,лот). мужчина(лот).

отец(аран,милка). женщина(милка).

отец(аран, иска). женщина(иска).

сын(Х,У)  отец(У,Х), мужчина(Х).

дочь(Х,У)  отец(У,Х), женщина(Х).

сын(Х,аран)? Х = лот

отец(аран,Х)

мужчина(лот)

true

Результат: X = лот

;

отец(аран,Х) Х = милка

мужчина(милка) f

отец(аран,Х) Х = иска

мужчина(иска) f

Нет (больше) точек выбора

Рис. 6.1. Протокол простого вычисления в Прологе.

других решений. Унификатор обозначается как и раньше.

В некоторых версиях Пролога вычисления отличаются от описанных выше. например, в одних версиях всегда даются все решения, в то время как в других после каждого решения ожидается реакция пользователя.

append([X | Xs],Ys,[X | Xs])  append (Xs,Ys,Zs).

append ([ ],Ys,Ys)

append (Xs,Ys[a,b,с]) Xs=[a | Xsl]

append(Xs1,Ys,[b,c]) Xs1=[b | Xs2]

append(Xs2,Ys,[c]) Xs2==[c | Xs3]

append(Xs3,Ys,[ ]) Xs3=[ ],Ys=[ ]

true

Результат:(Xs=[a,b,c],Ys=[ ])

;

append(Xs2,Ys,[c]) Xs2=[ ],Ys=[c]

true

Результат: (Xs=[a,b],Ys=[c])

;

append(Xs1,Ys,[b,c]) Xs1=[ ],Ys=[b,c]

true

Результат: (Xs=[a],Ys=[b,c])

;

append(Xs,Ys[a,b,c]) Xs=[ ],Ys=[a,b,c]

true

Результат: (Xs=[ ],Ys=fa,b,c])

;

Соседние файлы в папке 1-13