Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МУ ПЗ

.pdf
Скачиваний:
17
Добавлен:
09.02.2015
Размер:
1.02 Mб
Скачать

По степени заполненности, различают:

протофреймы (незаполненные фреймы, как правило, представляющие собой какие-то классы);

экзофреймы (заполненные фреймы, как правило, представляющие собой экземпляры классов).

Фреймы и объектно-ориентированное программирование

Фреймы считаются историческими предшественниками классов в языках объектноориентированного программирования (ООП). Так фреймовая структура данных (объект) впервые была применена в языке программирования Smalltalk, являющимся первым языком подобного типа. Но сама идея представления знаний в виде подобных структур была известная в программировании и раньше под названием «абстрактный тип данных».

Ещѐ одним сходством фреймов и классов является то, что фреймы также могут наследоваться от других фреймов (т.е. перенимать все их свойства (слоты))! В этом случае в записи фрейма-наследника в качестве имени одного из слотов (обычно первого) пишется одно из специальных слов: «AKO» (A-Kind-Of), «IS-A» или «extends» (выбор конкретного специального слова для обозначения наследования зависит от синтаксиса языка представления знаний), а в качестве значения - имя наследуемого фрейма (или нескольких наследуемых фреймов). Таким образом, слот с именем AKO, IS-A или extends указывает на имя фрейма(ов) более высокого уровня иерархии.

За счѐт AKO/IS-A/extends-связей (родовидовых связей) образуется иерархическая структура знаний (таксономия). На верхнем уровне иерархии находится фрейм, содержащий наиболее общую информацию, истинную для всех остальных фреймов. Его свойства (и значения) могут передаваться по умолчанию фреймам, находящимся ниже в иерархии - но если последние содержат собственные значения данных характеристик, то в качестве истинных принимаются именно они. Таким образом, во фреймовых системах проявляются элементы полиморфизма, присущего ООП. Это обстоятельство позволяет без затруднений учитывать в них различного рода исключения.

Представление фреймов в Protégé

Для работы с фреймами в Protégé предусмотрен специальный режим «Protégé-Frames editor» (чтобы перейти в этот режим работы редактора, необходимо создать новый или открыть существующий проект онтологии в формате «.pont and .pins»). В этом режиме Protégé позволяет работать с двумя основными видами фреймов:

фреймы-образцы (используются в редакторе для определения классов онтологии);

фреймы-экземпляры (используются в редакторе для определения экземпляров классов). Все созданные в редакторе классы онтологии и их свойства (слоты) хранятся в виде

фреймов-образцов в файле формата «.pont» (сокращение от «Protégé ontology»). Соответствующие им экземпляры классов (объекты) хранятся в виде фреймов-экземпляров в файле формата «.pins» (сокращение от «Protégé instances»). Оба формата файла соответствуют синтаксису записи знаний в экспертной системе CLIPS. Потому ниже мы рассмотрим синтаксис записи фреймов-образцов (фреймов-классов) и фреймов-экземпляров на языке CLIPS (с небольшими изменениями относительно Protégé).

Синтаксис записи фрейма-класса на языке CLIPS (в нотации БНФ):

<class> ::= (defclass <class-name> [<comment>] (is-a <superclass-name>+)

[(role concrete|abstract)] [(pattern-match reactive|non-reactive)]

<slot>* <handler-documentation>*

11

)

<class-name> ::= <name>

<superclass-name> ::= <name>

<name> ::= <symbol>

<comment> ::= <string>

<slot> ::= (slot <slot-name> <facet>*) | (single-slot <slot-name> <facet>*) | (multislot <slot-name> <facet>*)

<slot-name> ::= <name>

<facet> ::= <default-facet> | <storage-facet> | <access-facet> | <propagation-facet> | <source-facet> | <pattern-match-facet> | <visibility-facet> | <create-accessor-facet> | <override-message-facet> | <constraint-attribute>

<default-facet> ::= (default ?DERIVE|?NONE|<expression>*) |

(default-dynamic <expression>*)

<expression> ::= <constant> | <variable> | <function-call>

<constant> ::= <symbol> | <string> | <integer> | <float> | <instance-name>

<symbol> ::= любая последовательность символов, исключая специальные

<string> ::= "любой текст"

<integer> ::= [+|-] <digit>+ <digit> ::= 0|1|2|3|4|5|6|7|8|9

<float> ::= <integer><exponent> | <integer>.[<exponent>] |

.<unsigned-integer>[<exponent>] | <integer>.<unsigned-integer>[<exponent>]

<unsigned-integer> ::= <digit>+ <exponent> ::= e<integer> | E<integer>

<instance-name> ::= [<name>]

<variable> ::= <single-field-variable> | <multifield-variable> | <global-variable>

<single-field-variable> ::= ?<variable-symbol>

