Главная arrow книги arrow Копия Глава 9. Логический вывод в логике первого п arrow Хранение и выборка
Хранение и выборка

В основе функций Tell и Ask, применяемых для ввода информации и передачи запросов в базу знаний, лежат более примитивные функции Store и Fetch. Функция Store (s) сохраняет некоторое высказывание s в базе знаний, а функция Fetch (g) возвращает все унификаторы, такие, что запрос д унифицируется с некоторым высказыванием из базы знаний. Описанная выше задача, служившая для иллюстрации процесса унификации (поиск всех фактов, которые унифицируются с высказыванием Knows (John ,x)), представляет собой пример применения функции Fetch.

Проще всего можно реализовать функции Store и Fetch, предусмотрев хранение всех фактов базы знаний в виде одного длинного списка, чтобы затем, после получения запроса д, можно было просто вызывать алгоритм Unify (g, s) для каждого высказывания s в списке. Такой процесс является неэффективным, но он осуществим, и знать об этом — это все, что нужно для понимания последней части данной главы. А в оставшейся части данного раздела описаны способы, позволяющие обеспечить более эффективную выборку, и он может быть пропущен при первом чтении.

Функцию Fetch можно сделать более эффективной, обеспечив, чтобы попытки унификации применялись только к высказываниям, имеющим определенный шанс на унификацию. Например, нет смысла пытаться унифицировать Knows {John ,х) и Brother (Richard, John). Такой унификации можно избежать, индексируя факты в базе знаний. Самая простая схема, называемая индексацией по предикатам, предусматривает размещение всех фактов Knows в одном сегменте, а всех фактов Brother— в другом. Сами сегменты для повышения эффективности доступа можно хранить в хэш-таблице.

Индексация по предикатам является удобной, когда имеется очень много предикатных символов, но лишь небольшое количество выражений в расчете на каждый символ. Однако в некоторых приложениях имеется много выражений в расчете на каждый конкретный предикатный символ. Например, предположим, что налоговые органы желают следить за тем, кто кого нанимает, с использованием предиката Employs {х, у). Такой сегмент, возможно, состоящий из миллионов нанимателей и десятков миллионов наемных работников, был бы очень большим. Для поиска ответа на такой запрос, как Employs {x, Richard) ("Кто является нанимателем Ричарда?"), при использовании индексации по предикатам потребовался бы просмотр всего сегмента.