
4.4. Логическое программирование
427
Теперь система ок азалась в бесконечном цикле. В сущности, найдет ли сис тема про-
стой ответ (супруг Минни Микки) прежде, чем окажется в цикле, зависит от деталей
реализации, связанных с порядком, в котором система проверяет записи базы данных.
Это простой пример циклов, которые могут возникнуть. Наборы взаимосвязанных пра-
вил могут привести к циклам, которые значительно труднее предвидеть, а возн икновение
цикла может зависеть от порядка подвыражений в and (см. упраж нение 4.64) или от
низкоуровневых деталей, связанных с порядком обработки запросов в системе
77
.
Проблемы с not
Еще одна особенность запросной системы связана с not. Рассмотрим следующие два
запроса к базе данных из раздела 4.4.1:
(and (начальник ?x ?y)
(not (должность ?x (компьютеры программист))))
(and (not (должность ?x (компьютеры программист)))
(начальник ?x ?y))
Эти два запроса приводят к различным результатам. Первый запрос сначала находит все
записи в базе данных, соответствующие образцу (начальник ?x ?y), затем филь-
трует полученные кадры, удаляя те, в которых значение ?x удовлетворяет образцу
(должность ?x (компьютеры программист)). Второй запрос сначала фильтрует
входные кадры, пытаясь удалить те, которые удовлетворяют образцу (должность ?x
(компьютеры программист)). Поскольку единственный входной кадр пуст, он про-
веряет базу данных и смотрит, есть ли там записи, соответствующие (должность ?x
(компьютеры программист)). Поскольку, как правило, такие записи имеются, выра-
жение not удаляет пустой кадр, и остается пустой поток кадров. Следовательно, весь
составной з апрос также возвращае т пус той поток.
Сложность состоит в том, что наша реал изация not предназначена только для того,
чтобы служить фильтром для значений переменных. Если выражение not обрабатыва-
ется с кадром, в котором часть переменных остается несвязанными (как ?x в нашем
примере), система выдаст неверный результат. Подобные сложности возникают и с ис-
пользованием lisp-value — предикат Лиспа не сможет работать, если часть из его
аргументов несвязана. См. упражнение 4.77.
Есть еще один, значительно более серьезный аспект, в котором not языка запросов
отличается от отрицания в математической логике . В логике мы считаем, что выражение
«не P» означает, что P ложно. Однако в системе запросов «не P » означает, что P невоз-
можно доказать на основе информации из базы данных. Например, имея базу данных
77
Это проблема не собственно логики , а процедурной интерпретации логики, которую дает наш интерпрета-
тор. В данном случае можно написать и нтерпретатор, который не попадет в цикл. Например, можно прону-
меровать доказательства, выводимые из наших утверждений и правил, по ширине, а не по глубине. Однако в
такой системе оказывается труднее использовать порядок правил в программах. Одна из попыток встроить в
такую программу тонкое управление вычислениями описана в deKleer et al. 1977. Еще один метод, который не
ведет к столь же сложным проблемам с управлением, состоит в добавлении специальн ых знаний, например, де-
текторов для каких-то типов циклов (см. упражнение 4 .67). Однако общую схему надежного предотвращения
бесконечных путей в рассуждениях построить невозмож но. Представьте себе дьявольское правило вида «чтобы
доказать истинность P (x), докажите истинность P (f(x))» для какой-нибудь хитро выбранной функции f.