sicp.io
4.4.1 · Запросы на основе правил

Правило как цепочка меньших целей

Вычислитель запросов просматривает утверждения, раскрывает правило и передает каждый полученный кадр от одной цели тела правила к следующей.

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

Как правило сохраняет промежуточное связывание, необходимое для его следующей цели?

  • Представление фактов, запросов, переменных и правила в виде цитированных данных
  • Возврат одного кадра связываний для каждого совпадающего утверждения
  • Раскрытие заголовка правила в упорядоченную последовательность целей тела
  • Передача каждого успешного кадра в следующую цель

Первая программа сравнивает предикат parent и фиксированную позицию ada с каждым утверждением. Каждое совпадение возвращает кадр, содержащий одно связывание child. Процедура scan-assertions доходит до конца конечного списка фактов, поэтому оба совпадающих кадра остаются в порядке утверждений.

Вторая программа связывает grand из заголовка правила, затем solve-goals обрабатывает две цели parent по порядку. Первая цель дает промежуточные значения ben и dia. Каждый кадр становится входными данными для второй цели, которая находит cy и eli. Вычислитель урока обрабатывает прямые факты parent и одно упорядоченное тело правила parent, сохраняя каждый промежуточный кадр.

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

    Просмотр утверждений возвращает (((child . ben)) ((child . dia))). Раскрытие правила возвращает (cy eli).

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

    В первом запуске проследите за каждым сравнением утверждений и двумя расширениями кадра для child. Во втором запуске проследите за связыванием grand в первой цели, затем убедитесь, что промежуточные кадры ben и dia передаются во вторую цель перед тем, как child станет cy или eli. Трассы выполнения фиксируют точный просмотр базы данных и упорядоченное вычисление тела правила.

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

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

    Добавьте (parent cy fox), затем измените второй запрос на (grandparent ben (var who)). Предскажите возвращаемый ответ.

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

    Первая цель связывает middle с cy, а новый факт позволяет второй цели связать child с fox.

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

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