Программист Prolog, у вас в крови бунт. Это качество помогает отворачиваться от индустриальных штампов, но в некоторых случаях такой бунт ведёт к дорогому и бесполезному коду. Чтобы писать великое, достаточно нескольких простых правил; их нарушение делает программы дефектными. Дефект проявляется либо в ошибочных ответах, либо в отсутствии ожидаемых решений. Хуже отсутствие решений, потому что верные ответы можно проверить, а пропущенные решения найти почти невозможно. Главная причина потери решений — использование нечистых и немонотонных конструкций вроде /0, ->/2 или var/1. Выход прост: используйте чистые структуры данных, ограничения dif/2 и мета-предикаты if_/3. Новички часто стремятся менять глобальную базу данных, используя assertz/1 и retract/1. Это создаёт скрытые зависимости, которые нарушат работу при изменении порядка вызовов. Решение — передавать состояние через аргументы предикатов или нотацию semicontext. Ещё одна ловушка — печать ответов напрямую в терминал через format вместо возврата результатов toplevel. Такой код невозможно качественно протестировать, его нельзя считать истинным отношением и он ломается при малейших изменениях. Печатайте чисто, описывая решение, а форматирование оставайте за format_//2. Отказ от современных языковых средств вроде ограничений CLP(FD) тоже дорого обходится. Низкоуровневые предикаты для арифметики (is)/2, (=:=)/2 и >/2 заставляют изучать декларативную и операционную семантику одновременно. Это мешает обучению и пониманию. Пример с рекурсивным вычислением факториала через is теряет решения при общем запросе и выдаёт ошибку instantiation_error. Даже удаление реза /0 не спасает от этой проблемы. Единственный путь к исправлению — оставаться в чистом монотонном подмножестве языка. Используйте #> и #= вместо is и >. Так программа начинает работать для всех возможных запросов, показывая все варианты, а не только один. Бунт против устаревших функций неправилен, так как жизнь не движется назад. Используйте декларативные конструкции для создания общих и эффективных программ.
Запрет assertz и вывод в терминал ломают поиск решений
17.05.2026 21:15 · hackernews