sicp.io
4.3.2 · Реализация вычислителя amb

Вычислитель amb и продолжение неудачи

Вычислитель передает продолжения успеха и неудачи. Amb хранит оставшиеся варианты в пути неудачи, а require вызывает его при нарушении ограничения.

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

Как вычислитель может превратить неудачу из фатальной ошибки в запрос на возобновление работы с предыдущей точки выбора?

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

Процедура ambeval принимает expression, environment, succeed и fail. Детерминированное выражение вызывает succeed со своим значением и с продолжением неудачи, которое следует использовать, если последующая работа отклонит это значение. Форма amb вычисляет свой первый вариант и заменяет неудачу процедурой, проверяющей оставшиеся варианты. Вычисление операндов передает эти продолжения слева направо, поэтому неудача внутри тела процедуры может вернуться к более раннему недетерминированному аргументу.

Форма require вычисляет свой предикат в той же системе продолжений. Истинный предикат завершается успехом со значением ok, а ложный предикат вызывает следующую альтернативу предиката, которая в итоге возвращается к самому последнему выбору amb. Процедура all-values повторно вызывает следующую альтернативу, предоставляемую каждым успехом. Первый запуск исчерпывает выбранный конечный поиск и сообщает complete. Второй запуск намеренно останавливается после четырех решений и сообщает truncated. Учебный вычислитель охватывает упорядоченные варианты amb, форму require, применение процедур и передачу продолжений успеха или неудачи.

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

    Поиск пар возвращает (complete ((1 4) (2 3))). Поиск троек с ограничением возвращает (truncated ((1 2 3) (1 2 4) (1 2 5) (1 3 4))).

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

    Проследите за тем, как каждый выбор amb устанавливает продолжение неудачи для оставшихся вариантов. Затем проследите за get-arguments, когда отклоненный require в теле поочередно возобновляет следующий третий аргумент, следующий второй аргумент или следующий первый аргумент. Поиск останавливается, когда исчерпывает свои варианты или достигает установленного предела решений.

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

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

    Измените программу для пар так, чтобы переменные left и right выбирались от 1 до 6, потребуйте через require равенства их произведения 12 и соберите все решения, в которых left меньше. Спрогнозируйте порядок решений перед запуском.

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

    Порядок amb слева направо проверяет все варианты right для left 1 перед переходом к left 2. Только упорядоченные пары множителей проходят обе формы require.

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

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