Хранение и выборка

В основе функций Tell и Ask, применяемых для ввода информации и передачи запросов в базу знаний, лежат более примитивные функции Store и Fetch. Функция Store (s) сохраняет некоторое высказывание s в базе знаний, а функция Fetch (g) возвращает все унификаторы, такие, что запрос g унифицируется с некоторым высказыванием из базы знаний. Описанная выше задача, служившая для иллюстрации процесса унификации (поиск всех фактов, которые унифицируются с высказыванием Knows (John, х)), представляет собой пример применения функции Fetch.
Проще всего можно реализовать функции Store и Fetch, предусмотрев хранение всех фактов базы знаний в виде одного длинного списка, чтобы затем, после получения запроса д, можно было просто вызывать алгоритм Unify(д, s) для каждого высказывания s в списке. Такой процесс является неэффективным, но он осуществим, и знать об этом — это все, что нужно для понимания последней части данной главы. А в оставшейся части данного раздела описаны способы, позволяющие обеспечить более эффективную выборку, и он может быть пропущен при первом чтении.
Функцию Fetch можно сделать более эффективной, обеспечив, чтобы попытки унификации применялись только к высказываниям, имеющим определенный шанс на унификацию. Например, нет смысла пытаться унифицировать Knows (John, х) и Brother (Richard, John). Такой унификации можно избежать, индексируя факты в базе знаний. Самая простая схема, называемая индексацией по предикатам, предусматривает размещение всех фактов Knows в одном сегменте, а всех фактов Brother — в другом. Сами сегменты для повышения эффективности доступа можно хранить в хэш-таблице.
Индексация по предикатам является удобной, когда имеется очень много предикатных символов, но лишь небольшое количество выражений в расчете на каждый символ. Однако в некоторых приложениях имеется много выражений в расчете на каждый конкретный предикатный символ. Например, предположим, что налоговые органы желают следить за тем, кто кого нанимает, с использованием предиката Employs {х, у). Такой сегмент, возможно, состоящий из миллионов нанимателей и десятков миллионов наемных работников, был бы очень большим. Для поиска ответа на такой запрос, как Employs (х, Richard) ("Кто является нанимателем Ричарда?"), при использовании индексации по предикатам потребовался бы просмотр всего сегмента.
Поиск ответа на данный конкретный запрос стал бы проще при использовании индексации фактов и по предикату, и по второму параметру, возможно, с использованием комбинированного ключа хэш-таблицы. В таком случае существовала бы возможность просто формировать ключ из запроса и осуществлять выборку именно тех фактов, которые унифицируются с этим запросом. А для ответа на другие запросы, такие как Employs (AIMA. org, у), нужно было бы индексировать факты, комбинируя предикат с первым параметром. Поэтому факты могут храниться под разными индексными ключами, что позволяет моментально сделать их доступными для разных запросов, с которыми они могли бы унифицироваться.
Если дано некоторое высказывание, которое подлежит хранению, то появляется возможность сформировать индексы для всех возможных запросов, которые унифицируются с ними. Применительно к факту Employs (AIMA. org, Richard) возможны следующие запросы:
Employs(AIMA.org,Richard) Является ли организация AIMA.org







Материалы

Яндекс.Метрика