
- •Справочное руководство по турбо прологу 2.0
- •Глава 2. Элементы языка 50
- •Глава 3. Интерфейс с другими языками 75
- •Часть 2. Стандартные предикаты 91
- •Часть 3. Приложения 250
- •Введение
- •Дистрибутивные диски
- •Рекомендуемая литература:
- •Часть 1. Руководство программиста по турбо прологу глава 1. Система меню турбо пролога
- •Пользователям Турбо Пролога 1.X
- •Структура меню Турбо Пролога
- •Выбор элементов меню.
- •"Горячие" клавиши.
- •Системные окна и строки помощи
- •Окно редактирования.
- •Как войти в окно редактирования
- •Компоненты окна редактирования
- •Как выйти из окна редактирования.
- •Окно трассировки
- •Окно сообщений
- •Диалоговое окно
- •Строка помощи
- •Главное меню.
- •Окно редактирования.
- •Окно вспомогательного редактирования (Xedit).
- •Окно просмотра.
- •Изменение размера окон.
- •Просмотр окон
- •Создание нового файла.
- •Загрузка существующего файла.
- •Команды редактора.
- •Сохранение исходного текста в файле.
- •Запись исходного текста на диск
- •Вспомогательный редактор
- •Меню и команды
- •Меню файлов (Files)
- •Загрузка файлов (Load)
- •"Указка" (Pick)
- •Новый (New)
- •Выход (Quit)
- •Команда редактирования (Edit)
- •Команда запуска (Run)
- •Меню компиляции (Compile)
- •Память (Memory)
- •Меню опций (Options)
- •Опции компоновки (Link Options)
- •Стек (Stack)
- •Область ссылок (Trail Array)
- •"Куча" (Heap)
- •Контроль во время исполнения (Run-time check)
- •Цвета (Colors)
- •Размер окна (Window size)
- •Каталоги
- •Текущий каталог (Current directory)
- •Авто-загрузка сообщений (Avto-Load Message)
- •Режим экрана (Screen mode)
- •Конфигурация клавиатуры (Keyboard Configuration)
- •Перемещение курсора (Cursor movement)
- •Глава 2. Элементы языка
- •Ключевые слова.
- •Специальные предикаты.
- •Разделы программы.
- •Раздел доменов (domains).
- •Стандартные домены.
- •Списковые домены.
- •Домены составных объектов.
- •Файловый домен.
- •Специально заданные предопределенные домены.
- •Сокращение объявлений доменов.
- •Объявление ссылочных доменов.
- •Раздел предикатов (predicates).
- •Раздел базы данных (database).
- •Раздел предложений (clauses).
- •Простые константы.
- •Переменные.
- •Составные объекты.
- •Списки - Специальный вид составных объектов.
- •Раздел констант.
- •Условная компиляция.
- •Включение файлов в вашу программу.
- •Директивы компилятора.
- •Управление памятью в Турбо Прологе.
- •Экономия ресурсов памяти.
- •Управление распределением памяти.
- •Генерирование выполняемых программ.
- •Модульное программирование.
- •Проекты.
- •Глобальные объявления.
- •Глобальные домены.
- •Глобальная база данных.
- •Глобальные предикаты.
- •Компиляция и компоновка модулей.
- •Пример.
- •Глава 3. Интерфейс с другими языками
- •Вызов других языков из Турбо Пролога.
- •Что делать перед вызовом.
- •Объявление внешних предикатов.
- •Вызов соглашений и передача параметров.
- •Соглашение об обозначениях
- •Использование ключевого слова as
- •Вызов процедуры, написанной на Си из Пролога.
- •Опции компилятора Турбо Си и компоновка.
- •Вызов программ на языке ассемблера из Турбо Пролога.
- •Использование внутреннего ассемблера Турбо Си.
- •Вызов Турбо Пролога из других языков.
- •Динамическое распределение памяти.
- •Передача составных объектов в другие языки.
- •Передача списков.
- •Передача структур.
- •Примеры.
- •Обработка списков.
- •Программирование на низком уровне.
- •Часть 2. Стандартные предикаты
- •Arc/5 Графика
- •Bar/4 Графика
- •Bt_close/2 Внешняя База Данных
- •Bt_create/5 Внешняя База Данных
- •Bt_delete/2 Внешняя База Данных
- •Bt_open/3 Внешняя База Данных
- •Bt_statistics/8 Внешняя База Данных
- •Chain_delete/2 Внешняя База Данных
- •Chain_first/3 Внешняя База Данных
- •Chain_inserta/5 Внешняя База Данных
- •Chain_insertafter/5 Внешняя База Данных
- •Chain_insertz/5 Внешняя База Данных
- •Chain_last/3 Внешняя База Данных
- •Chain_next/3 Внешняя База Данных
- •Chain_prev/3 Внешняя База Данных
- •Chain_terms/5 Внешняя База Данных
- •Circle/3 Графика
- •Cleardevice/0 Графика
- •Clearviewport/0 Графика
- •Closegraph/0 Графика
- •Db_btrees/2 Внешняя База Данных
- •Db_chains/2 Внешняя База Данных
- •Db_close/1 Внешняя База Данных
- •Db_create/3 Внешняя База Данных
- •Db_delete/2 Внешняя База Данных
- •Db_flush/1 Внешняя База Данных
- •Db_garbagecollect/1 Внешняя База Данных
- •Db_open/3 Внешняя База Данных
- •Db_openinvalid/3 Внешняя База Данных
- •Db_statistics/5 Внешняя База Данных
- •Detectgraph/2 Графика
- •Drawpoly/1 Графика
- •Ellipse/6 Графика
- •Fillellipse/4 Графика
- •Fillpoly/1 Графика
- •Floodfill/3 Графика
- •Getarccoords/6 Графика
- •Getaspectratio/2 Графика
- •Getbkcolor/1 Графика
- •Getcolor/1 Графика
- •Getdefaultpalette/1 Графика
- •Getdrivername/1 Графика
- •Getfillpattern/1 Графика
- •Getfillsettings/2 Графика
- •Getgraphmode/1 Графика
- •Getimage/6 Графика
- •Getlinesettings/3 Графика
- •Getmaxcolor/1 Графика
- •Getmaxx/1 Графика
- •Getmaxy/1 Графика
- •Getmaxmode/1 Графика
- •Getmodename/2 Графика
- •Getmoderange/3 Графика
- •Getpalette/1 Графика
- •Getpalettesize/1 Графика
- •Getpixel/3 Графика
- •Gettextsettings/5 Графика
- •Getviewsettings/5 Графика
- •Getx/1 Графика
- •Gety/1 Графика
- •Graphdefaults/0 Графика
- •Graphresult/1 Графика
- •Imagesize/5 Графика
- •Initgraph/5 Графика
- •Key_current/4 Внешняя База Данных
- •Key_delete/4 Внешняя База Данных
- •Key_first/3 Внешняя База Данных
- •Key_insert/4 Внешняя База Данных
- •Key_last/3 Внешняя База Данных
- •Key_next/3 Внешняя База Данных
- •Key_prev/3 Внешняя База Данных
- •Key_search/4 Внешняя База Данных
- •Line/4 Графика
- •Linerel/2 Графика
- •Lineto/2 Графика
- •Moverel/2 Графика
- •Moveto/2 Графика
- •Outtext/1 Графика
- •Outtextxy/3 Графика
- •Pieslice/5 Графика
- •Pieslicexy/6 Графика
- •Putimage/4 Графика
- •Putpixel/3 Графика
- •Rectangle/4 Графика
- •Restorecrtmode/0 Графика
- •Setactivepage/1 Графика
- •Setallpalette/1 Графика
- •Setaspectratio/2 Графика
- •Setbkcolor/1 Графика
- •Setcolor/1 Графика
- •Setfillpattern/2 Графика
- •Setfillstyle/2 Графика
- •Setgraphmode/1 Графика
- •Setgraphbufsize/1 Графика
- •Setlinestyle/3 Графика
- •Setpalette/2 Графика
- •Setrgbcolor/4 Графика
- •Settextjustify/2 Графика
- •Settextstyle/3 Графика
- •Setusercharsize/4 Графика
- •Setviewport/5 Графика
- •Setvisualpage/1 Графика
- •Setwritemode/1 Графика
- •Term_delete/3 Внешняя База Данных
- •Term_replace/4 Внешняя База Данных
- •Textheight/2 Графика
- •Textwidth/2 Графика
- •Часть 3. Приложения приложение а. Введение вdos
- •Что такое dos
- •Как загрузить программу?
- •Каталоги
- •Подкаталоги
- •Avtoexec.Bat-файл
- •Команда path
- •Смена каталогов
- •Приложениеb. Интерактивный редактор турбо пролога
- •Быстрый вход, быстрый выход
- •Служебная строка окна редактора
- •Основные команды редактора
- •Команды Редактора, совпадающие с командами WordStar Основные команды работы с курсором
- •Команды быстрого движения курсора
- •Команды вставки и удаления
- •Команды работы с блоками
- •Остальные команды редактора
- •Старые команды
- •Поиск и замена
- •Редактор Турбо Пролога по сравнению с WordStar
- •Корректировка файла на диске.
- •Приложение c. Сообщения об ошибках
- •Приложение d. Различия между версиями 1.1 и 2.0
- •Файл определения проекта
- •Новые ограничения по именам
- •Новые предопределенные домены
- •Контроль состава параметров шаблона (flow pattern)
- •Поддержка старых командных клавиш редактора
- •Ошибочные ситуации в стандартных предикатах
- •Расширение Турбо Пролога 2.0
- •Системные расширения
- •Приложениеe. Словарь специальных терминов
- •Приложение f. Географическая база данных (Geobase)
- •Использование Geobase
- •Системы с 2-мя флоппи-дисковыми устройствами
- •Компиляция Geobase
- •Создание автономной программы
- •Главное меню Geobase
- •Справка
- •Команды dos
- •Редактор
- •Запросы к базе данных
- •Просмотр языка
- •Корректировка языка
- •Принципы Geobase
- •Использование принципа Geobase
- •Создание вашей базы данных
- •Преобразование Geobase
- •Предикат "ent"
- •Предикат "db"
- •Трансляция запросов на естественном языке
- •Внутренние имена объектов
- •Внутренние имена связей
- •Определение структуры предложений
- •База данных языка
- •Грамматический разбор с помощью разделения списков
- •Заключение
- •Приложение g. Анализатор предложений на турбо прологе
- •Использование анализатора предложений
- •Помощь пользователя
- •Операционная система
- •Редактирование базы данных
- •Загрузка базы данных из файла
- •Сохранение базы данных
- •Анализ предложений
- •«Показать/изменить словарь»
- •Приложениеh.Geni: оболочка экспертной системы
- •Использование geni
- •Запросы geni
- •Просмотр знаний
- •Корректировка базы знаний
- •Сохранение базы знаний
- •Создание новой базы знаний
- •Чистка текущей базы знаний
- •Проектирование новой базы знаний
- •Приложение I. Tlib: библиотека турбо
- •Компоненты командной строки tlib
- •Компонент «описание»
- •Список операций
- •Имена файла и модуля
- •Операции tlib
- •Создание библиотеки
- •Использование файла ответа
- •Расширенные возможности: опция /с
- •Примеры
- •Приложение j. Tlink: компоновщик турбо
- •Активизация tlink
- •Использование ответных файлов
- •Компоновка модулей Турбо Пролога и Турбо Си.
- •Модуль инициализации
- •Библиотеки
- •Опции tlink
- •Опция /c
- •Опция /d
- •Опция /I
- •Опция /l
- •Опции /m, /s, /X
- •Опция /m
- •Опция /s
- •Опция /X
- •Опция /n
- •Ограничения
- •Сообщения об ошибках
- •Предупреждения
- •Нефатальные ошибки
- •Фатальные ошибки
- •Приложение k. Метапрограммирование Введение
- •Пролог/Турбо: развитие и философские установки
- •Конструкторские решения в Турбо Прологе
- •Чем Турбо зарядило Турбо Пролог
- •Интерпретатор правил с обратной цепочкой рассуждений
- •Термы (горючее для интерпретатора правил)
- •Статические термы: область sTerm (статических термов)
- •Интерпретирование области термов.
- •Что такое интерпретатор?
- •Интерпретация правил в Прологе
- •Использование sTerm и aTerm для моделирования интерпретатора правил
- •Переменные и среда
- •Процесс унификации
- •Унификация статических и действительных термов
- •Интерпретация тела правила
- •Выполнение выполняемых термов: предикат call.
- •Встроенные предикаты
- •Сканнер и транслятор
- •Операторы традиционного Пролога
- •Использование операторов в Турбо Прологе
- •Интерпретатор Пролога
- •Реализация трассировки
- •Теперь объединим все вместе
- •Расширения экспертной системы
- •Цепочка с прямым порядком рассуждений
- •Стандартные предикаты, реализованные в pie
- •Заключение
Условная компиляция.
Вы используете условную компиляцию, если вам необходимо сгенериро-
вать различные версии одной и той же программы: например, одну версию,
использующую графику, и другую, использующую только текстовый вид.
Синтаксис директив условной компиляции:
[ifdef\ifndef] <constantID>
...
elsedef
...
enddef
<constantID> представляет собой идентификатор константы, объявленной
в разделе констант. Значение константы роли не играет, важно только ее
присутствие. Директива ifdef завершается успешно, если константа опреде-
лена, в то время как директива infdet завершается успешно, если константа
не определена. Часть elsedef является необязательной. Следующая программа
показывает, как использовать директивы условной компиляции, чтобы скомпи-
лировать программу, которая выводит одно из двух сообщений, зависящих от
того, определена ли константа egagraphic.
constants
egagraphic = 1
/* Заметим, что ifdef должно начинаться в первой колонке */
ifdef egagraphic /* Если egagraphic определена, то
используйте эту цель */
goal
graphics(5, 1,1),
write(" \nEGA Graphics "),
readchar(_).
/*Заметим, что elsedst тоже должно начинаться в первой колонке*/
elsedst /*В другом случае используйте следующую цель*/
goal
graphics(1, 1, 1),
write(" \nEGA Graphics "),
readchar(_).
/*Заметим, что enddet должно начинаться в первой колонке*/
enddet
Включение файлов в вашу программу.
Вы используете include в программах или модулях, чтобы включить со-
держимое другого файла в вашу программу во время компиляции. Синтаксис:
include "DosFileName"
DosFileName может включать имя, но вы должны помнить, что символ \
используется в Турбо Прологе как символ escape. Имея это в виду, вы долж-
ны ставить два символа \ в случаях, когда \ используется внутри исходного
текста.
Использовать включение файлов вы можете только на границах разделов
программы, поэтому include может появиться только там, где разрешается
одно из ключевых слов domains, predicates, goal, database или clauses.
Включаемый файл сам может содержать директивы include. Однако, включенные
файлы не должны использоваться рекурсивно таким образом, что один файл
включается более одного раза во время компиляции. Включенные файлы могут
содержать объявления цели, доменов и предикатов, при известных ограниче-
ниях на структуру программы.
Директивы компилятора.
Множество особенностей компилятора контролируется через директивы
компилятора. Вы можете ввести одну или более из следующих директив в на-
чале текста программы:
bgidriver config nobreak shorttrace
bgifont diagnostics nowarnings trace
check_determ errorlevel printermenu trail
code heap project
Многие из директив компилятора могут быть установлены как в среде
подготовки программ на Турбо Прологе (из меню), так и в исходном тексте.
Если директива компилятора стоит в исходном тексте, то ее значение пере-
силивает значение, установленное из меню.
В следующих разделах мы перечислим директивы компилятора и их место
в меню. Например, директива компилятора check_determ может быть установ-
лена в среде подготовки из меню Options/Compiler Directives/Non-Deferm
Warning (сокращенно O/C/Non-Deferm).
bgidriver
Если вы хотите подсоединить драйвер графики BGI прямо в вашу выпол-
няемую программу, используйте директиву компилятора bgidriver, за которой
следует имя файла драйвера графики
bgidriver "_CGA_driver_far"
bgifont
Если вы хотите подключить символьные шрифты BGI прямо в вашу выпол-
няемую программу, то используйте директиву компилятора bgifont с указани-
ем имени файла шрифта.
bgifont "_gothic_font_far".
check_determ O/C/Non-Determ)
Если вы указываете check_determ, система Турбо Пролог будет выдавать
предупреждения для каждого предложения программы, которое является неде-
терминистическим предикатом.
Есть два вида недетерминистических предложений:
1. Если предложение не содержит прерыватель (cut), и имеется
одно или более предложений, которые могут быть сопоставлены при
тех же входных аргументах для данного шаблона обмена (flow
pattern).
2. Если предложение вызывает недетерминистический предикат, и
за вызовом этого предиката не стоит прерыватель.
Вы можете использовать check_determ, чтобы проследить за прерывате-
лями. Турбо Пролог сам обладает широкими возможностями, позволяющими ре-
шить, является ли предикат детерминистическим или недетерминистическим,
поэтому вам необязательно заполнять ваши программы прерывателями просто
для того, чтобы сохранить место в стеке (что необходимо в более традици-
онных версиях Пролога).
Если некоторые предикаты являются недетерминистическими, а вы желае-
те подавить предупреждающие сообщения, то вы должны перед объявлением
предиката поставить determ или nondeterm; это указывает, что предикат
должен быть детертминистическим или недетерминистическим соответственно.
Например,
predicates
nondeterm repeat
determ readname(string)
По умолчанию все глобальные предикаты рассматриваются как детерми-
нистические. nondeterm позволяет вам объявить глобальный предикат как не-
детерминистический.
code
Директива code задает размер массива внутреннего кода. По умолчанию
16 Кбайт. Для больших программ вам может понадобиться задать больший раз-
мер. Для компьютеров с ограниченными (RAM-) возможностями, вы можете по-
желать задать меньший размер (чтобы оставить больше места для компилято-
ра. Формат для code:
code = Число_параграфов
где Число_параграфов представляет собой количество участков памяти по 16
байт, требуемых для массива кода. Например, директива
code = 1024
специфицирует массив кода в 16 Кбайт.
Директива code не влияет на размер файла .EXE.
Размер кода для одного модуля может достигать 500 Кбайт. Когда раз-
мер кода превышает значение 4000, компилятор переключается на генерацию
вызовов FAR внутри этого модуля. По этой причине вам следует только тогда
использовать код размером свыше 4000, когда это действительно необходимо.
config
Чтобы позволить .EXE читать файл .SYS, который определяет правила
умолчания для атрибутов окон, установок клавиатуры и т.д., разместите ди-
рективу
config "<ИмяФайлаКонфигурации>.sys"
в вашей программе. .EXE будет читать <ИмяФайлаКонфигурации>.SYS и обра-
щаться с ним так же, как это делает Турбо Пролог с PROLOG.SYS.
Различные опции проходят из среды в выполняемый файл; они могут быть
встроены во время компиляции или считаны из файла .SYS во время старта.
Некоторые из значений, встроенных в файл .EXE могут быть переписаны соот-
ветствующим образом в файл .SYS.
Ниже следует обзор этих параметров:
компиляция <ИмяФайлаКонфи- <ИмяФайлаКонфи-
гурации>.SYS гурации>.SYS
-----------------------------------------------------------------
Stack Size х х
Trail Size х х
Heap Size х
Snow Check х х
Keyboard Layont х
Help Lines х
Xedit Setup х
-----------------------------------------------------------------
diagnostics O/C/Diagnostics
Если вы укажите diagnostics, то компилятор выдаст анализ вашей прог-
раммы, содержащий следующую информацию:
# Имена использованных предикатов
# является ли предикат локальным, глобальным или внешне опреде-
ленным
# является ли предикат детерминистическим или недетерминистичес-
ким
# размер кода для каждого предиката
# типы доменов параметров
# формы каждого предиката
Пример диагностики:
DIAGNOSTICS FOR MODULE: C:\TPROLOG2\PROGRAMS\D_CURVE.PRO
Predicates Name Type Determ Size Doml -- flowpattern
-----------------------------------------------------------------
goal local YES 190 --
dragon local YES 496 real,integer,integer--i,i,i
t local YES 496 integer,integer,integer--i,o,o
-----------------------------------------------------------------
Total size 883
Замечание: Вы можете использовать клавишу Alt-P, чтобы переназначить
вывод диагностики на принтер или в файл с именем PROLOG.LOG.
errorlevelO/C/ErrorLever
Директива компилятора errorlevel дает вам возможность определять
насколько должны быть детализированы сообщения об ошибках в файле .EXE.
Синтаксис:
errorlevel = d
где d - это 0, 1 или 2, представляющие следующие уровни:
-----------------------------------------------------------------
d Уровни сообщений об ошибках
-----------------------------------------------------------------
0 Генерирует наиболее эффективный код. Это соответствует
стратегии Турбо Пролога версии 1.x.
1 По умолчанию. Когда встречается ошибка, то место ее появления
(имя модуля и присоединенного файла) выводится на экран.
Место, где была обнаружена ошибка, также выводится,
выраженное в терминах количества байтов от начала файла.
После того, как исходная программа загружена в редактор, если
вы нажмете Shift-F2, введите это число, а затем снова нажмите
Shift-F2, курсор будет расположен в месте, где встретилась
ошибка.
2 На этом уровне ошибки, о которых не было сообщений на уровне
1, включая переполнение стека, переполнение памяти, вызывают
сообщения.
-----------------------------------------------------------------
По проекту опция error-level в каждом модуле служит для управления
таким свойством модуля как сообщение об ошибках. Если, однако, опция
error-level в главном модуле выше, чем в подмодулях, Турбо Пролог может
выдать дезориентирующую информацию. Например, если ошибка встречается в
модуле, скомпилированном с уровнем ошибок 0, который включен в главный
модуль, скомпилированный с уровнем 1 или 2, система будет неспособна вер-
но показать место ошибки. Вместо этого, она индицирует позицию какого-ни-
будь ранее выполненного кода.
heap O/C/M/Heap
Директива heap специфицирует, сколько памяти должен занять ваш файл
.EXE, если он запущен из DOS. Если вы не используете директиву heap или
устанавливаете ее значение 0, программа будет размещаться во всей доступ-
ной памяти. Обычно так и делают, но если вы хотите поставить RAM-резиден-
тную Турбо Пролог-программу, ваша программа должна занимать только необ-
ходимую память. Формат:
heap = Число_параграфов
nobreak O/C/R/Break Check
При отсутствии директивы компилятора nobreak, система Турбо Пролог
будет генерировать код на контроль клавиатуры перед каждым вызовом преди-
ката, чтобы удостовериться в том, что комбинация клавиш Ctrl-Break не бы-
ла нажата. Это несколько замедляет выполнение программы и требует немного
дополнительного места для программы.
Директива nobreak предотвращает эту автоматическую генерацию кода.
Когда введено nobreak, единственным способом выйти из бесконечного цикла
является перезагрузка всей оперативной системы. nobreak стоит использо-
вать после того, как программа хорошо протестирована.
nowarnings O/C/Variable Used Once
Директива nowarnings подавляет возникающие предупреждения, если пе-
ременная встречается в предложении только один раз.
Замечание: Эта директива включается только для полноты. Если
переменная встречается только один раз, это либо ошибка, либо она
может быть замещена на анонимную переменную.
printermenu O/C/Printer Menu in EXE file
Когда эта директива компилятора появляется в программе, Турбо Пролог
размещает код в файле EXE для управления клавишей Alt-P таким же образом,
как это делает система Турбо Пролог. Это означает, что пользователь будет
иметь возможность послать выходную информацию с экрана на принтер или в
.LOG-файл.
project
Директива компилятора project используется в модульном программиро-
вании. Все Турбо Пролог-модули, включенные в проект, нуждаются в том,
чтобы определить свою часть внутренней таблицы символов. Если проект на-
зывается MYPROJ, то таблица символов будет помещена в файл с именем
MYPROJ.SYM. Директива project должна стоять в первой строке модуля, чтобы
указывать, какому проекту этот модуль принадлежит. Например, следующая
строка указывает, что модуль принадлежит проекту MYPROJ:
project "MYPROJ"
Для детального знакомства с модульным программированием см. соответ-
ствующий раздел оригинального руководства.
trace(shorttrace)O/C/T/Trace(ShortTrace)
Когда вы указываете trace, Турбо Пролог не будет сокращать хвостовую
рекурсию и проделывать другие оптимизирующие трюки. Если указано trace,
то трасса покажет все RETURN. Shorttrace показывает трассу с сокращением
рекурсии и оптимизацией. Если указано trace или shorttrace, то все преди-
каты трассируются. Если за trace или shorttrace следует список имен пре-
дикатов, трассируются только указанные предикаты. Во время трассировки
Турбо Пролог высвечивает информацию, показанную в Таблице 2.3.
Таблица 2.3. Сообщения окна трассировки.
-----------------------------------------------------------------
CALL Всякий раз, когда предикат вызывается, имя предиката и
значения его параметров высвечивается в окне
трассировки.
RETURN Когда предложение выполнено, в окне трассировки
высвечивается RETURN и происходит вызов предиката. Если
есть еще предложения, которые сопоставимы с входными
параметрами, то высвечивается звездочка (*),
показывающая, что это предложение является точкой
возврата.
FAIL Когда предикат завершается неудачно, высвечивается слово
FAIL, за которым идет имя завершившегося неудачно
предиката.
REDO REDO показывает, что имел место возврат. Имя предиката,
который снова вызывается вместе со значениями
параметров, высвечивается в окне трассировки.
-----------------------------------------------------------------
Например, задавая следующую программу
trace
domains
list = integer*
predicates
eg(integer, integer)
member(integer, list)
clauses
member(X, [X\_].
member(X, [_\L] :- member(X, L).
eg(X, X).
goal
member(X, [1, 2], eg(X, 2).
вы получаете следующую трассу:
CALL: goal()
CALL: member(_, [1, 2])
RETURN: *member(1, [1, 2])
CALL: eg(1, 2)
FAIL: eg(1, 2)
REDO: member(_, [1, 2])
CALL: member(_, [2])
RETURN: *member(2, [2])
CALL: eg(2, 2)
RETURN: eg(2, 2)
RETURN: goal()
trail O/C/M/Trail Array
Директива trail специфицирует размер внутреннего следящего массива
(trail array). Формат:
trail = Число_параграфов
Следящий массив используется для регистрации сторонних эффектов
(главным образом, связываний ссылочных переменных). По умолчанию следящий
массив отсутствует. Если ваша программа использует ссылочные переменные,
вы должны задать размер явно: в противном случае будет ошибка переполне-
ние следящего массива. Для большинства нужд установка
trail = 100
будет достаточной.