<multifield-variable> ::= $?<variable-symbol>

12

<global-variable> ::= ?*<symbol>*

<variable-symbol> ::= <symbol>, начинающийся с буквы алфавита

<function-call> ::= (<function-name> <expression>*)

<function-name> ::= <name>

<storage-facet> ::= (storage local|shared)

<access-facet> ::= (access read-write|read-only|initialize-only)

<propagation-facet> ::= (propagation inherit|no-inherit)

<source-facet> ::= (source exclusive|composite)

<pattern-match-facet> ::= (pattern-match reactive|non-reactive)

<visibility-facet> ::= (visibility private|public)

<create-accessor-facet> ::= (create-accessor ?NONE|read|write|read-write)

<override-message-facet> ::= (override-message ?DEFAULT|<message-name>)

<message-name> ::= <name>

<constraint-attribute> ::= <type-attribute> | <allowed-constant-attribute> | <range-attribute> | <cardinality-attribute>

<type-attribute> ::= (type <allowed-type>+|?VARIABLE)

<allowed-type> ::= SYMBOL |

STRING |

LEXEME |

INTEGER | FLOAT | NUMBER |

INSTANCE-NAME | INSTANCE-ADDRESS | INSTANCE | EXTERNAL-ADDRESS | FACT-ADDRESS

<allowed-constant-attribute> ::= (allowed-symbols <symbol>+|?VARIABLE) |

(allowed-strings <string>+|?VARIABLE) | (allowed-lexemes <lexeme>+|?VARIABLE) | (allowed-integers <integer>+|?VARIABLE) | (allowed-floats <float>+|?VARIABLE) | (allowed-numbers <number>+|?VARIABLE) |

(allowed-instance-names <instance-name>+|?VARIABLE) | (allowed-classes <class-name>+|?VARIABLE) | (allowed-values <constant>+|?VARIABLE)

<lexeme> ::= <symbol> | <string>

<number> ::= <integer> | <float>

<range-attribute> ::= (range <range-specification> <range-specification>)

13

<range-specification> ::= <number>|?VARIABLE

<cardinality-attribute> ::= (cardinality <cardinality-specification> <cardinality-specification>)

<cardinality-specification> ::= <integer>|?VARIABLE

<handler-documentation> ::= (message-handler <name> [<handler-type>])

<handler-type> ::= primary|around|before|after

Синтаксис записи фрейма-экземпляра на языке CLIPS (в нотации БНФ):

<instance> ::= (<instance-name-expression> of <class-name-expression>

<slot-override>*

)

<slot-override> ::= (<slot-name-expression> <expression>*)

<instance-name-expression> ::= <instance-name> <class-name-expression> ::= <class-name> <slot-name-expression> ::= <slot-name>

Представление фреймов в Jess

Jess также позволяет работать с двумя основными видами фреймов: фреймы-образцы (определяют классы онтологии); фреймы-экземпляры (определяют экземпляры этих классов).

Фреймы-образцы (классы) определяются в Jess с помощью команды «deftemplate». Фреймы-экземпляры записываются в Jess как отдельные факты (где внутри круглых скобок группируются вместе значения слотов одного и того же экземпляра). При этом, записи фактов, представляющих экземпляры одного и того же класса, принято объединять в единую структуру, называемую «модулем» и объявляемую через команду «deffacts». Если какиелибо факты объявлены в Jess через эту команду (а не напрямую через загрузку фактов из файла или добавления их в оперативную память поодиночке), то они сохранятся при перезагрузке системы командой «reset» - т.е., в этом случае, система сможет вернуться в первоначальное состояние (первоначальный набор фактов) без повторной их загрузки.

Синтаксис записи фрейма-образца (класса) в формате Jess (в нотации БНФ):

(deftemplate template-name

[extends supertemplate-name] ["Documentation comment"]

[(declare (slot-specific TRUE|FALSE) (backchain-reactive TRUE|FALSE) (from-class class-name) (include-variables TRUE|FALSE) (ordered TRUE|FALSE)

)]

(slot|multislot slot-name ([(type ANY | INTEGER | FLOAT | NUMBER | SYMBOL | STRING |

14

LEXEME |

OBJECT | LONG

)]

[(default default-value)] [(default-dynamic expression)] [(allowed-values expression+)]

)*

)

Синтаксис записи фреймов-экземпляров в формате Jess (в нотации БНФ):

(deffacts module-name ["Documentation comment"]

(template-name (slot-name slot-value+)+)*

)

Замечание: как видно выше, в синтаксисе записи фреймов-экземпляров в формате Jess не предусмотрено указание имени (идентификатора) экземпляра! Потому, чтобы с экземплярами можно было потом работать, необходимо в определении соответствующих им фреймов-образцов (классов) предусмотреть задание специальных слотов (например, «name» или «id», с учѐтом соответствующих им типов данных) для обозначения их имѐн (идентификаторов).

Логический вывод на основе фреймов в Jess

В основном, синтаксис правил логического вывода для фреймов ничем не отличается от правил для обычных фактов. У нас также есть набор фактов в левой части правила и набор действий с фактами в правой части правила.

Однако, всѐ же, есть некоторые отличия:

1) Слоты, извлекаемые из одного и того же экземпляра, группируются в одну строчку (как при записи фреймов-экземпляров):

