sicp.io
4.4.2 · Как работает система запросов

Конвейер запросов над потоком кадров

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

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

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

  • Явное представление переменной запроса в виде (var name)
  • Сопоставление шаблона с одним утверждением с расширением кадра
  • Отклонение связывания, конфликтующего с существующей записью кадра
  • Инстанцирование результирующего шаблона из успешного кадра
  • Обработка simple-query как преобразования над входными кадрами
  • Передача каждого выходного кадра из одного конъюнкта в следующий конъюнкт

pattern-match параллельно обходит шаблон запроса и утверждение. Переменная добавляет связывание при его отсутствии и требует совпадения данных, если оно уже существует. simple-query применяет этот сопоставитель к каждому утверждению для каждого входного кадра, порождая конечный список расширенных кадров. instantiate обходит результирующий шаблон и заменяет каждую связанную переменную ее значением.

qeval распознает and как конвейер. Первый запрос создает возможные связывания who для всех программистов. Второй запрос получает каждый кадр отдельно и сохраняет только тот кадр, где тот же who также руководит под началом bob. Этот урок материализует конечный поток кадров в виде списка, сохраняя протокол конвейера.

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

    Простой запрос возвращает ((job alice programmer) (job cy programmer)). Конъюнкция возвращает (alice).

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

    Для каждого утверждения проследите рекурсивный pattern-match и отметьте момент, когда who впервые добавляется в кадр. В конъюнкции сохраняйте два кадра программистов раздельно, а затем покажите, как запрос supervisor оставляет alice и отклоняет cy, поскольку существующее связывание who должно оставаться непротиворечивым.

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

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

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

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

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

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

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