Недетерминированный поиск и множество успехов
Вычислитель берет альтернативы как данные, проверяет каждое значение и возвращает полное конечное множество успехов вместо одной ветви.
Как меняется вычисление, если после одного успеха сохраняются оставшиеся альтернативы?
- Представление конечного пространства поиска в виде явного списка вариантов
- Вычисление каждой альтернативы перед применением ее требования
- Сохранение каждого значения, удовлетворяющего предикату
- Перечисление комбинаций без сокрытия порядка поиска
Первый поиск получает цитированные деревья выражений. evaluate интерпретирует по одному дереву за раз, в то время как search применяет acceptable? к полученному значению и продолжает просмотр как после неудачи, так и после успеха. Никакая преждевременная фиксация не отбрасывает оставшиеся альтернативы.
Вторая программа делает явными две позиции выбора. scan-y проверяет каждый y для одного x, а scan-x повторяет эту работу для каждого x. Возврат всех пар, сумма квадратов компонентов которых равна 25, раскрывает конечный недетерминированный поиск как обычное управление, создающее списки.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (3 9). Вторая программа возвращает ((3 4) (4 3)).
В первом запуске проследите за evaluate перед каждым решением предиката и убедитесь, что при успехе рекурсия все еще продолжается по оставшимся альтернативам. Во втором запуске проследите за вложенным порядком выбора от (1 1) до (4 4) и найдите обе принятые пары.
Измените программу и сравните результат.
Измените первый предикат на even? и предскажите каждое сохраненное значение в исходном порядке альтернатив.
Показать подсказку
Сначала вычислите все четыре дерева выражений. Успешное значение не останавливает просмотр.