![](/files/books/160/no-cover.jpg)
Текст книги "Программирование на языке пролог"
Автор книги: У. Клоксин
Соавторы: К. Меллиш
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 25 (всего у книги 26 страниц)
ПРИЛОЖЕНИЕ D. ПРОЛОГ ДЛЯ ЭВМ DEC SYSTEM-10
В этом приложении кратко описывается Пролог-система для ЭВМ DECsystem-10 [18]18
В дальнейшем – Пролог-10.– Прим. перев.
[Закрыть] , которую реализовали Дейвид Уоррен, Фернандо Перейра и Льюис Перейра. Эта реализация стала фактическим стандартом, и реализации, сделанные по этому образцу, имеются теперь на многих других ЭВМ от микро-ЭВМ 2-80 до ЭВМ семейства VAX фирмы DEC. Описанный в этой книге «базовый» Пролог также в основном совпадает с Прологом-10. В данном приложении рассматриваются только те его особенности, которые существенно отличаются от базового Пролога. В начале мы покажем, как выглядит сеанс работы с Прологом-10, а затем перейдем к более подробному изучению отличий этой системы от нашего базового Пролога. В конце приводится список Пролог-систем, сделанных по образцу Пролога-10, которые можно использовать на других ЭВМ.
Пример сеанса работы
Здесь приводится пример сеанса работы с Прологом-10. В нем в точности воспроизводится все, что происходит на терминале во время такого сеанса. Кроме того, здесь даются пояснения к тому, что происходит.
Сначала мы находимся на уровне монитора операционной системы TOPS-10 и просим запустить Пролог.
.r prolog
Prolog-10 version 3.3
Copyright (С) 1981 by D. Warren, F. Pereira and L. Byrd
|?– likes(X,Y).
no
Содержимое заголовка, конечно, может несколько меняться от одной версии системы к другой. Литеры «|?-» выданы Прологом как «приглашение». Тем самым он сообщает нам, что ждет вопроса. Мы задали вопрос и получили ответ no (нет). Это неудивительно, поскольку сейчас в базе данных еще нет никаких фактов. Теперь мы полагаем, что существует файл, test.pl, и мы заполняем базу данных его содержимым.
|?– ['test.pl'].
test.pl consulted 58 words 0.01 sec.
yes
Чтобы заставить Пролог считывать утверждения из файла, мы задаем вопрос, состоящий из имени файла, заключенного (в виде атома Пролога) в квадратные скобки. В данном случае это файл, состоящий из утверждений об отношении «нравится» (likes) между людьми.
|?– likes(john,bertrand).
no
|?– likes(john,albert).
no
Это просто ряд вопросов о том, кто кому нравится. Пролог не может найти в базе данных сопоставимых фактов.
|?– listing(likes).
likes(john,alfred).
likes(alfred,john).
likes(bertrand,john).
likes(david,bertrand).
likes(john,_l):– likes(_l,bertrand).
yes
Чтобы узнать, какие утверждения с заданным предикатом имеются в базе данных, мы задаем вопрос с помощью специального встроенного предиката listing. Этот специальный вопрос заставляет Пролог выдать все утверждения, содержащие предикат likes. Заметим, что неконкретизированные переменные Пролог выводит в виде литеры подчеркивания, за которой следует число. Последнее утверждение в базе данных было записано в файле в виде:
likes(john,X):– likes(X,bertrand).
Продолжим наш пример:
|?– likes(john,X).
X = alfred;
X = david;
no
Здесь, с помощью нажатия клавиш «;» и «RETURN» мы запрашиваем альтернативные ответы на заданный вопрос. Было выдано два возможных ответа; больше Пролог ничего не смог найти.
|?– likes(X,Y).
X = john,
Y = alfred;
X = alfred,
Y = john;
X = bertrand,
Y = john;
X = david,
Y = bertrand;
X = john,
Y = david;
no
На этот раз ответ системы состоит из значений, которыми конкретизированы обе переменные. И опять для получения альтернативных ответов мы вводим «;» и «RETURN» до тех пор, пока новых ответов не окажется.
|?– [user].
Теперь мы просим Пролог читать утверждения из файла user. Это означает, что утверждения следует читать с терминала. Прочитанные утверждения будут дописаны в конец базы данных. Перед вводом утверждений (в отличие от ввода вопросов) в качестве приглашения Пролог выдает символ «|» вместо «|?-».
[likes(timothy,bertrand).
|
user consulted 10 words 0.03 sec.
yes
После ввода первого утверждения мы сообщаем Прологу, что хотим прекратить чтение утверждений. Это делается путем одновременного нажатия клавиш «CONTROL» и «Z». При этом перед вводом комбинации «CONTROL Z» мы могли бы ввести не один, а несколько фактов и правил. Теперь Пролог завершил обработку предыдущего вопроса и ждет ввода нового.
|?– likes(john,X).
X = alfred;
X = david;
X = timothy;
no
Здесь мы снова просим выдать альтернативные ответы. Заметим, что ввод нового утверждения привел к появлению нового ответа, который ранее при том же вопросе не выдавался.
|?– likes(bertrand,Y).
Y = john
yes
Здесь показан другой способ работы с альтернативами. После первого ответа мы ввели «RETURN». Это привело к тому, что весь вопрос завершился успешно, и Пролог перешел к ожиданию следующего вопроса.
|?– core 36864 (7680 lo-seg + 29184 hi-seg)
heap 2560 = 1573 in use + 987 free
global 1177 = 16 in use + 1161 free
local 1024 = 16 in use + 1008 free
trail 511 = 0 in use + 511 free
0.36 sec. runtime
В ответ на последнее приглашение «|?-» мы ввели комбинацию «CONTROL Z», чтобы показать, что мы закончили работу с системой. В ответ Пролог выдал нам некоторую статистическую информацию, и мы снова вернулись в монитор TOPS-10. Полный протокол этого сеанса работы был записан в файл prolog.log.
Синтаксис
Синтаксис Пролога-10 в основном совпадает с нашим описанием, Правда, он несколько менее строг в отношении того, что считать правильными атомами и переменными, чем те правила, которые приведены в книге. Каждый пример из этой книги удовлетворяет требованиям синтаксиса Пролога-10. Приведем одно важное замечание относительно операторов с высоким приоритетом: поскольку ',' является оператором, то настоятельно рекомендуется во избежание двусмысленности заключать в скобки все термы, записанные с использованием операторов одинакового или более высокого приоритета. Это гарантирует, например, что конструкция
foo(a,b,c)
может быть истолкована только как структура с функтором too от трех аргументов, а не, например, что-нибудь типа
foo(a,','(b,c))
или
foo(','(a,','(b,c)))
Если бы мы хотели записать именно этот последний терм, то это следовало бы сделать так
foo((a,b,c))
Правило относительно операторов высокого приоритета касается только нескольких операторов, таких как ':-' и ';'. Оно означает, что запись вида:
?– retract(parent(A,B):– father(A,B)).
является синтаксически неправильной в смысле Пролога-10. Чтобы сделать ее правильной, нужно добавить пару скобок.
В том случае, если вы работаете с терминалом или с операционной системой, в которых не предусмотрено одновременного использования прописных и строчных букв, можно использовать имеющийся в Прологе-10 альтернативный вариант синтаксиса. В этом синтаксисе отличие переменных от атомов состоит в том, что имена переменных начинаются с литеры подчеркивания «_». Для перехода на этот вариант синтаксиса предусмотрен встроенный предикат nolc(нет строчных букв). Другой встроенный предикат, lс(строчные буквы), позволяет снова переключиться на нормальный синтаксис.
И еще одно маленькое замечание. Функтор '.' (с двумя аргументами) в Прологе-10 не является заранее определенным оператором. При желании вы можете определить его сами, хотя в этом нет необходимости, если при работе со списками вы всегда пользуетесь специальным способом задания списков.
Различные ограничения
В Прологе-10 предусмотрены ограничения, с которыми пользователь вряд ли столкнется на практике. Приоритеты операторов должны быть в диапазоне от 1 до 1200. Целые числа должны находиться в диапазоне от -131 072 до 131 071, однако в ходе вычислений целых выражений промежуточные результаты могут выходить за эти границы. Вещественные числа (с плавающей точкой) не предусмотрены.
Возможности окружения
В Прологе-10 предусмотрена очень полезная возможность протоколирования сеанса работы. При обычной работе с Прологом система фиксирует в файле plolog.logна диске почти все, что появляется на терминале. После того как работа закончена, вы можете просмотреть этот файл и точно определить, что происходило во время сеанса работы. Файл prolog.logсодержит полезную информацию о том, что и когда делала ваша программа, и какие изменения вы в ней делали. На тот случай, если вы не хотите протоколировать все подряд, предусмотрены встроенные предикаты, обеспечивающие включение и выключение протоколирования.
В Прологе-10 можно прервать выполнение программы путем одновременного ввода комбинации символов «CONTROL С». Система отвечает приглашением и ждет от вас указаний о том, какое действие нужно выполнить далее. Набор допустимых команд включает break, continue(продолжить выполнение программы), exit(выход из Пролога), traceи notrace. Последние две команды вызывают продолжение выполнения программы после изменения вида или объема трассировки. Команда breakпозволяет приостановить выполнение текущей программы и предоставляет вам возможность работы с новой «копией» Пролог-системы. После выхода из команды breakприостановленная программа продолжит свое выполнение.
В Прологе-10 в качестве литеры, играющей роль признака конца файла используется комбинация «CONTROL Z» (клавиша CONTROL одновременно с Z). Ее ввод, в зависимости от ситуации, в которой вы находитесь, приводит к выходу из Пролога, к завершению режима breakили к завершению выполнения предиката consult. Встроенный предикат readв случае выхода на конец файла сравнивает свой аргумент с атомом end of file.
В Прологе-10 предусмотрены разнообразные средства, помогающие экономить время при повторном считывании программы. Можно сохранить «состояние» Пролог-системы, включая текущее состояние ее базы данных, в файле на диске, причем таким образом, что восстановление этого состояния происходит значительно быстрее, нежели чтение программы и приведение ее в то же самое состояние. Кроме того, в начале каждого сеанса работы, прежде чем начать ввод с терминала, Пролог-10 автоматически читает любую информацию, которая записана в файле plolog.ini.
Если во время выполнения Пролога-10 фиксируется ошибка, то система выводит сообщение, говорящее о том, что произошло. Большинство ошибок вызывают просто неудачу в согласовании тех целей, которые их породили, так что ваша программа может продолжать выполнение. Однако некоторые ошибки более серьезны. В этих случаях система прекращает выполнение всех имеющихся в данный момент программ и просит ввести очередной вопрос.
Компиляция
В Прологе-10 предусмотрена возможность выборочной компиляции некоторых из ваших утверждений, что позволяет значительно увеличить эффективность программ по времени выполнения и занимаемой памяти. Для этого имеется встроенный предикат, который действует подобно предикату consult, с той лишь разницей, что утверждения из файла не интерпретируются, а компилируются. Эффективность выполнения откомпилированных утверждений может быть увеличена за счет использования так называемых описаний режима, которые позволяют указать, как будут использованы данные утверждения (какие аргументы будут конкретизированы в различных ситуациях). Существуют определенные ограничения на пригодность утверждений для компиляции. Кроме того, системе необходимо задать некоторые другие описания, чтобы она смогла должным образом выполнять смесь интерпретируемых и откомпилированных утверждений.
Различия во встроенных предикатах
В Прологе-10 предусмотрены все встроенные предикаты, о которых говорилось в этой книге. Кроме того, он нормально обрабатывает грамматические правила, когда они встречаются в обычном consult. В данном разделе рассматриваются некоторые отличия от приведенных описаний.
Действие предиката displayвсегда состоит в выдаче аргументов этого предиката на терминал, а не в текущий файл вывода, как было описано.
При рассмотрении арифметических выражений мы говорили, что арифметическое выражение вычисляется только тогда, когда оно задано в качестве второго аргумента предиката is. Во всех других случаях структура вида '24-3' просто обозначает саму себя. В Прологе-10 это не так. Там вычисляются и арифметические выражения, заданные как аргументы других предикатов. Примером этого служат операторы отношения '‹', '=‹' и т. д., а также предикат put. Это означает, что приводимый ниже пример в Прологе-10 будет работать, а в нашем базовом Прологе выдаст ошибку или приведет к неудаче в согласовании цели.
?– 2+4‹12*(2+8).
yes
Еще одна особенность. Структура, представляющая собой список, состоящий из одного числа, рассматривается как арифметическое выражение, значением которого является число. Иными словами в Прологе-10 имеем:
?– X is [25].
X = 25
yes
Благодаря такой комбинации возможностей, вывод одиночных литер может быть задан в мнемоническом виде, например:
?– put("a"), put("b").
ab
yes
(не забывайте, что "а" – это список, состоящий из одного числового кода, соответствующего первой строчной букве алфавита).
Синтаксис отрицания. Предикат с именем notне предусмотрен, но вместо него используется инфиксный оператор '+' Отсутствует оператор «не равно» ('=').
Переменные как целевые утверждения. На самом деле это скорее вопрос синтаксиса, чем чего бы то ни было другого. Мы уже видели, как с помощью предиката callможно вызвать целевое утверждение, соответствующее текущему значению переменной Пролога. В Прологе-10 предусмотрен другой способ осуществления этого. Вместо того чтобы вставлять утверждение-цель вида
…, call(X),…
достаточно поставить на место цели саму эту переменную:
…, X,…
При этом использование варианта с callтакже возможно. Более того, при применении к такому утверждению assertaили assertzсистема преобразует цель X в цель call(X).
Задание аргументов для retract.Из-за трудностей, связанных с использованием переменных в качестве целей, в Прологе-10 существуют отличия в том, как должны задаваться тела утверждений в предикате retract.Трудность заключается в том, что когда мы задаем вопрос
?– retract((mother(A,B):– С)).
это может быть истолковано или как просьба об удалении утверждения, имеющего конкретный вид:
mother(A,B):– С.
где в теле утверждения переменная обозначает цель или как просьба об удалении утверждения для предиката motherс любым телом, как, например:
mother(X,Y):– parent(X,Y), female(Y).
Для устранения возможной двусмысленности, в подобных случаях Пролог-10 всегда начинает с замены неконкретизированных переменных, обозначающих одиночные или множественные целевые утверждения в аргументах для retractсоответствующими структурами с функтором call.Таким образом, вопрос
?– retract((mother(A,B):-С)).
фактически рассматривается как
?– retract((mother(A,B):-call(C))).
Если мы хотим удалить первое утверждение для предиката motherнезависимо от его тела, то для этого можно было бы задать:
?– clause(mother(A,B),C), retract((mother(A,B):-С)).
В этом случае первая цель с clauseделает С достаточно конкретизированной, чтобы избежать преобразования.
Дополнительные встроенные предикаты
Помимо встроенных предикатов, описанных нами, в Прологе-10 предусмотрено много других возможностей.
«Условная» форма задания целей, которая позволяет задавать цели в следующем виде:
…, (likes(john,X) –› wooden(X); plastic(X)),…
Идея такой составной цели состоит в следующем. Если цель – «условие», которая задается перед стрелкой –›, согласуется с базой данных, то осуществляется вызов второй цели, заданной непосредственно после –›, иначе осуществляется вызов третьей цели. Любая из этих целей может представлять собой последовательность целей Пролога. Указанные условные цели действуют точно так же, как если бы они были определены в Прологе-10 следующим образом:
?– op(1050,xfy,-›).
?– op(1100,xfy,';').
(X -› Y; Z):– call(X),!, call(Y).
(X -› Y; Z):– call(Z).
Индексированная база данных. Это средство позволяет сопоставлять элементы информации в базе данных с конкретными значениями и обходить стандартный механизм доступа к базе данных, имеющийся в Прологе. Например, если бы вы захотели хранить информацию о возрастах сотен людей, то стандартный подход потребовал бы завести сотни утверждений для некоторого предиката age (возраст). И когда затем вы бы пожелали выяснить возраст конкретного человека, Пролог должен был бы осуществить просмотр всех утверждений, пока не нашел бы нужный. Беда в том, что при обычном подходе информация сопоставляется с предикатом и, когда предикат содержит много утверждений, объем поиска может быть большим. Индексированная база данных позволяет сопоставлять информацию с конкретным именем более прямым способом.
Возможность доступа к предшественникам. В главе о средствах отладки мы рассматривали понятие целей-предшественников. В Прологе-10 предусмотрены встроенные предикаты, обеспечивающие доступ к предшественникам из Пролог-программы.
Статистическая информация. В Прологе-10 предусмотрены встроенные предикаты, позволяющие получить данные о скорости выполнения вашей программы и объеме памяти, необходимой для ее выполнения.
Средства отладки
В Прологе-10 предусмотрены средства отладки, соответствующие тому, что было нами рассмотрено. В дополнение к встроенным предикатам отладки, описанным в гл. 8, предусмотрен предикат, позволяющий указать, какие события являются управляемыми во время трассировки.
Литература
DECsystem-10 Prolog User's Manual,Department of Artificial Intelligence, University of Edinburg, Scotland.– Представляет собой руководство пользователя Пролога-10.
C-Prolog User's Manual,CAAD Studio, Department of Architecture, University of Edinburg, Scotland.– Описывается система, работающая под управлением операционной системы UNIX,
Prolog-1 User's Manual,Expert Systems Ltd, 9 West Way, Oxford, England.– Описывает систему, работающую на многих ЭВМ, от Z-80 под управлением операционной системы СР/М до VAX 11 под управлением операционной системы VMS.
ПРИЛОЖЕНИЕ Е. МИКРО-ПРОЛОГ
В этом приложении рассматриваются некоторые возможности системы микро-Пролог, разработанной для микро-ЭВМ на базе микропроцессора Z-80, работающих под управлением операционной системы СР/М.
Пример сеанса работы
Все приводимые примеры соответствуют «базовому» синтаксису. При желании можно воспользоваться другими формами синтаксиса, включая тот, что совместим с Прологом для ЭВМ DECsystem-10.
Ниже приводится последовательность сообщений, которая может появиться на вашем терминале в ходе обычного сеанса работы с микро-Прологом. Прежде всего мы задаем для СР/М команду запуска Пролога.
A›PROLOG
Micro-Prolog 3.00 S/N
(С) 1982 Logic Programming Associates Ltd.
9999 Bytes Free
&.?((likes x y))
Clause error at (likes x y)
В микро-Прологе литеры «&» выдаются в качестве приглашения. Их появление означает, что система ожидает от нас ввода команды. Ввод литеры «?» означает, что мы хотим задать вопрос. Вслед за ним должна следовать последовательность целей, заключенная в круглые скобки (которую следует понимать как конъюнкцию этих целей). Каждая цель внутри скобок представляет собой последовательность из имени предиката и следующих за ним аргументов. Переменные обозначаются именами, начинающимися с х, у, z, X, Y, Z, за которыми могут следовать числа. В вопросе, приведенном выше, спрашивается о том, нравится ли кто-либо кому-либо. Но поскольку в базе данных нет утверждений для предиката likes (нравится),то микро-Пролог сообщает об ошибке.
&.LOAD TEST
Другая важная команда – это LOAD.Далее следует имя файла. Ввод этой команды приводит к чтению содержимого файла TEST.LOGи дополнению этим содержимым базы данных, подобно тому, как это делалось при consult.Теперь можно задавать вопросы:
&.?((likes john bertrand))
?
&.?((likes john alfred))
&.
Заметим, что отрицательный ответ на вопрос обозначается в микро-Прологе литерой «?», а положительный ответ – повторной выдачей приглашения. Чтобы узнать, какие утверждения имеются для предиката likes,мы задаем команду LIST.Можно запросить выдачу текста всей программы или выдачу утверждений для некоторого набора предикатов. Посмотрим, какие утверждения существуют для предиката likes:
&. LIST(likes)
((likes john alfred))
((likes alfred john))
((likes bertrand john))
((likes david bertrand))
((likes john x) (likes x bertrand))
В некоторых случаях для того, чтобы получить ответ на заданный вопрос, приходится прибегать к помощи встроенных предикатов. Предикат РР обеспечивает выдачу его аргументов на терминал, а предикат FAIL вызывает неудачное согласование целевого утверждения.
&.?((likes john х) (РР х) (FAIL))
alfred
david
?
Так мы получили два ответа на вопрос: «Кто нравится Джону?». Если мы хотим добавить к базе данных новые утверждения с терминала, нам не нужно прибегать к помощи специальных команд – мы можем просто ввести эти утверждения. Синтаксис утверждений микро-Пролога будет рассмотрен в следующем разделе.
&.((likes timothy bertrand))
&.?((likes john x) (PP x) (FAIL))
alfred
david
timothy
?
Чтобы выйти из микро-Пролога и вернуться в СР/М, достаточно задать команду QT, за которой следует поставить точку:
&. QT.
А›
Синтаксис
Синтаксис микро-Пролога существенно отличается от синтаксиса, рассматриваемого в данной книге, однако освоить его можно довольно быстро. Основная идея заключается в том, что существует всего один вид терма – список. Если мы хотим построить терм с функтором fи четырьмя аргументами, то для этого используется список из пяти элементов, куда fвходит в качестве головы, а остальные элементы соответствуют четырем аргументам в порядке их следования. Таким образом то, что в базовом синтаксисе было бы записано в виде:
f(a,g(2,3),c)
на микро-Прологе должно быть записано как:
(f a (g 2 3) с)
Здесь мы сталкиваемся также и с иным синтаксисом задания списков, где списки заключены в круглые скобки, а элементы списков разделяются пробелами.
Утверждения представляются как списки термов, где первый терм – это заголовок утверждения, а остальные термы – цели, которые, будучи взятыми в конъюнкции, образуют тело утверждения. Рассмотрим более сложное утверждение:
((alter (zl|z2) (x|y)) (change zl x) (alter z2 у)
Это – второе утверждение для предиката alter(преобразовать) из разд. 3.4. Заметим, что вертикальная черта имеет здесь то же значение, что и в базовом синтаксисе.
Различные ограничения
Микро-Пролог может обрабатывать числа с плавающей точкой с точностью до восьми значащих цифр и с порядком (по основанию 10) в диапазоне от -127 до 127. Имена атомов (называемые в микро-Прологе «константами») могут содержать до 60 литер, а терм не может содержать более 64 переменных. Эти ограничения на практике не вызывают трудностей.
Возможности окружения
Микро-Пролог предоставляет множество средств, помогающих при разработке программ за терминалом. Предикаты LOADи SAVEпозволяют, соответственно, читать и записывать программы в файлы на диске. Мощный строчный редактор и структурный редактор позволяют вносить изменения в тексты программ, не выходя из Пролог-системы. Выполнение микро-Пролог-программы может быть прервано путем ввода комбинации «CONTROL С».
Специальные встроенные предикаты
Имена и назначение встроенных предикатов сильно отличаются от рассмотренных в данной книге. Ниже приводится краткое описание некоторых из предусмотренных средств.
Тип терма можно проверить с помощью предикатов NUM, CON, VAR,которые согласуются с базой данных, соответственно, в случае чисел, констант (атомов) и переменных. Кроме того, предикат SYSпроверяет, является ли константа именем встроенного предиката, предикат 1NTобеспечивает проверку на целое число.
Для работы с базой данных используются предикаты: ADDCL(аналогичен assert), CL(аналогичен clause)и DELCL(аналогичен retract)В этих предикатах можно задавать дополнительный целочисленный аргумент Nс тем, чтобы можно было обрабатывать N-e утверждение процедуры.
Поскольку единственным видом терма в микро-Прологе является список, то предикат вида ' =..' здесь не нужен. Предикат STRINGпозволяет программисту создавать новые атомы и осуществлять доступ к внутренней структуре имени атома аналогично тому, как это делается с помощью предиката name.
Составные цели в микро-Прологе можно конструировать с помощью встроенных предикатов OR, NOTи IF.Предикат FAILвызывает немедленную неудачу в согласовании цели. Предусмотрено также и «отсечение», которое обозначается с помощью литеры '/'.
Арифметические действия реализуются посредством нескольких предикатов, вместо одного is. Арифметические предикаты максимально «обратимы», поэтому, например, цель
(SUM х у г)
вызывает сопоставление z с суммой х и у, если х и у конкретизированы. С другой стороны, если сначала конкретизированы у и r, а х – нет, то х будет конкретизирован разностью z-у.
Операции с файлами в микро-Прологе аналогичны тем, что имеются в базовом Прологе, с той лишь оговоркой, что здесь нет понятия текущего потока ввода или текущего потока вывода. Вместо этого вывод в файл и ввод из файла осуществляются, соответственно, через предикаты WRITEи READс указанием каждый раз имени файла. Предусмотрены специальные предикаты, обеспечивающие удобства при вводе-выводе через терминал пользователя.
Микро-Пролог позволяет программисту разрабатывать программы по частям, которые называются модулями. Такая возможность сокращает вероятность случайных конфликтов имен в про-граммах и облегчает обмен программами между программистами.
Средства отладки
В микро-Прологе предусмотрена возможность трассировки программы, однако средства трассировки должны быть предварительно загружены с помощью предиката LOAD. При трассировке выдается информация о процессе согласования всех целей, не содержащих встроенных предикатов. В моменты возникновения событий CALL, EXITи FAIL, которые именуются, соответственно, как ENTER, FINISHи FAIL, выдаются соответствующие сообщения. Пользователю разрешается в момент события CALLвмешиваться в ход трассировки и задавать команды CONTINUE(продолжить выполнение с трассировкой), SKIP(прервать трассировку до завершения текущей цели), FINISH(немедленное согласование текущей цели) и FAIL(немедленная неудача в согласовании текущей цели).
Литература
Clark K.L., Mc-Cabe F.G. Micro-PROLOG: Programming in Logic,Prentice-Hall, 1984. [Русский перевод: Клар К., Маккейб Ф. Введение в логическое программирование на микро-Прологе.– М,; Радио и Связь, 1987.]