пример: (Person (name ?n) (sex ?s) (age ?a)).

2) Если во фрейме присутствуют мультислоты (multislot), то считать все значения такого слота простой переменной невозможно! Для этого используется так называемая «мультипеременная». Она сохраняет внутри себя список объектов любого типа данных (конкретный тип данных зависит от типа данных считываемого слота), при этом в правилах ей можно оперировать как списком (в частности, использовать команду «member$» для проверки вхождения какого-нибудь элемента в список). Синтаксис записи мультипеременной отличается только наличием знака «$» перед знаком обозначения переменной «?»:

пример: (Person (name ?n) (sex ?s) (age ?a) (parent $?c))

(test (member$ "Tom" $?c)).

3) Существует возможность внутри записи фрейма (в левой части правила) указать фильтр значений извлекаемых слотов. Делается это с помощью конструкции «{...}»:

(template-name {filter-expression} (slot-name variable)*).

В качестве «filter-expression» выступают следующие конструкции:

slot-name < slot-value;

slot-name <= slot-value;

slot-name > slot-value;

slot-name >= slot-value;

slot-name == slot-value;

slot-name != slot-value;

slot-name <> slot-value;

15

filter-expression && filter-expression;

filter-expression || filter-expression.

Замечание: внутри фильтра проверять можно только значения одиночных слотов (не мультислотов)!

пример: (Person {sex == "male"} (name ?n) (age ?a) (parent $?c)).

4) Существует возможность задать переменную, обозначающую весь фрейм-экземпляр целиком - в этом случае эта переменная будет использоваться как «имя экземпляра». И если дальше в правиле где-то нужно будет сделать ссылку на значение какого-нибудь слота этого экземпляра, то получить доступ к нему уже можно будет через запись вида «variable.slotname» для левой части правила и «?variable.slot-name» для правой. Для объявления такой переменной в левой части правила, используется модифицированная версия команды «bind»

в формате: ?variable <- (fact-expression):

пример: ?x <- (Person {sex == "male"} (name ?n) (age ?a) (parent &?c))

(test (eq x.age 18)).

5) В правой части правила, для оперирования фреймами, используются те же действия, что и над обычными фактами: «assert», «retract» и «modify». При этом, в команде «assert» записывается весь полученный фрейм целиком (см. пункт 1)). В командах «retract» и «modify» записывается имя переменной, которой был присвоен конкретный фрейм (см. пункт 4)). Особенностью записи команды «modify» является также и то, что в ней записывается не весь фрейм целиком, а только те слоты, значения которых подлежат изменению (модификации):

пример: (Man (name ?n) (sex ?s) (age ?a) (parent &?c))

=>

(assert (Person (name ?n) (sex ?s) (age ?a) (parent &?c))). пример: ?x <- (Man {sex == "male"} (name ?n) (age ?a) (parent &?c))

=>

(retract ?x).

пример: ?x <- (Man {name == "Ben"} (sex ?s) (age ?a) (parent &?c))

=>

(bind ?a1 (+ ?a 1)) (modify ?x (age ?a1)).

Пример(ы)

Предметная область: семья.

Фреймы-классы на языке CLIPS:

(defclass Person

(role abstract) (single-slot name

(type STRING) (cardinality 1 1)

)

(single-slot sex

(type STRING) (cardinality 1 1)

)

(single-slot age

(type INTEGER) (cardinality 1 1)

)

(multislot parent

(type INSTANCE) (allowed-classes Person)

)

16

)

(defclass Man

(is-a Person) (role concrete)

(single-slot husband

(type INSTANCE) (allowed-classes Woman) (cardinality 0 1)

)

(multislot father

(type INSTANCE) (allowed-classes Person)

)

(multislot brother

(type INSTANCE) (allowed-classes Person)

)

)

(defclass Woman

(is-a Person) (role concrete) (single-slot wife

(type INSTANCE) (allowed-classes Man) (cardinality 0 1)

)

(multislot mother

(type INSTANCE) (allowed-classes Person)

)

(multislot sister

(type INSTANCE) (allowed-classes Person)

)

)

Фреймы-экземпляры на языке CLIPS:

([Mary] of Woman

(name "Mary") (sex "female") (age 72) (parent [Ben]) (mother [Ben])

)

