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

6.2. Сравнение с традиционными языками программирования

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

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

procedure A

call B

call B

.

.

.

call B„

end.

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

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

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

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

• однократное присваивание,

• передача параметров,

• размещение записей,

• доступ к полям записей для одновременных чтения/записи.

Рассмотрим протокол программы быстрой сортировки (рис. 6.3), обращая внимание на различные использования унификации. Унификация исходной цели quicksort[2,l,3],Qs) с заголовком процедурного определения - quicksort([X \ Xs],Ys) демонстрирует несколько характерных использовании унификации. Унификация списка [2,1,3] и терма [Х | Хs] обеспечивает обращение к записи в списке, а также выделение в этой записи двух полей - головы и хвоста.

Унификация списка [1,3] с термом Xs выполняет передачу параметра процедуре partition, используя общие переменные. Таким образом определяется первый аргумент процедуры partition. Аналогично унификация 2 и Х приводит к передаче второго аргумента процедуре partition.

Создание записей возникает при унификации цели partition([1,3],2,Ls,Bs) с заголовком процедуры partition-partition([X \ Ys],Z [ X \ Ls1,Bs1]). При унификации переменной Ls сопоставляется терм [1 | Ls1]. Точнее, в качестве Ls должен быть использован список, причем голове этого списка следует сопоставить значение 1. Иными словами, при данной унификации происходит создание записи и назначение значений полям записи.

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

Традиционные языки, как правило, содержат различной степени сложности средства обработки ошибочных и исключительных ситуаций. Чистый Пролог не содержит механизма обработки ошибок и исключительных ситуаций, встроенного в описание языка. В отличие от традиционных языков ситуации, приводящие к ошибке (например, отсутствие нужной ветви в операторе case, деление на нуль), в чистом Прологе приводят к «отказу».

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

состояние “отказ”, или в состояние “прерывание”.

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

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