Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Albatross





isa


Colour

Brown

\ ^^ movingmethod


 


;olour /

Black and white


Albert


\ isa

\

Ross


is a \

\act

ActrVe_at night

<^


Walk


Рис, 15.5. Пример семантической сети

Обратите внимание, что отношение принадлежности (обозначается как "isa") иногда связывает класс объектов с суперклассом этого класса (животные — это су­перкласс класса птиц), а иногда — экземпляр класса с самим классом (Альберт яв­ляется альбатросом).

Данные, представленные с помощью сети такого рода, можно немедленно пере­вести на язык фактов Prolog, например, следующим образом:

isa(bird, animal). % Птица - это животное

isa (ross, albatross). % Росс - альбатрос

raoving_method(bird, fly). % Способ передвижения птиц - полет

moving_method< kiwi, walk). % Способ передвижения киви - ходьба

Кроме явно указанных фактов, на основании информации в этой сети могут быть выведены некоторые другие факты. Способы вывода других фактов встраиваются в


Глава 15. Представление знаний и экспертные системы



средства представления семантической сети конкретного типа как часть этого пред­ставления. К типичному встроенному способу вывода относится наследование. По­этому в сети, приведенной на рис. 15.5, тот факт, что "альбатрос летает", может быть унаследован от факта "птицы летают". Аналогичным образом с помощью наследова­ния могут быть получены факты "Росс летает" и "Ким ходит". Факты наследуются с использованием отношения isa. На языке Prolog можно указать следующим обра­зом, что способ передвижения наследуется: moving_method (X, Method):-

isa [ X, superx), % Восхождение по иерархии isa

moving_irieth0d{ SuperX, Method). Но если бы для каждого отношения пришлось задавать отдельное правило насле­дования, то программа стала бы довольно громоздкой. Поэтому проще задать сле­дующим образом более общее правило, касающееся фактов: "Факты могут быть либо явно заданы в сети, либо унаследованы":

(act (Fact):- i Факт - не переменная; Fact = Rel (Argl, Дгд2) Fact,!. % Факт задан в сети явно - наследование не требуется

fact (Fact):-

Fact =.. [ Rel, Argl, Arg2J,

isa с arclt Su.erArgl, S Восхождение по иерархии isa

SucpterF S a uperFact) Re1' *"***", "**'

Теперь программе обработки этой семантической сети можно задать некоторые вопросы, например, следующим образом:

7- fact) moving method[ kim, Method)). Method = walk ~

Этот факт унаследован от явно заданного факта, что киви не летают, а ходят. С другой стороны, ответ на следующий вопрос является совсем иным:

?- fact (moving method (albert, Method)). Method - fly -

Этот факт был унаследован от класса bird. Обратите внимание на то, что унасле­дованным становится тот факт, который был получен первым при перемещении вверх по иерархии isa.

Фреймы

Б представлении знаний в виде фреймов факты ассоциируются с объектами. В этом контексте под "объектом" подразумевается конкретный физический объект либо более абстрактное понятие, такое как класс объектов или ситуация. Например, в виде фреймов удобно представить типичную ситуацию обмена мнениями или си­туацию игрового конфликта. Подобные ситуации, как правило, имеют некоторую общую, стереотипную структуру, которая может быть дополнена сведениями о кон­кретном событии.

Фрейм — это структура данных, компоненты которой называются слотами. Сло­ты обозначаются именами и применяются для размещения в них информации раз­личного рода. Поэтому в слотах можно найти элементарные значения, ссылки на другие фреймы или процедуры, с помощью которых на основе какой-то иной инфор­мации может быть вычислено значение слота. Слот может также оставаться незапол­ненным. Незаполненные слоты могут заполняться с применением логического выво­да. Как и в семантических сетях, наиболее широко применяемым принципом логи­ческого вывода является наследование. Если фрейм представляет собой класс объектов (таких как альбатросы), а другой фрейм - суперкласс этого класса (такой как птицы), то фрейм класса может наследовать значения от фрейма суперкласса.

Некоторые знания о птицах можно поместить во фреймы, например, следующим образом:



Часть II. Применение языка Prolog в области искусственного интеллекта


FRA ME: bird

a_kind_of: animal

moving_methcd: fly

|

active_at: daylight Этот фрейм содержит сведения о классе всех птиц. Три его слота сообщают о том, что птицы относятся (a_kir.d_of) к животным (животные — это суперкласс птиц), что типичным способом передвижения птиц (moving ir.ethod) является полет и что птицы являются активными (activeat) в дневное время. Ниже приведены фреймы для двух подклассов птиц — альбатросов и киви.

FRAME; albatross a_kind_of: bird colour: black and_white size: 115

FRAME kiwi a kind of: bird movingjriethod: walk active at: night colour: brown size: 40

