Сопоставление пролога с объединением miniKanren
В "Прологе - Программирование для искусственного интеллекта" Братко говорит следующее на странице 58.
"Сопоставление в Прологе соответствует тому, что называется объединением в логике. Однако мы избегаем слова" объединение ", потому что сопоставление по причинам эффективности в большинстве систем Пролога осуществляется способом, который не совсем соответствует объединению. Для правильного объединения требуется -проверенная проверка происходит: встречается ли данная переменная в данном термине? Проверка происходит сделает сопоставление неэффективным."
Мои вопросы: если объединение в miniKanren понесет этот штраф эффективности или как эта проблема решена?
2 ответа
Здесь есть несколько заблуждений. Во-первых, звуковая унификация доступна и в Прологе, используя предикат ISO unify_with_occurs_check/2
,
Во-вторых, это объединение звука может быть включено в некоторых системах Prolog по умолчанию для всех объединений. Смотрите, например, occurs_check
Флаг Пролог в SWI-Пролог.
В-третьих, легко создать примеры, в которых включение проверки происходит делает заказы вашей программы быстрее, чем отключение проверки.
В-четвертых, использование термина " сопоставление" для описания объединений, в которых пропущена проверка "встречается", является очень плохой идеей: сопоставление означает одностороннее объединение в функциональных языках. В Прологе объединения всегда работают во всех направлениях, даже если проверка происходит отключена.
Поэтому для части вопроса, посвященной Прологу, я настоятельно рекомендую включить проверку событий для проверки ваших программ, если ваша система Пролог поддерживает это. Обычно унификация, где требуется проверка, указывает на ошибку программирования в программах Prolog. По этой причине вы можете, например, установить флаг таким образом, чтобы система выдавала исключение, в противном случае она создала бы циклический термин.
В Прологе проверка возникновения не обязательна. В SWI Prolog вы можете глобально включить, выключить или настроить Prolog для повышения
error
когда проверка происходит успешно (что очень полезно для отладки программ, которые предназначены для запуска с отключенной проверкой возникновения)
С другой стороны, в miniKanren проверка возникновения не является обязательной.