sicp.io
4.4.6 · Реализация системы запросов

Унификация, переименование правил и бюджет глубины

Двунаправленная унификация, переименование переменных правил, поиск утверждений, конъюнкция, дизъюнкция, отрицание как неудача и бюджет глубины.

Вопрос для размышления

Какие дополнительные механизмы позволяют сопоставлять запрос не только с сохраненными фактами, но и с выводами, полученными из переиспользуемых правил?

  • Унификация переменных, появляющихся по обе стороны сравнения
  • Переход по существующему связыванию переменной перед расширением кадра
  • Переименование каждой переменной правила для каждого применения
  • Применение правила путем унификации его заключения и вычисления его тела
  • Комбинирование and, or и конечного отрицания как неудачи над списками кадров
  • Ограничение рекурсивного применения правил явной оставшейся глубиной

unify-match обобщает простое сопоставление с утверждениями. Любой входной элемент может быть переменной, а существующее связывание может вести к другой переменной или структуре до завершения сравнения. Перед каждым применением правила rename-rule заменяет каждую логическую переменную новым ключом с текущим идентификатором применения правила. Это предотвращает конфликт внутренних промежуточных имен правила с переменными запроса или другим применением того же правила.

simple-query объединяет прямые совпадения с утверждениями и результаты правил. Результат правила унифицирует шаблон запроса с переименованным заключением, затем передает полученный кадр через qeval в тело правила. and передает кадры по конвейеру, or объединяет альтернативы, а not сохраняет кадр только тогда, когда его подзапрос не дает результата в этом кадре. Явная глубина служит точной конечной границей ресурсов для раскрытия правил.

Код SICP6,009 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Движок возвращает (((grandchild carol) (grandchild dave)) (dave) 2).

    На что обратить внимание в трассе

    Проследите путь шаблона запроса к прямому сопоставлению с утверждениями, а затем к каждому переименованному заключению правила. Проверьте новые ключи переменных перед тем, как тело grandparent поступит в conjoin. Для запроса parent с отрицанием покажите, почему carol отклоняется, а dave сохраняется. Убедитесь, что обе ветви or начинаются с одного и того же пустого входного кадра.

    Попробуйте сами

    Измените программу и сравните результат.

    Добавьте правило ancestor с прямым предложением parent и рекурсивным предложением. Запустите его с depth 4 и depth 1, выведите ответы раздельно и объясните, как бюджет работы определяет границу результатов.

    Показать подсказку

    Используйте два правила с одинаковым заключением ancestor. Рекурсивное тело должно вводить одну новую промежуточную переменную и вызывать ancestor с оставшимся бюджетом глубины.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%