Альбатрос — это очень типичная птица, которая наследует от фрейма птиц спо­собность летать и дневную активность. Поэтому во фрейме albatross нет никаких сведений о способе передвижения moving method и периоде активности active at. С другой стороны, киви — это довольно нетипичная птица, поэтому при ее описании необходимо перекрыть обычные значения movingjuethod и active_at, характерные для птиц. Может быть также определен конкретный экземпляр класса, например альбатрос по имени Альберт, следующим образом:

FRAME Albert instance of: albatross size: 120"

Обратите внимание на различие между двумя отношениями, a_kind_of и instance_of. Первое является отношением между классом и суперклассом, а вто­рое — отношением между членом класса и классом.

Информация о фреймах, применяемых здесь в качестве примера, может быть представлена на языке Prolog в виде множества фактов, таким образом, чтобы один факт определял значение каждого отдельного слота. Такую задачу можно выполнить несколькими способами. А в данном разделе используется следующий формат для представления таких фактов: Frame_name(Slot, Value]

Преимущество этого формата состоит в том. что теперь все факты о конкретном фрейме собраны в виде отношения, имя которого совпадает с именем самого фрейма. В листинге 15.10 показаны некоторые фреймы в таком формате.

Листинг 15.10. Некоторые примеры фреймов

% Фрейм представлен в виде множества фактов Prolog:
% frame name (Slot, Value)

Здесь "Value - либо простое значение, либо процедура

% Фрейм bird - определение типичной птицы

bird) a kind_of, animal). bird(moving_method, fly). bird{ active_at, daylight).

% Фрейм albatross; альбатрос - это типичная птица, но для его определения % нужны дополнительные факты: он черно-белкй и имеет в среднем длину 115 см

albatross С a_kind_of, bird).

Глава 15, Представление знаний и экспертные системы 351


 


albatross { colour, black_and_white). albatross; size, 115).

% Фрейм kiwi; киви - довольно нетипичная птица, поскольку она ходит, % а не летает, и активна в ночное время

kiwi[ a_kind_of, bird). kiwi [ moving_method, walk). kiwi(active_at, night). kiwi(size, 40). kiwi (colour, bro«n).

% Фрейм albert - экземпляр йзрослого альбатроса

albert(instance_of, albatross). albert(size, 120).

% Фрейм ross - экземпляр альбатроса-птениа

ross(instance of, albatross). rossi size, 40").

% Фрейм animal - слот relative size получает свое значение i в результате выполнения процедуры relative_size

animal (relative size, execute (relative size(Object, Value), object, Value)).

Для использования подобного набора фреймов необходима процедура, позволяю­щая осуществлять выборку фактов о значениях слотов. Реализуем такую процедуру выборки фактов как процедуру Prolog следующим образом:

value(Frame, Slot, Value)

где Value - значение слога Slot во фрейме Frame. Если слот заполнен определен­ным значением (так что его значение явно задано во фрейме), то оно и принимается в качестве требуемого значения; в противном случае происходит получение нужного значения с помощью логического вывода, например наследования. Чтобы найти зна­чение с помощью наследования, необходимо перейти от текущего фрейма к более общему фрейму в соответствии с отношением a kind of или instance of между фреймами. Такой переход ведет к "родительскому фрейму", и искомое значение мо­жет быть найдено э этом фрейме явно или с помощью дальнейшего наследования. Эта операция непосредственной выборки или выборки путем наследования может быть определена на языке Prolog- следующим образом:

value { Frame, Slot, Value):-

Query =.. [ Frame, Slot, Value],

call С Query),!. % Получение значения с помощью непосредственной выборки

value) Frame, Slot, Value):-

parent { Frame, Parent Frame), % Фрейм более общего типа

value (ParentFrame, Slot, Value).

parent(Frame, ParentFrame):-

(Query =.. { Frame, a_kind_of, Parent Frame]

Query =.. [ Frame, instance_of, ParentFrame]), call £ Query).

Эта процедура вполне позволяет находить значения во фреймах, показанных в листинге 15.10, например, с помощью следующих вопросов:

?- valuet albert, active_at, AlbertTime). AlbertTime = daylight

?- valuet kiwi, active_at, KiwiTirae). KiwiTime = night

352 Часть li. Применение языка Prolog в области искусственного интеллекта


Теперь рассмотрим более сложный случай логического вывода, при котором в слоте определена процедура вычисления значения вместо самого значения. Напри­мер, в одном из слотов для всех животных может быть задан их размер, установлен­ный с учетом типичного размера взрослого экземпляра особи соответствующего вида. В таком случае относительные размеры двух альбатросов, описанных в листин­ге 15.10, заданные в процентах, составляют: Альберт- 104%, Росс - 35%. Эти цифры получены кик соотношение (и процентах) между размером конкретного инди­видуума и типичным размером представителя класса этого индивидуума. Например, для альбатроса Росс это значение получено следующим образом:

40/115 * 100% = 34.78%

