Программирование на языке пролог
Шрифт:
После завершения указанных выше действий пользователь может запросить другие действия. Предикаты continueи failпродолжают приостановленное выполнение программы так, как если бы вместо особой ситуации имела место согласованность или несогласованность цели с базой данных. В данном случае ввод fприводит к ответу NO.
Однако систему МПролог можно заставить вести себя так, как Пролог-система, описанная в книге. Для этого достаточно в качестве обработчика особой ситуации
*?- newhandler("undefined predicate",fail).
Yes
*?- likes(X,Y).
No
Будем считать, что файл testсодержит ту же самую последовательность утверждений, что и в предыдущих приложениях. Тогда мы можем считать содержащиеся в нем утверждения в базу данных. При этом, если параметр auotostateне в состоянии «off» (выключено), то будет выводиться функтор (т. е. имя/число аргументов) читаемых из файла предикатов.
*?- [test]. likes/2
Yes
*?- listing(likes/2).
likes(john,alfred).
likes(alfredjohn).
likes(bertrandjohn).
likes(david,bertrand).
likes(john,ANYBODY): – likes(ANYBODY,bertrand).
Yes
Переменные (в данном случае ANYBODY)записаны прописными буквами как в Прологе-10. Однако в МПрологе предусмотрена особая возможность сохранения символьных имен переменных в пользовательской программе.
Альтернативным способом вывода заданного предиката или некоторых из определяющих его утверждений является использование команды type:
* type likes/2
likes(john,alfred).
likes(alfred,john).
likes(bertrand,john).
likes(david,bertrand).
likes(john,ANYBODY):- likes(ANYBODY,bertrand).
Второе и четвертое утверждения данного предиката можно просмотреть с помощью команды;
* type likes / 2 CL (2,4)
likes(alfred, john).
likes(david,bertrand).
А все утверждения, включающие bertrandвыбираются следующим образом:
* type likes / 2 CL (bertrand)
likes(bertrand, john).
likes(david,bertrand).
likes(john,ANYBODY):- likes(ANYBODY,bertrand).
Получение альтернативных решений для целевого утверждения осуществляется немного иначе, чем в Прологе-10:
*?- likes(john,Who).
WHO = alfred Continue (y/n)?
* y
WHO = david Continue (y/n)?
* у
NO
Новые утверждения можно добавлять как с помощью команды enter,так и путем чтения псевдо-файла user(как в Прологе-10):
*?- [user].
likes(timothy,bertrand).
likes/2+6
* bye
Yes
Команда ввода вопроса (?-) не выдает сведений о времени его выполнения. Эту информацию можно получить путем задания команды execute (в краткой форме ':'):
* :likes(john,X).
(*** CPU time: 0.27 sec, 1 calls, 0 backtracks ***)
Подсистема PDSS гибко реагирует на синтаксические ошибки. В стандартном режиме при возникновении такой ошибки пользователю предоставляется выбор: отредактировать ошибочное утверждение или выполнить целевое утверждение:
*?- likes(john,ann)). full stop expected at) Enter the editor (y/n)?
* y
10: likes(john,ann))
*** Enter editor commands
* 10: likes(john,ann)
*** Line 10 replaced ***
* end NO
Команда endзакрывает цикл редактирования. Затем делается попытка согласовать отредактированную цель, и в результате получается ответ NO.
Тот же метод применим и в случае чтения файла в базу данных: ошибочные утверждения могут быть отредактированы, а затем процесс чтения файла продолжается.
Сеанс работы с PDSS завершается по команде bye. При этом система предупреждает пользователя о возможности утраты модулей, которые не были записаны в файлы.
* bye
*** The following module(s) have not been saved: ***
first Do you want to exit (y/n)?
*y
Normal exit from MPROLOG PDSS
Синтаксис МПролога в основном совместим с синтаксисом Пролога-10. Правда, позиции операторов, их приоритеты и ассоциативность в МПрологе отличаются, однако, для обеспечения совместимости с тем, что описано в данной книге, предусмотрен встроенный предикат ор. Списки можно задавать как с помощью точечной записи (используя для этого предварительно описанный оператор '.'), так и с помощью скобочной записи [].
Строки в МПрологе не эквивалентны списку кодов, составляющих их литер. Это означает, что пример из гл. 5 (база данных исторических событий) с вопросом событие(1524,Х)будет работать и ответом будет 'Васко да Гама умер'.
В самом языке и в системе разработки программ предусмотрены средства модульного построения программ. МПролог-программа может состоять из нескольких модулей, которые взаимодействуют между собой только через заданные интерфейсы модулей.