([Ben] of Man

(name "Ben") (sex "male") (age 41)

(husband [Lena]) (parent

[Tom]

[Jane]

)

(father

[Tom]

[Jane]

)

)

17

([Lena] of Woman

(name "Lena") (sex "female") (age 40)

(wife [Ben]) (parent

[Tom]

[Jane]

)

(mother

[Tom]

[Jane]

)

)

([Tom] of Man

(name "Tom") (sex "male") (age 20)

(brother [Jane])

)

([Jane] of Woman

(name "Jane") (sex "female") (age 19) (sister [Tom])

)

Фреймы-образцы (классы) в формате Jess:

(deftemplate Person (declare

(slot-specific TRUE)

)

(slot name (type STRING)) (slot sex (type STRING)) (slot age (type INTEGER))

(multislot parent (type STRING))

)

(deftemplate Man

extends Person (declare

(slot-specific TRUE)

)

(slot husband (type STRING)) (multislot father (type STRING)) (multislot brother (type STRING))

)

(deftemplate Woman

extends Person (declare

(slot-specific TRUE)

)

(slot wife (type STRING)) (multislot mother (type STRING)) (multislot sister (type STRING))

)

Фреймы-экземпляры в формате Jess:

(deffacts Ivanovy

18

(Woman (name "Mary") (sex "female")

(age 72)

(parent "Ben"))

(Man (name "Ben") (sex "male") (age

41) (husband "Lena") (parent "Tom" "Jane"))

(Woman (name "Lena") (sex "female")

(age 40)

(wife "Ben") (parent "Tom"

"Jane"))

 

 

(Man (name "Tom") (sex "male") (age

20))

 

(Woman (name "Jane") (sex "female")

(age 19))

 

)

 

 

Правила логического вывода на основе фреймов-образцов в формате Jess:

(defrule def-father

?x <- (Man {sex == "male"} (parent $?y)) =>

(modify ?x (father $?y))

)

(defrule def-brother

?x <- (Man {sex == "male"} (name ?n1) (brother $?b)) (Person (name ?n2))

(test (neq ?n1 ?n2))

(not (test (member$ ?n2 $?b))) (Person (parent $?c))

(test (member$ ?n1 $?c)) (test (member$ ?n2 $?c)) =>

(modify ?x (brother $?b ?n2))

)

Выводы: В ходе практического занятия были получены практические навыки записи знаний онтологии в виде фреймов.

19

4. Построение семантической сети и SL IDEF5 диаграммы предметной области

Цель работы: Получение практических навыков построения графов для визуализации знаний онтологии.

Исходные положения

Семантическая сеть

Формально, семантическая сеть (СС) представляет собой помеченный ориентированный граф. Вершины СС соответствуют сущностям предметной области - объектам, событиям, свойствам, процессам, явлениям.

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

Достоинства: Подобная форма - самая удобно воспринимаемая человеком. Недостатки: Трудности при построении сложных сетей и попытке учета особенностей

естественного языка. Концепция IDEF5

Процесс построения онтологии, согласно методологии IDEF5 состоит из пяти основных действий:

1)Изучение и систематизирование начальных условий. Это действие устанавливает основные цели и контексты проекта разработки онтологии, а также распределяет роли между членами проекта.

2)Сбор и накапливание данных. На этом этапе происходит сбор и накапливание необходимых начальных данных для построения онтологии.

3)Анализ данных. Эта стадия заключается в анализе и группировке собранных данных и предназначена для облегчения построения терминологии.

4)Начальное развитие онтологии. На этом этапе формируется предварительная онтология, на основе отобранных данных.

5)Уточнение и утверждение онтологии - Заключительная стадия процесса.

Язык описания онтологий в IDEF5

Для поддержания процесса построения онтологий в IDEF5 существуют специальные онтологические языки: схематический язык (Schematic Language - SL) и язык доработок и уточнений (Elaboration Language - EL). SL является наглядным графическим языком, специально предназначенным для изложения компетентными специалистами в рассматриваемой области системы основных данных в форме онтологической информации (рис. 1). Этот несложный язык позволяет естественным образом представлять основную информацию в начальном развитии онтологии и дополнять существующие онтологии новыми данными. EL представляет собой структурированный текстовой язык, который позволяет детально характеризовать элементы онтологии.

Язык SL позволяет строить разнообразные типы диаграмм и схем в IDEF5. Основная цель всех этих диаграмм - наглядно и визуально представлять основную онтологическую информацию.

Несмотря на кажущееся сходство, семантика и обозначения схематичного языка SL существенно отличается от семантики и обозначений других графических языков. Дело в том, что часть элементов графической схемы SL может быть изменен или вовсе не приниматься во внимание языком EL. Причина этого состоит в том, что основной целью применения SL является создание лишь вспомогательной структурированной конструкции

20