- •IV. Версии языка пролог СиПролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда для разработки программ
- •Отладчик
- •Отладочные команды
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения языка
- •Квинтус Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Система программирования на Прологе фирмы Сайлоджик Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Пролог-2 Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Эрити Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Расширения
- •Унсв Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Турбо Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •V. Ответы к упражнениям Ответы к упражнениям
- •Глава 2
- •Глава 3
- •Глава 5
- •Глава 6
- •Глава 7
Среда для разработки программ
В СиПрологе отсутствует встроенный редактор, поэтому при разработке программ программист должен пользоваться средствами операционной системы UNIX. Обычно процесс разработки программы протекает следующим образом. Вначале программист при помощи текстового редактора, скажем, редактора "vi", записывает программу. Затем программист запускает интерпретатор СиПролога, который обрабатывает файл с программой. Если обнаружится ошибка, то программист может закончить сеанс работы с интерпретатором СиПролога, исправить программу, находящуюся в файле, при помощи редактора и снова запустить обработку файла с программой интерпретатором СиПролога. Все это, однако, может оказаться неудобным при работе с программными файлами большого размера, поскольку их обработка займет много времени. В СиПрологе есть встроенный предикат "system/I", который позволяет выполнять команды операционной системы непосредственно во время работы с интерпретатором языка Пролог. Этот предикат позволяет исправить исходный файл с помощью системного редактора, не выходя из сеанса работы с интерпретатором, например, при помощи команды:
| ?- system ("vi а.рl).
Заметьте, что команда операционной системы, являющаяся аргументом предиката "system", должна быть представлена в виде списка символов. В результате приведенного запроса начнется отдельный процесс редактирования, который "заслонит" текущий процесс — сеанс работы с интерпретатором Пролога. После того как программист закончит редактирование файла и выйдет из редактора, управление вернется к процессу, с которым связана работа интерпретатора Пролога, и интерпретатор выведет:
да
Если файл "a.pl" уже был просмотрен интерпретатором до ввода приведенного выше запроса "system", то становится необходимым повторный просмотр этого файла при помощи запроса
| ?— reconsult(' a.pl ').
При обычном двухкратном просмотре интерпретатором одного и того же файла каждая фраза из этого файла будет дважды повторяться в текущей программе. Повторный просмотр файла при помощи запроса "re-consult" позволяет избежать этого. При повторном просмотре файла по запросу "reconsult" интерпретатор проверяет каждый предикат из файла на наличие в текущей программе фраз, относящихся к этому предикату (т.е. ищет в программе фразы, обладающие тем же именем и количеством аргументов, что и предикат из файла). Если такие фразы отыскиваются, то интерпретатор удаляет все эти фразы из программы и заменяет их фразами из повторно просматриваемого файла. Таким образом, если программист изменил в файле определение фразы, то в программе новое определение займет место старого.
Для получения максимальной выгоды от использования средства "reconsult" (т.е. для минимизации затрат времени на повторный просмотр) рекомендуется организовывать программу в виде совокупности коротких файлов, а не как один большой файл.
Отладчик
Отладчик СиПролога может выдавать поясняющие сообщения в четырех точках выполняемой процедуры:
1) когда анализируется лервая фраза процедуры (сообщение "Call", т.е. "вызов");
2) когда процедура успешно выполнена (сообщение "Exit", т.е. "выход");
3) когда система возвращается назад для рассмотрения второй или следующей фразы процедуры (сообщение "Back to" — "обратно к");
4) когда система достигает конца множества фраз, определяющих процедуру (сообщение "Fail" — "неудача").
Для включения отладчика можно воспользоваться двумя методами. Если ввести команду
| ?- trace.
то отладчик станет выводить максимум отладочной информации при обработке следующего запроса, т.е. будут печататься сообщения в четырех точках каждой выполняемой процедуры. Если ввести команду
| ?— notrace.
то отладчик выключится.
Другой способ использования отладчика состоит в том, чтобы в одну или несколько процедур ввести контрольные точки (spypoints). Тогда отладчик будет автоматически включаться при вызове процедуры, в которой есть контрольная точка. Например, команда
| ?- spy connects/3.
приведет к тому, что в процедуру "connects/3" будет введена контрольная точка. Команда
| ?— nospy connects/3.
удалит эту контрольную точку.
Пример сеанса работы
Приведем пример использования отладчика для наблюдения за выполнением простой процедуры. Вопросительный знак в конце строки отладочной информации означает, что пользователь может вводить отладочную команду. В данном примере пользователь нажимает клавишу возврата каретки, а это означает, что отладчик должен продолжить печать отладочной информации с максимальным уровнем детализации.
полет (пиплз, ньюарк, релей).
полет (пиплз, релей, нэшвилл).
| ?— trace.
да
| ?- полет (пиплз, X,Y).
0 Call: полет (пиплз, __309,_324) ?
(1) 0 Exit: полет (пиплз,ньюарк,релей) ?
Х = ньюарк
Y = релей
0 Back to -.полет (пиплз, _309, _324) ?
(1) 0 Exit: полет (пиплз,релей,нэшвилл) ?
Х = релей
Y= нэшвилл;
(1) 0 Back to: полет (пиплз, _309,_324) ?
0 Fail: полет (пиплз, __309, _324) ?
нет
В сообщениях, выдаваемых отладчиком, все переменные выводятся со своими внутренними именами. Когда пользователь набирает символ ; , отказываясь от ответа, то запрос, активированный самым последним, делается неудачным, а все переменные, конкретизированные при успехе этого запроса, превращаются в неконкретизированные. Обратите внимание, что отладчик СиПролога отображает такие переменные в неконкретизированном виде, когда печатает сообщение "Back to".
Расшифровка строки отладочной информации
Строка отладочной информации:
* (1) 0 Call: полет (пиплз, _309, __324) ? несет следующие сведения:
* означает, что в настоящее время в процедуре "полет/3" установлена контрольная точка.
(1) — это уникальное обозначение конкретного вызова данной процедуры.
0 показывает количество целей — прямых предков для данной конкретной подцели. Это, к примеру, позволяет судить о глубине, которой достигла рекурсивная процедура.
Call: показывает, что это точка первоначального входа в процедуру.
полет (пиплз, _309, _324) — это сама подцель.
? — это сообщение-подсказка, означающее, что отладчик ждет ввода отладочной команды.
После включения отладчика командой "trace" или при помощи контрольной точки в конце каждой строки отладочной информации будет выдаваться данное сообщение-подсказка, свидетельствующее о возможности ввода команды. Если в ответ пользователь нажмет клавишу возврата каретки, то отладчик продолжит выдачу максимально подробной информации. Другие отладочные команды приведены ниже.