Итак, значение для слота relativesize получено путем выполнения некоторой процедуры. Эта процедура является в равной степени применимой для всех живот­ных, поэтому целесообразно определить слот relative_size во фрейме animal и ввести в этот слот определение соответствующей процедуры. Теперь интерпретатор фреймов value должен быть способен ответить на такой вопрос:

?- value(ross, relative_size, R}. R = 34.78

Способ получения этого результата должен состоять примерно в следующем. Про­цедура начинает поиск с фрейма ross и, не обнаружив значения для relative size, поднимаемся вверх по цепочке отношений instance_of (чтобы пе­рейти к фрейму albatross), a_k±nd_of (чтобы перейти к фрейму bird), и снова a_M.nd._of, чтобы, наконец, дойти до фрейма animal. Здесь обнаруживается проце­дура вычисления относительного размера. Для этой процедуры требуются значения из слота size фреймов ross и albatross. Эти значения могут быть получены с по­мощью наследования из существующей процедуры value. Остается лишь дополнить процедуру value, чтобы она учитывала случаи, в которых требуется выполнить про­цедуру в определенном слоте. Прежде чем это сделать, необходимо продумать, как такая процедура может быть (косвенно) представлена в виде содержимого слота, Предположим, что процедура вычисления относительного размера представлена в виде предиката Prolog следующим образом:

relativesize c Object, RelativeSize):-

value (ObjClass, size, ClassSize),

RelativeSize is objSize/ClassSize * 100. % процентная доля от размера класса

Теперь в слот relative_size фрейма animal можно ввести вызов этой процеду­ры. Чтобы предотвратить потерю параметров Object (Объект) и RelativeSize (Относительный размер) при взаимодействии фреймов, необходимо также определить их как часть информации слота relative size. Все содержимое этого слота можно собрать в один терм Prolog, например, как показано ниже. execute! relative_size (Object, RelSize), Object, RelSize}

После этого слот relative_size фрейма animal определяется таким образом: animal! relative_size, execute! relative_size£ Obj, Val), Obj, Val)).

Теперь можно приступить к модификации процедуры value для обработки с ее помощью процедурных слогов. Прежде всего мы должны учесть, что информация, находящаяся в слоте, может представлять собой вызов процедуры, поэтому для ее дальнейшей обработки необходимо осуществить этот вызов. Для такого вызова в ка­честве параметров могут потребоваться значения слогов первоначально рассматри­ваемого фрейма. В старой версии процедуры value этот фрейм исчезал из памяти после перехода по иерархическому дереву к более общим фреймам. Поэтому необхо­димо определить первоначальный фрейм в качестве дополнительного параметра. Эта задача решается в следующем фрагменте программы:

value! Frame, Slot, Value):-

value{ Frame, Frame, Slot, Value).


Глава 15. Представление знаний и экспертные системы



% Непосредственная выборка информации из слота (супер) фрейма value) frame, SuperFrame, Slot, Value);-

Query-.. [ SuperFrame, Slot, Information],

call* Query!, % Значение, полученное с помощью непосредственной выборки

process< information, Frame, Value),!. % Информация может быть задана либо

% в виде значения, лиСо как вызов процедуры % Логический вывод значения с помощью наследования value) Frame, SuperFrame, Slot, Value):-

paren tt SuperFrame, FarentSuperFrame),

value! Frame, FarentSuperFrame, Slot, Value). % process) Information, Frame, Value)

process! execute! Goal, Frame, Value), Frame, Value):—!,

call (Goal). process! Value, _, Value). ч Значение, а не вызов процедуры

Введя указанное дополнение в интерпретатор фреймов, мы вступили в область применения такого подхода к программированию, как объектно-ориентированное программирование. Хотя при описании указанного подхода обычно применяется иная терминология, его реализация фактически основана на активизации выполне­ния процедур, которые принадлежат к разным фреймам.

Применение логического вывода, основанного на переходе между фреймами, ха­рактеризуется многими нюансами, которые здесь не рассматриваются. Коснемся лишь вопроса множественного наследования. Необходимость в его использовании возникает, если фрейм имеет больше одного "родительского" фрейма (согласно отно­шению instance_of или a_kind_of). При этом унаследованное значение слота мо­жет быть получено больше чем от одного родительского фрейма, и возникает вопрос, на каком из них следует остановиться. Процедура value в том виде, в каком она оп­ределена в этом разделе, просто принимает первое обнаруженное значение, которое найдено с помощью поиска в глубину среди фреймов, обладающих способностью пре­доставить такое значение. Но могут оказаться более приемлемыми другие стратегии или правила выбора среди нескольких альтернатив.





Поделиться с друзьями:


Дата добавления: 2015-10-01; Мы поможем в написании ваших работ!; просмотров: 567 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Самообман может довести до саморазрушения. © Неизвестно
==> читать все изречения...

2535 - | 2391 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.