Шрифт:
После завершения указанных выше действий пользователь может запросить другие действия. Предикаты continueи failпродолжают приостановленное выполнение программы так, как если бы вместо особой ситуации имела место согласованность или несогласованность цели с базой данных. В данном случае ввод fприводит к ответу NO.
Однако систему МПролог можно заставить вести себя так, как Пролог-система, описанная в книге. Для этого достаточно в качестве обработчика особой ситуации для undefined predicateзадать целевое утверждение fail:
*?- 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. При этом система предупреждает пользователя о возможности утраты модулей, которые не были записаны в файлы.