Эти предикаты обеспечивают дополнительные возможности для задания грамматических правил. Например, правила, приведенные в разд. 9.3, могут быть непосредственно преобразованы в следующие предикаты:
предложение:- группа_существительного, группа_глагола.
группа_существительного:- определитель, существительное.
группа_глагола:- глагол.
группа_глагола:- глагол, группа_существительного.
определитель:- insymb(the).
существительное:- insymb(man).
существительное:- insymb(apple).
глагол:- insymb(eats).
глагол:- insymb(sings).
Приведенный выше предикат предложениезавершается успешно, если из входного потока поступает предложение, удовлетворяющее заданной грамматике. Заметим, что обработка синтаксических ошибок и команда '=' реализуются на основе предикатов ввода, допускающих повторное согласование при возврате. Предикаты для работы с базой данных в МПрологе также имеют версии, допускающие повторное согласование. Например,
fdelclause(EXPR)
исключает первое утверждение, заголовок которого может быть сопоставлен с EXPR,тогда как
fsupclause(EXPR)
только подавляет его. Это означает, что при возвратном ходе это утверждение возвращается на свое место. С помощью этого предиката можно, например, по-другому определить предикат перейтииз разд. 7.2:
перейти(X,X).
перейти(X,X):- в_след_комн(Х,Z), перейти(Z,Y).
в_след_комн(Х,Z):- fsupclause(d(X,Z)); fsupclause(d(Z,X)).
Здесь нам уже не нужен вспомогательный третий аргумент (содержащий список комнат, где мы уже бывали). Вместо этого, чтобы быть уверенным в том, что в каждую дверь мы входим только один раз, мы просто подавляем на период поиска факты, соответствующие дверям, через которые мы уже прошли.
Имеется большой набор предикатов вывода, позволяющий осуществлять разнообразные виды форматированного вывода. Например, можно задавать границы строк и предельную глубину вывода. Задание глубины вывода полезно при выводе очень сложных термов (или даже бесконечных термов поскольку в МПрологе соответствующих проверок не делается), когда нас интересует только их общая структура. Задание глубины вывода равной Nозначает, что фактически выводиться будут только первые Nуровней терма, а подтермы уровня N+1будут представлены как (…).
Предикаты обработки особых ситуаций МПролога позволяют программисту самому программировать действия по восстановлению при ошибках. Например, ниже представлен простой вариант средства 'спроси у пользователя', позволяющего запросить у пользователя указания, как продолжать выполнение, если встретился неопределенный предикат.
ask_the_user:- broken _call(С), outterm("How to continue from: "), outterm(C), outterm("?"), nl, interm(C), ineot.
где broken_call(С)- это стандартный предикат, конкретизирующий переменную С ошибочным целевым утверждением. Выполнив целевое утверждение
newhandler("undefined predicate", ask_the_user)
система будет вызывать ask_the_user(спроси_у_пользователя) всякий раз, когда что-либо окажется неопределенным. Например, определив предикаты плотностьи наскак в разд. 2.5, но оставив неопределенным предикат площадь:
плотность(X,Y):- нас(X,Р), площадь(X,A), Y is P/A.
нас(китай,800).
. . .
мы можем наблюдать следующий диалог:
*? плотность(китай,D).
How to continue from площадь(китай,_101)?
* площадь(китай,4).
D = 200
Continue (y/n)?
* y
NO
*? плотность(китай,D).
How to continue from площадь(китай,_101)?
* n.
NO
Другой важный встроенный предикат – это error_protect (Call, Handler),который выполняет целевое утверждение Callв защищенном окружении: когда внутри Callвозникает особая ситуация (не обрабатываемая текущим обработчиком особых ситуаций), выполняется Handler.
Средства отладки
Средства трассировки МПролога аналогичны тем, что имеются в Прологе-10.
Литература
MPROLOG Language Reference Manual
MPROLOG User's Guide /VAX/11-VMS/ MPROLOG User's Guide /VAX/11 – UNIX/ MPROLOG User's Guide /IBM – VM/CMS/ MPROLOG User's Guide /Siemens BS2000/
Getting Started with MPROLOG
Указанная литература может быть получена через институт по координации вычислительной техники (SZKI), г. Будапешт, ВНР .
В книге термин «Пролог» употребляется в трех значениях: 1) Пролог – язык программирования с совокупностью синтаксических и семантических правил записи программ; 2) Пролог – программная система (интерпретатор), реализующая язык; эта система и осуществляет диалог с пользователем; 3) Пролог – машина, на которой Пролог-система выполняет (интерпретирует) программы, написанные на языке Пролог. Как правило, из контекста всегда ясно, какое значение используется в каждом конкретном случае. При необходимости явного указания при переводе использовались термины: «язык Пролог», «Пролог-система», «Пролог-машина». - Прим. пepeв.
Читать дальше