- •Таганрог 2001
- •Содержание
- •Введение
- •1. Принципы логического программирования
- •1.1. Базовые понятия
- •1.2. Терминология
- •1.3. Сложные термы, или структуры
- •1.4. Синтаксис строк
- •1.5. Утверждения
- •1.6. Запросы
- •1.7. Ввод программ
- •1.8. Унификация
- •1.9. Арифметические выражения
- •1.10. Вычисление арифметических выражений
- •1.11. Сравнение результатов арифметических выражений
- •Контрольные вопросы и упражнения
- •2. Структуры данных на языке пролог
- •2.1. Списки
- •2.2. Бинарные деревья
- •2.3. Механизм возврата и процедурная семантика
- •3. Представление моделей знаний
- •3.1. Процесс представления знаний
- •3.2. Семантические сети
- •3.3. Фреймы
- •3.4. Механизм наследования в Прологе
- •3.5. Создание динамических баз данных
- •3.6. Представление задач в виде и/или – графов
- •4. Экспертные системы
- •4.1. Системы экспертных консультаций
- •Этап идентификации
- •Этап концептуализации
- •Этап формализации
- •Этап выполнения
- •Этап тестирования
- •Этап опытной эксплуатации
- •Экспертные системы, параллельные и последовательные решения
- •Пример эс, основанной на правилах логического вывода и действующую в обратном порядке
- •Часть 1.
- •Часть 2.
- •Часть 3.
- •Часть 4.
- •Часть 5.
- •4.2. Запоминание пути вывода
- •5. Пример задачи на представление знаний
- •6. Заключение
- •Литература
- •Представление знаний и логическое программирование в системах искусственного интеллекта Учебное пособие
3.2. Семантические сети
Рассмотрим принцип организации семантических сетей [4]. В семантической сети сущности и классы сущностей ассоциируются с узлами, а отношения между сущностями ассоциируются с дугами, соединяющими узлы. Дуга, подсоединенная к единственному узлу, устанавливает свойство этого узла. Семантическая сеть позволяет выполнять вывод но цепочкам, описываемым определенными типами дуг. Например, в сети, изображенной на рис. 3.2, узел «мероприятие» обладает свойством «проводится». Узел «собрание» соединен дугой с узлом «мероприятие», поэтому можно прийти к выводу о том, что узел «собрание» также обладает свойством «проводится».
Важнейшей концепцией формализма семантических сетей является иерархия, поэтому данный формализм особенно удобен для представления таксономий знаний. Каждый уровень таксономии представляется в виде узла, который соединен дугами "является" с более высокими и более низкими уровнями. К примеру, на рис. 3.2 «мероприятие» - это наивысший уровень таксономии, а на следующем уровне могут располагаться различные виды мероприятий.
Мероприятия
проводится
является
место назначения
является
присутствуют
Рис. 3.2
Если рассматривать семантическую сеть как описание отношений, которые поддерживаются между сущностями, то ее можно непосредственно реализовать при помощи языка Пролог. Нижеследующая программа выражает структуру сети с «мероприятиями», представленную на рис. 3.2:
является (собрание, мероприятие).
является (собрание_38, собрание).
присутствуют(роман, собрание_38).
проводится (мероприятие).
проводится (X ) :- является ( X, Y ) , проводится ( Y ).
назначается_в (X,Y) :- является (X, Z), назначается_в (Z, Y).
Вторая фраза "назначается_в" позволяет сделать вывод о том, что «собрание_38» назначается в зале заседаний, так как «собрание_38» - это собрание, а любая сущность, которая является собранием, назначается в зале заседаний. Вывод можно выполнить в любом месте, где два узла диаграммы связаны дугой "является". Дуга "является" представляет либо отношение включения в класс (например, класс собраний включается в класс мероприятий), либо отношение принадлежности к классу («собрание_38» - это член класса собраний).
3.3. Фреймы
Концепция фреймов является одним из способов представления знаний о ситуациях [4]. Каждый фрейм содержит слоты (в буквальном переводе - щели), которые идентифицируют тип ситуации или задают параметры конкретной ситуации. К примеру, фрейм, описывающий ситуацию на собрании, может иметь слот тип, значение которого будет определять тип собрания. В этом фрейме могут также присутствовать слоты время и место, значениями которых будут параметры конкретного собрания. Формализм фреймов можно рассматривать как обобщение формализма семантических сетей. Иерархия - это одна из важнейших концепций формализма фреймов, поэтому данный формализм также пригоден для представления таксономий знаний.
Выражение, записанное на языке фреймов, таком как FRL, декларирует существование фрейма. В нижеследующем примере упоминаются три фрейма – МЕРОПРИЯТИЕ, СОБРАНИЕ и СОБРАНИЕ_38. Фрейм МЕРОПРИЯТИЕ - наиболее общий, фрейм СОБРАНИЕ - более конкретный, описывающий вид МЕРОПРИЯТИЯ, а фрейм СОБРАНИЕ_38 - наиболее уточненный фрейм, описывающий конкретное СОБРАНИЕ. Фрейм СОБРАНИЕ называется субфреймом фрейма МЕРОПРИЯТИЕ, а фрейм СОБРАНИЕ_38 будет субфреймом фрейма СОБРАНИЕ.
(СОБРАНИЕ имя фрейма
(РАЗНОВИДНОСТЬ ($VALUE (МЕРОПРИЯТИЕ))) имена и значения слотов
(ВРЕМЯ ($DEFAULT (СРЕДА 14.00))) (умалчиваемые
(МЕСТО ($DEFAULT (ЗАЛ ЗАСЕДАНИЙ))) значения наследуются
) субфреймами
(СОБРАНИЕ_38 имя фрейма
(РАЗНОВИДНОСТЬ ($VALUE (СОБРАНИЕ))) имена и значения слотов
(ПРИСУТСТВУЮТ ($VALUE (РОМАН)
(АННА)
(БОРИС)
)
Наследование значений слотов. Другой важнейшей концепцией формализма фреймов является наследование. Можно дать указание о том, что если значение слота в одном из фреймов не задается, то фрейм должен унаследовать умалчиваемое значение этого слота из фрейма более высокого уровня. Наследование фреймами значений слотов будет осуществляться в том случае, если в фрейме будет присутствовать слот РАЗНОВИДНОСТЬ, в котором содержится имя другого фрейма. Например, слоты ВРЕМЯ и МЕСТО фрейма СОБРАНИЕ будут унаследованы фреймом СОБРАНИЕ_38. Слот РАЗНОВИДНОСТЬ языка фреймов аналогичен дуге "является" семантической сети в том смысле, что он представляет отношение включения в класс или отношение принадлежности к классу.
Оценка формализма фреймов. Фрейм лучше всего трактовать как некоторую разновидность структур данных. Наследование от фрейма к фрейму реализуется процедурами, которые осуществляют доступ к конкретным экземплярам структур данных. Если язык фреймов не обеспечивает тот тип вывода, который нужен программисту, то программист может написать новую процедуру, обеспечивающую такой вывод. В худшем случае это означает, что каждый возможный вывод потребуется записывать в явной форме. Для действительного понимания смысла программы, написанной на языке фреймов, необходимо соотнести выражения на языке фреймов с процедурами, реализующими выводы для фреймов. Это может оказаться весьма сложным, так как процедуры записываются на языке, отличном от языка фреймов.
Реализация фрейм-программы на Прологе. Нижеследующая Пролог-программа выражает структуру приведенного выше примера СОБРАНИЕ.
разновидность (собрание, мероприятие).
разновидность (собрание_38, собрание).
% локальные значения слотов для фрейма СОБРАНИЕ:
собрание (время, 'Среда 14.00').
собрание (место, 'Зал заседаний').
% локальные значения слотов для фрейма СОБРАНИЕ_38:
собрание_38 (присутствуют, [роман, анна, борис]). % (1)
% правило наследования
собрание_38 (Атрибут, Значение) :- % (2)
разновидность (собрание_38, Фрейм),
подцель =. . [фрейм, Атрибут, Значение],
подцель.
Обратите внимание на то, что и "собрание", и "собрание_38" - это базы данных, в которых хранятся атрибуты. База данных "собрание" связана с базой данных "собрание_38" при помощи факта «разновидность(собрание_38, собрание)». Правило наследования позволяет "собранию_38" наследовать любые значения атрибутов от "собрания" Если запросить время проведения "собрания_38":
? - собрание_38 (время, X).
Х='Среда.14.00'
то ответ будет получен по факту "собрание" при помощи правила наследования.
Факты, противоречащие друг другу. Представьте себе, что сперва планировалось провести "собрание_38" в принятое по умолчанию время (Среда, 14.00), но потом по какой-то причине понадобилось его перенести. Посмотрим, что получится, если в базу данных "собрание_38" добавить атрибут "время", противоречащий уже имеющемуся атрибуту.
собрание_38 (время, 'Четверг 9.00').
Теперь в слоте "время" фрейма "собрание_38" будут находиться два значения - локальное значение и унаследованное значение:
?- собрание_38 (время, X).
Х = 'Четверг 9.00';
Х = 'Среда 14.00';
нет
Здесь трудность состоит в том, что "собрание_38" должно описывать реальное собрание, которое может быть проведено только один раз. Иными словами, отношение между собранием и временем его проведения должно регулироваться ограничением вида один-к-одному, обеспечивающим целостность отношения. Однако в дайной версии программы запрос вырабатывает два значения времени проведения собрания. Значение «Четверг 9.00» должно перекрывать умалчиваемое значение «Среда 14.00», так что запрос подобный приведенному выше, должен вырабатывать только значение «Четверг 9.00».
Запрет наследования. Проблема решается при помощи приводимой ниже программы. Предикат "сократить" в первом правиле "собрание_38" гарантирует то, что если у фрейма "собрание_38" будет иметься локальное значение слота, то этот фрейм не сможет унаследовать другое значение того же самого слота от фрейма "собрание".
разновидность: (собрание, мероприятие).
разновидность (с_38, собрание).
% значения слотов фрейма "собрание":
собрание (время. 'Среда 14.00').
собрание (место, 'Зал заседаний').
% локальное правило
собрание_38 (Атрибут, Значение) :-
с_38 (Атрибут, Значение),!.
% правило наследования
собрание_38 (Атрибут, Значение) :-
разновидность (с_38, Фрейм),
Подцель =..[Фрейм, Атрибут, Значение],
Подцель.
% значения слотов, локальные по отношению к фрейму
% "собрание_38":
с_38 (присутствуют, [роман, анна, борис]).
с_38 (время, 'Четверг 9.00').
Все атрибуты, являющиеся локальными для фрейма "собрание_38", теперь хранятся в базе данных "с_38". Первое правило "собрание_38" проверяет, имеется ли в базе данных "с_38" фраза с требуемым атрибутом. Если имеется, то возвращается нужное значение, а предикат "сократить" предотвращает дальнейшую выдачу ответов. Если такой фразы нет в базе данных "с_38", то второе правило "собрание_38" ищет требуемый атрибут в базе данных "собрание". Теперь запрос о времени проведения собрания выдает единственный ответ:
?- собрание_38 (время, X).
Х = 'Четверг 9.00'; %по «с_38»
нет
?- собрание_38 (место, X). %по «собрание_38»
Х = 'Четверг 9.00';
Х = 'Зал заседаний';
нет
