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

Запомненные состояния

Механизм запомненных состояний Квинтус Пролога во многом по­хож на этот механизм в СиПрологе. В версиях для операционной системы UNIX можно запускать Пролог-процесс и восстанавливать запомненное состояние просто при помощи ввода имени запомненного состояния в командной строке операционной системы.

Интерфейс с иными языками программирования

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

Расширения

В Квинтус Пролог включено DCG-расширение, о котором рассказыва­лось выше при описании СиПролога.

Разное

Фразы при просмотре или компиляции анализируются подсистемой проверки стиля программирования. Эта подсистема выдает предупреж­дающие сообщения о возможных ошибках (к примеру, о переменной, которая встречается во фразе лишь один раз). Этот вид сообщений помо­жет локализовать ошибки правописания.

Индексация первого аргумента

В откомпилированных процедурах Квинтус Пролога (за исключе­нием динамических процедур) автоматически индексируется первый аргумент. Это означает, что при выполнении запроса к процедуре для ускорения доступа к фразам процедуры, имеющим такой же первый ар­гумент, как и у запроса, применяется хеш-таблица. Если первым аргу­ментом служит структура, то фразы индексируются по имени этой струк­туры.

Оптимизация остаточной рекурсии

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

В качестве примера того, как можно воспользоваться преимущества­ми, предоставляемыми оптимизацией остаточной рекурсии, рассмотрим две версии процедуры "суммировать". Эта процедура должна складывать друг с другом все числа из списка.

% + -

суммировать1 ([ ], 0).

суммировать1 ([N | R], Итог) : —

суммировать1 (R, Текущ_сумма),

Итог is N + Текущ_сумма.

% + +

суммировать2([ ], Итог, Итог).

суммировать2([N | R], Текущ сумма, Итог): —

НовТекущ_сумма is N + Текущ_сумма,

суммировать2(R, НовТекущ_сумма, Итог) .

| ?-суммировать1 ([2,2], Т1).

Т1=4

| ?-. суммировать2([2,2],0,Т2).

Т2=4

Компилятор не применит оптимизацию остаточной рекурсии к про­цедуре "суммировать1", так как в момент вызова рекурсивной подцели (« суммировать 1 (R, Текущ_сумма »)) остается еще одна подцель, кото­рая должна быть выполнена. Компилятор употребит, однако, оптимиза­цию остаточной рекурсии в случае процедуры "суммировать2", посколь­ку к моменту вызова рекурсивной подцели («суммировать 2 (Р, Нов­Текущ_сумма, Итог »)) все предыдущие подцели (« НовТекущ_сумма is N + Текущ_сумма ») являются детерминированными, а после рекурсив- ной подцели не располагаются никакие другие подцели.

Соседние файлы в папке Гл.6,7,Прилож.,Допол