предложение:- группа_существительного, группа_глагола.
группа_существительного:- определитель, существительное.
группа_глагола:- глагол.
группа_глагола:- глагол, группа_существительного.
определитель:- 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в.
Связь введенного понятия с математической логикой обсуждается в гл. 10. - Прим. ред.
В записи программ на Прологе и в ответах Пролог-системы используются слова двух типов: 1) имена, определяемые пользователем (например, джон, книга, нравится); 2) имена и служебные слова, определенные в языке Пролог (например, is, get). Учитывая, что слова первого типа имеют некоторую смысловую нагрузку (для читателя, но не для Пролога), все они переведены на русский язык. Слова второго типа зарезервированы в языке Пролог. Поэтому в тексте они оставлены в исходном виде, за исключением переведенных на русский язык ответов Пролога на вопросы yes - да, no – нет.- Прим. перев.
В оригинале – clause for a predicate – термин, определяющий конъюнкты предиката, переменные которых связаны квантором общности. Связь этого понятия с математической логикой обсуждается в гл. 10.- Прим. ред.
В книге ничего не говорится о буквах русского алфавита. Мы будем считать, что в набор допустимых литер Пролога входят русские буквы – строчные и прописные. - Прим. ред.
Код ASCII соответствует коду КОИ-7, широко распространенному на ЭВМ нашей страны. Различие имеет место лишь для кириллицы, отсутствующей в коде ASCII. - Прим. перев.
Это могло бы привести к успеху при соответствующем определении предиката мать. - Прим. ред.
В оригинале использован термин Пролога «cut», и при переводе точнее было бы применить термин «сокращение». Однако, следуя терминологии более ранних публикаций о Прологе, мы сохраним термин «отсечение». - Прим. ред.
Модель, лежащая в основе трассировки, подробно описывается в гл. 8. - Прим. ред.
Имеется перевод: Нильсон Н. Принципы искусственного интеллекта. - М.: Радио и связь, 1985. - Прим. перев.
Имеется перевод 1-го издания: Уинстон П., Искусственный интеллект. - М.: Мир, 1980. - Прим. перев.
Имеется в виду константа в смысле Пролога. - Прим. ред.
Тем самым обеспечивает возможность вновь согласовать предикат consult. В противном случае механизм возврата никогда не смог бы миновать repeat, у которого всегда есть альтернативное решение. - Прим. ред.
На «ломаном» русском языке этот пример можно представить следующим образом: «Каждый мужчина нравится некоторая женщина».
все (X, мужчина (X)--› существует (Y, (женщина (Y) & нравится (X)))). - Прим. ред.
Имеется перевод: Мендельсон Э. Введение в математическую логику.- М.: Наука, 1971.- Прим. перев.
Имеется перевод: Чень Ч., Ли Р. Математическая логика и автоматическое доказательство теорем.- М.: Наука, 1983.- Прим. перев.
В некоторых последующих примерах допущена неточность: в формулах используется импликация, хотя все импликации должны быть удалены на первом этапе.- Прим. перев.
В дальнейшем – Пролог-10.- Прим. перев.
The MPROLOG System, SZKI, Budapest, 1986.
© SZKI, Budapest, 1986
© перевод на русский язык, «Мир», 1987
Вспомогательная информация, выдаваемая по команде help, переведена на русский язык.- Прим. ред.
Здесь допущена неточность: во входном потоке при возвратном ходе сохраняется не аааа, а то, что прочитано из него до возврата. - Прим. ред.