Рекурсивные правила и видимая граница поиска
Запрос предков многократно раскрывает факты о родителях, а вычислитель сообщает, завершил ли явный бюджет работы поиск или прервал его досрочно.
Как рекурсивное раскрытие правил может корректно завершаться, если данные могут содержать цикл?
- Разделение прямого предложения parent и рекурсивного предложения ancestor
- Перенос видимой границы ожидающих субъектов через поиск
- Использование одной явной единицы работы для каждого раскрытия границы
- Отличие полного результата от результата, усеченного по границе
- Наблюдение повторяющихся ответов при поиске по циклическим данным без удаления дубликатов
Первая программа задает для ancestor два предложения в процедурной форме. Каждый child текущего человека является прямым ответом, и каждый child также помещается в frontier, чтобы то же правило могло искать на одно поколение дальше. Поскольку факты конечны и ацикличны, frontier становится пустым до исчерпания бюджета работы в десять единиц, а результат помечается как complete.
Вторая программа использует цикл из трех человек. Раскрытие ada достигает ben, ben достигает cy, а cy снова достигает ada. Вычислитель тратит ровно одну единицу работы на каждый извлеченный элемент frontier и возвращает truncated с оставшимся frontier, когда бюджет достигает нуля. Эта модель урока для поиска в ширину охватывает раскрытие parent, явный frontier, повторяющиеся ответы и статус complete или truncated.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Ациклический поиск возвращает (complete (ben eli cy fox dia) () 4). Циклический поиск возвращает (truncated (ben cy ada ben cy) (cy) 0).
Проследите за каждым car в frontier, конечным просмотром фактов, который дает его потомков, операцией append, ставящей этих потомков в очередь, и уменьшением бюджета на одну единицу. В запуске со статусом complete frontier опустошается при четырех оставшихся единицах. В циклическом запуске ada появляется снова до того, как бюджет достигает нуля, а cy остается в ожидании, когда результат помечается как truncated.
Измените программу и сравните результат.
Запустите ациклический поиск с ограничением работы в 2 единицы. Перед выполнением предскажите префикс ответа, оставшийся frontier и статус.
Показать подсказку
Первое раскрытие ставит в очередь ben и eli. Второе раскрытие удаляет ben и ставит cy в очередь за eli.