Сопоставление с образцом и кадр связываний
Переменная образца расширяет явный кадр при первой встрече, а затем требует то же самое значение при каждом повторном появлении этой переменной.
Как сопоставитель может переносить частичное знание при обходе двух структур данных?
- Представление переменных образца в виде явных данных списка
- Хранение связываний переменных в кадре на основе ассоциативного списка
- Рекурсивное сопоставление структуры пар слева направо
- Отклонение повторяющейся переменной при конфликте ее значений
Форма (? who) представляет переменную образца, а не литеральный список. При первом появлении extend-if-consistent добавляет who и совпадающие данные в кадр. Обычные символы и структура пар должны сопоставляться напрямую.
При последующем появлении выполняется поиск существующего связывания перед любым расширением. Одинаковые данные сохраняют кадр, а конфликтующие данные возвращают failed, что распространяется на все оставшиеся рекурсивные шаги. Это одностороннее сопоставление с переменными в образце, а не полная двунаправленная унификация или поиск по базе данных.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (bob alice). Вторая программа возвращает (apple failed).
Проследите за рекурсивным сопоставлением car перед сопоставлением cdr, затем найдите каждое расширение кадра. Во втором запуске проследите, как поиск второго элемента один раз сохраняет кадр со значением apple и возвращает failed для pear. Трассы выполнения фиксируют одностороннее сопоставление с образцом и каждое расширение кадра.
Измените программу и сравните результат.
Измените первый образец на (parent (? person) (? person)). Перед запуском предскажите результат для (parent bob alice).
Показать подсказку
Второе появление должно быть равно значению, сохраненному при первом появлении.