В Прологе - Программирование искусственного интеллекта, Братко говорит следующее на странице 58.Пролог согласование против объединения miniKanren
«Matching в Прологе соответствует тому, что называется объединение в логике Однако, мы избегаем слов унификации, потому что соответствие. , по соображениям эффективности в большинстве систем Prolog реализуется таким образом, который точно не соответствует унификации. Надлежащая унификация требует так называемой проверки на наличие: возникает ли данная переменная в данном термине? Проверка на происшествие сделает совпадение неэффективным «.
Мои вопросы: если унификация в miniKanren страдает от этого снижения эффективности или как эта проблема решена?
«Объединение, где происходит проверка, указывает на ошибку программирования»: вы можете быть более явным в этой точке. Мне все еще нужно увидеть хороший практический пример кода Пролога, который требует циклических терминов. Вы знаете о таких примерах? –
Связанный с этим вопрос: можете ли вы показать или связать с реалистичными примерами, где происходит проверка, делает программу более быстрой, соответственно. помедленнее? Я должен признать, что я никогда не пытался использовать циклические термины и просто использовал унификацию ванили (без проверки), потому что я предполагал, что это не имеет значения. –
Я когда-то видел гениальное применение циклических терминов Стефаном Кралом, где он использовал циклические термины для представления бесконечной ленты машины Тьюринга (первоначально заполненной «0»), начиная с «Tape = [0 | Tape]», и исходя из этого. Для реалистичного примера, который работает в сотни раз быстрее * с проверкой * происходит, см. Ульрих Ноймеркель на al. «[Расширения декларативных языков для курсов Prolog] (http://www.complang.tuwien.ac.at/ulrich/papers/PDF/2008-fdpe.pdf)». – mat