8.5. Фиксация ошибок
Если вы проследили за ходом выполнения программы и обнаружили, что она работает неверно, то вам захочется зафиксировать ошибку и запустить программу снова. Предположим, что ваша программа имеет разумные размеры, тогда она скорее всего уже хранится в файле на диске. Чтобы изменить эти файлы, вам придется использовать программу редактирования файлов. Здесь имеются две возможности:
• Ваша Пролог-система позволяет использовать редактор, а затем вернуться в Пролог с той же базой данных, что и прежде. Может быть, существует возможность сделать это прямо, с помощью соответствующего встроенного предиката. Возможен и другой вариант, когда Пролог позволяет вам сохранить текущее состояние базы данных в специальном файле, а позднее снова восстановить его. Тогда вы сохраняете ваше текущее состояние, выходите из Пролога, изменяете программу, запускаете Пролог снова и восстанавливаете предыдущее состояние базы данных. Вернувшись туда же, где вы были раньше, но с изменениями в одном или нескольких программных файлах, вам необходимо лишь выполнить предикат reconsultдля этих файлов, чтобы заменить старые определения измененных программ новыми.
• Если ваша Пролог-система не позволяет вернуться к прежнему состоянию после использования редактора и изменения ваших программных файлов, то вам придется запустить Пролог и применить предикат consultко всем вашим программным файлам, находящимся на внешней памяти.
Этот процесс можно упростить, если завести отдельный файл, состоящий из команд для Пролога, предписывающих применить предикат consultко всем файлам вашей программы. Тогда для того, чтобы считать в память всю программу, достаточно предложить Прологу применить consultк этому отдельному файлу. Например, если вы предложите Прологу применить consultк файлу, содержащему:
?- [filel,file2,file3].
?- [file4,file5,fileб].
то в результате будут считаны в память все файлы file1, file2, file3, file4, file5, file6.
Иногда изменения в программе кажутся столь незначительными, что их можно ввести с терминала с помощью предикатов consult(user)или reconsult(user). Однако не следует пользоваться этим способом слишком часто. По невнимательности можно легко забыть какие-либо мелкие изменения, которые вносились таким способом, и при выполнении программы вновь столкнуться с теми же ошибками, которые встречались при прошлом запуске программы. Кроме того, поскольку в конечном итоге вы намерены внести исправления в ваши программные файлы, то нерационально повторять их прямой ввод с терминала. Итак, не поддавайтесь искушению вводить утверждения прямо с терминала в надежде поскорее заставить программу работать.
Ниже приводится небольшой пример того, как можно использовать предикаты consultи reconsult, чтобы внести изменения в программу с терминала. Этот сеанс работы начинается, когда в базе данных программиста нет ни одного утверждения.
?- присоединить([а,b,с,d],[е],Х).
нет
?- consult (user).
присоединить([А|В],С,[А|D]):- присоединить(А,С,D).
присоединить([],Х,Х).
обр([],[]).
обр([А|В],С):- o6p(B,D), присоединить(D,[А],С).
/* ввод литеры – признак конца файла */
да
?- обр([a,b,c,d,e],X).
нет
?- присоединить([а,b,с,d,е], [f],Х).
нет
?- присоединить([],[а,b,-],Х).
X = [а,b,с]
да
?- reconsult(user)
присоединить([А|В],С,[А|D]):- присоединить(В,С,D).
/* ввод литеры – признак конца файла */
да
?- oбp([a,b,c,d],X).
нет
?- consult (user).
присоединить([],Х,Х).
/* ввод литеры – признак конца файла */
да
?- oбp([a,b,c,d,e],X). X = [e,d,c,b,a].
да
В приведенном сеансе работы наш беспечный программист начинает с ввода через терминал утверждений для предикатов
присоединитьи
обр.Конечно, он мог бы сначала ввести их в файл, а затем предложить Прологу применить к этому файлу предикат
consult.Впрочем, для такого маленького примера этого, может быть, и не стоило делать. К несчастью, в первом утверждении для
присоединитьдопущена ошибка – в цели задано
А, хотя на этом месте должно быть
В. Эта ошибка обнаруживается, когда система не может ответить на вопросы, содержащие
присоединитьи
обр.Каким-то образом программист догадывается, что