printЛогическое программирование

printОтладка программ на языке Пролог

Чтобы писать программы, которые легко читать, понимать, отлаживать и модифицировать, нужно придерживаться следующих правил.
  • Предложения для одного предиката нужно группировать вместе, разделяя определения пустой строкой.
  • Каждое предложение нужно начинать с первой позиции и делать отступ для частей предложения, не поместившихся в одной строке.
  • Предложения должны быть по возможности короткими.
  • Имена предикатов и переменных должны отражать их назначение.
  • Предикаты !, \+, asserta/z и retract следует применять с осторожностью.
  • Число дизъюнкций в программе следует уменьшать, разделяя правила на несколько предложений или вводя новые предикаты.
  • Комментарии должны отражать все возможные способы использования предиката, какие аргументы должны быть конкретизированы, какой тип значений допустим, какие аргументы являются выходными.
  • В первых предложениях определения должны анализироваться частные случаи применения предиката, а первые цели в теле правила должны проверять наиболее простые отношения.
После написания программы рекомендуется:
  • проверить, что в конце каждого предложения стоит точка;
  • проверить имена и количество аргументов у каждого предиката, включая встроенные, так как неверное имя или пропущенный аргумент дает заведомо неуспешную цель;
  • проверить введенные операторы, их приоритет и ассоциативность, используя display, в сложных случаях поставить скобки.
К наиболее типичным ошибкам при разработке программ на языке Пролог можно отнести следующие ошибки.
  • После создания или изменения программы не выполняется ее преобразование во внутреннее представление с помощью consult.
  • Программа содержит циклические рекурсивные определения, которые требуют согласования цели, эквивалентной исходной, и часто связаны с левосторонней рекурсией.
  • Рассмотрены не все случаи для завершения рекурсии или указаны неправильные условия.
  • Указано неверное количество аргументов у функтора, что приведет к неудаче при поиске правила для обработки структуры.
Результатом применения программ, содержащих ошибки, обычно является зацикливание или переполнение стека, отрицательные ответы или конкретизация переменных не теми ответами, которые ожидались.
Для отладки программ применяется трассировка. В процессе выполнения программ на языке Пролог могут происходить следующие 4 события (рис. 3).
15147.png
Событие CALL фиксирует начало попытки Пролога согласовать цель с БД. Печатается цель.
Событие EXIT фиксирует момент, когда некоторая цель только что согласована с БД. Печатается согласованная цель.
Событие REDO фиксирует момент, когда система возвращается к цели, пытаясь повторно согласовать ее с БД. Печатается согласованная цель.
Событие FAIL фиксирует момент, когда попытка согласовать цель с БД заканчивается неудачно. Печатается цель.
Режим трассировки включается с помощью предиката trace, а выключается notrace. При наступлении события Пролог печатает цель и ожидает ввода команды. Можно ввести одну из следующих команд:
h[elp] – помощь;
с[reep] или Enter – идти к следующему событию;
s[kip] – не останавливаться до наступления события EXIT или FAIL для текущей цели (рекомендуется использовать для уже отлаженных предикатов);
a[bort] – завершить выполнение программы.
В Прологе существуют также другие команды и дополнительные предикаты для отладки по контрольным точкам.
loading