3130
.pdfМинистерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный лесотехнический университет им. Г.Ф. Морозова»
Интеллектуальные системы и технологии
Методические указания к лабораторным работам для студентов по направлению подготовки 09.03.02 – Информационные системы и технологии
Воронеж 2016
УДК 681.3
Юдина, Н. Ю. Интеллектуальные системы и технологии Текст : методические указания к лабораторным работам для студентов по направлению подготовки 09.03.02 – Информационные системы и технологии / Н. Ю. Юдина ; М-во образования и науки РФ, ФГБОУ ВО «ВГЛТУ». – Воронеж, 2016. – 32 с.
Печатается по решению учебно-методического совета ФГБОУ ВО «ВГЛТУ им. Г.Ф. Морозова» (протокол № __ от ____ 2016 г.)
Рецензент заведующий кафедрой электротехники и автоматики ФГБОУ ВО Воронежский ГАУ д-р техн. наук, проф. Д. Н. Афоничев
2
Оглавление |
|
ЛАБОРАТОРНАЯ РАБОТА №1. «Экспертные оболочки» ................................... |
4 |
2.1. Общие сведения о CLIPS.............................................................................. |
4 |
2.2. Программирование в CLIPS ......................................................................... |
4 |
ЛАБОРАТОРНАЯ РАБОТА №2. «Логическое программирование».................. |
10 |
ЛАБОРАТОРНАЯ РАБОТА №3. «Разработка экспертной оболочки»............... |
19 |
ЛАБОРАТОРНАЯ РАБОТА №4: «Нечеткая логика» ........................................... |
22 |
ЛАБОРАТОРНАЯ РАБОТА №5: «Алгоритмы нейронных сетей» ..................... |
25 |
Многослойные сети прямого распространения .............................................. |
26 |
Алгоритм обратного распространения ................................................................ |
27 |
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ ................................................... |
29 |
3
ЛАБОРАТОРНАЯ РАБОТА №1. «Экспертные оболочки» Цель работы:
1.Изучение языка процедурного программирования оболочки CLIPS.
2.Создание экспертной системы в оболочке CLIPS, содержащей базу правил, начальные факты и возможные исходы.
Теоретическое введение. 2.1. Общие сведения о CLIPS
CLIPS (С Language Integrated Production System) является одним из рас-
пространенных инструментальных средств разработки экспертных систем (ЭС). CLIPS использует продукционную модель представления знаний и поэтому содержит три основных элемента:
1.список фактов (представляет исходное состояние проблемы)
2.базу знаний (преобразуют состояние проблемы к решению)
3.блок вывода Отличием данной системы от аналогов является то, что она полностью
реализована на языке С. В CLIPS используется оригинальный LIPS-подоб-ный язык программирования, ориентированный на разработку ЭС. Кроме того, CLIPS поддерживает еще две парадигмы программирования: объектноориентированную и процедурную. Аспекты объектно-ориентированного программирования в CLIPS рассматриваться не будут.
2.2. Программирование в CLIPS 2.2.1. Простые типы данных
В CLIPS предусмотрено восемь простых типов данных: float, integer, symbol, string, external-address, fact-address, instance-name и instance-address.
Для числовой информации используются типы float и integer, символьной
– symbol и string. При записи числа используются цифры (0-9), десятичная точка (.), знак (+) или (-) и (е) при экспоненциальном представлении. Количество значащих цифр зависит от аппаратной реализации. Примеры целых чисел: 237, 15, +12, -32. Примеры чисел с плавающей точкой: 237е3, 15.09, +12.0, -32.3е-7.
Последовательность символов, которая не удовлетворяет числовым типам, обрабатывается как тип данных symbol. Тип данных symbol в CLIPS – последовательность символов, состоящая из одного или нескольких любых печатных символов кода ASCII. Примеры выражений символьного типа: foo,
Hello, B76-HI, bad_value, 127А, 742-42-42, @+=-%, Search. Тип данных string -
это последовательность символов, состоящая из нуля и более печатных символов и заключенная в двойные кавычки. Если внутри строки встречаются двой-
4
ные кавычки, то перед ними необходимо поместить символ (\). Например:
"foo", "a and b", "I number", "a\"quote".
2.2.2. Переменные
Идентификатор переменной всегда начинается с вопросительного знака, за которым следует ее имя. Примеры переменных: ?х, ?sensor, ?noun, ?color.
Переменные описываются |
(defrule make-quack |
и получают значения |
(duck-sound ?sound) |
в левой части правила. |
=> |
|
(assert (sounds-is ?sound) ) |
Значение переменной |
(defrule addition |
изменяется в правой части |
(numbers ?x ?y) |
при помощи функции bind. |
=> |
|
(assert (answer (+ ?x ?y))) |
|
(bind ?answer (+ ?x ?y) |
|
(printout t "answer is " ?answer crlf)) |
Переменной может быть |
(defrule get-married |
присвоено значение адреса факта. |
?duck <- (bachelor Dopey) |
Это может оказаться удобным |
=> |
при необходимости манипули- |
(retract ?duck)) |
ровать фактами непосредственно из правила. Для такого присвоения используется комбинация "<-".
Для определения глобальных переменных, которые видны всюду в среде CLIPS, используется конструкция defglobal. К глобальной переменной можно обратиться в любом месте, и ее значение остается независимым от других конструкций.
2.2.3. Функции
Существует несколько типов функций. Пользовательские и системные функции - это фрагменты кода, написанные на внешних языках (например, на С) и связанные со средой CLIPS. Системными называются те функции, которые были определены изначально внутри среды CLIPS. Пользовательскими называются функции, которые были определены вне CLIPS.
в CLIPS предусмотрен ряд стандартных арифметических и математических функций. Среди них: + (сложение ), - (вычитание ), * (умножение), / (деление), ** (возведение в степень), Abs (определение абсолютного значения), Sqrt (вычисление квадратного корня), Mod (взятие по модулю), Min (нахождение минимума), Мах
5
(нахождение максимума). Конструкция deffunction позволяет пользователю определять новые функции непосредственно в среде CLIPS.
2.2.4. Конструкции
В CLIPS существует несколько описывающих конструкций: defmodule, defrule, deffacts, deftemplate, defglobal, deffunction, defclass, definstances, defmes- sage-handler, defgeneric. При записи все они заключаются в скобки. Определение конструкции отличается от вызова функции главным образом по производимому эффекту. В отличие от функций конструкции никогда не возвращают значений.
2.2.5. Факты
Факты являются одной из основных форм представления информации в системе CLIPS. Каждый факт представляет фрагмент информации, который был помещен в текущий список фактов, называемый fact-list.
Сразу после запуска CLIPS-приложения на выполнение на экране появится приглашение, извещающее пользователя, что он работает с интерпретато-
ром: CLIPS>. |
|
Факты можно включить в базу |
CLIPS> (assert (today is Sunday)) |
фактов прямо из командной строки |
<Fact-0> |
с помощью команды assert |
CLIPS> (assert (weather is warm)) |
|
<Fact-l> |
Для вывода списка фактов, |
CLIPS> (facts) |
имеющихся в базе, используется |
f-0 (today is Sunday) |
команда facts |
f-1 (weather is warm) |
Для удаления фактов из базы |
CLIPS> (retract 1) |
используется команда retract |
CLIPS> (facts) |
|
f-0 (today is Sunday) |
Команда clear очищает |
CLIPS> (clear) |
базу фактов |
CLIPS> (facts) |
В тексте программы факты |
(deffacts today |
можно включать в базу массивом. |
(today is Sunday) |
Используется команда deffacts |
(weather is warm)) |
Выражение начинается с команды deffacts, затем приводится имя списка фактов, который программист собирается определить (в примере — today), за
ним следуют элементы списка. |
|
Этот массив фактов можно |
CLIPS> (undeffacts today) |
удалить из базы командой undef facts |
|
6
Выражение deffacts лучше |
CLIPS> (load "my file") |
записать в текстовый файл, а |
CLIPS> (reset) |
затем загрузить. Команда reset сначала очищает базу фактов, а затем включает
внее факты из всех ранее загруженных массивов.
2.2.6.Правила
Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент,
как только оно становится применимым. |
|
В языке CLIPS правила имеют формат: |
Например: |
(defrule <имя правила> |
(defrule chores |
< необязательный комментарий > |
"Things to do on Sunday" |
< необязательное объявление > |
(salience 10) |
< предпосылка_1 > |
(today is Sunday) |
< предпосылка_т > => |
(weather is warm) => |
< действие_1 > |
(assert (wash car)) |
< предпосылка_п >) |
(assert (chop wood)) |
В этом примере Chores — произвольно выбранное имя правила. Предпосылки в условной части правила (today is Sunday), (weather is warm) сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =>), вставят в базу два факта (wash car), (chop wood) в случае, если правило будет активизировано. Приведенный в тексте правила комментарий "Things to do on Sunday" ("Что сделать в воскресенье") поможет в дальнейшем вспомнить, для чего это правило включено в программу.
Выражение (salience 10) указывает на степень важности правила. Пусть, например, в программе имеется другое правило:
Поскольку предпосылки обоих правил |
(defrule fun |
одинаковы, то при выполнении оговоренных |
"Better things to do on Sunday" |
условий они будут "конкурировать" за |
(salience 100) |
внимание интерпретатора. Предпочтение |
(today is Sunday) |
будет отдано правилу, у которого параметр |
(weather is warm) => |
salience имеет более высокое значение, |
(assert (drink beer)) |
в данном случае — правилу fun. |
(assert (play guitar))) |
Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.
7
Обычно в определении правила |
(defrule pick-a-chore |
присутствуют и переменные. Если, |
"Allocating chores to days" |
например, правило |
(today is ?day) |
|
(chore is ?job) => |
|
(assert (do ?job on ?day)) ) |
будет сопоставлено с фактами |
(today is Sunday) (chore is carwash) |
то в случае активизации оно включит |
|
в базу новый факт |
(do carwash on Sunday) |
Аналогично, правило |
(defrule drop-a-chore |
отменит выполнение работ |
"Allocating chores to days" |
по дому (a chore). Оба эк- |
(today is ?day) |
экземпляра переменной |
?chore <- (do ?job on ?day) => |
?day должны получить |
(retract ?chore) ) |
одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой со-
держатся |
(today is Sunday) |
то при активизации правила |
(do carwash on Sunday) |
из базы будет удален факт |
(do carwash on Sunday) |
Отметим, что факт |
(do carwash on Sunday) |
будет сопоставлен с любым из представленных ниже образцов
Учтите, что префикс $? |
(do ? ? Sunday) |
является признаком |
(do ? on ?) |
сегментной переменной, |
(do ? on ?when) |
которая будет связана |
(do $?) |
с сегментом списка. |
(do $? Sunday) |
|
(do ?chore $?when) |
Например, в приведенном выше примере переменная $?when будет связана с (on Sunday). Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.
2.3. Наблюдение за процессом интерпретации
Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.
8
(defrule start (initial-fact)
(printout t "hello, world" crlf) )
Выполните команду reset. Для этого либо введите эту команду в командной строке интерпретатора
CLIPS> (reset)
либо выберите в меню команду Execution=>Reset, либо нажмите <CTRL+U> (последних два варианта возможны в версии, которая работает под Windows).
Затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора
CLIPS> (run)
либо выберите в меню команду ExecutionORun, либо нажмите <CTRL+R> (последних два варианта возможны в версии, которая работает под Windows).
Вответ программа должна вывести сообщение hello, world, знакомое всем программистам мира. Для повторного запуска программы повторите команды reset и run.
Если в меню Execution^Watch ранее был установлен флажок Rules или перед запуском программы на выполнение вы ввели в командную строку команду watch rules, то на экране появится результат трассировки процесса выполнения
CLIPS> (run) FIRE 1 start: f-0 hello, world
Вэтом сообщении в строке, начинающейся с FIRE, выведена информация об активизированном правиле: start — это имя правила, а f-0 — имя факта, который "удовлетворил" условие в этом правиле. Команда watch позволяет организовать несколько разных режимов трассировки, с деталями которых вы можете познакомиться в Руководстве пользователя. Если перед запуском программы вы ввели
CLIPS> (dribble-on "dribble.dp") TRUE
то выведенный протокол трассировки будет сохранен в файле dribble.dp. Сохранение протокола прекратится после ввода команды
CLIPS> (dribble-off) TRUE
Это очень удобная опция, особенно на этапе освоения языка.
2.4. Использование шаблонов
9
Для определения фактов можно использовать не только списочные структуры, но и шаблоны, которые напоминают простые записи. (Шаблоны в CLIPS не имеют ничего общего с шаблонами C++.) Шаблон выглядит примерно так:
(deftemplate student "a student record"
(slot name (type STRING)) (slot age (type NUMBER) (default 18))
Каждое определение шаблона состоит из произвольного имени шаблона, необязательного комментария и некоторого количества определений слотов. Слот включает поле данных, например name, и тип данных, например STRING. Можно указать и значение по умолчанию, как в приведенном выше примере.
Если в программу включено приведенное выше определение шаблона, то выражение
(deffacts students (student (name fred))
(student (name freda) (age 19)) )
приведет к тому, что в базу фактов после выполнения команды reset будет добавлено
(student (name fred) (age 18)) (student (name freda) (age 19))
ЛАБОРАТОРНАЯ РАБОТА №2. «Логическое программирование» Цель работы:
1.Изучение языка логического программирования Турбо-Пролог.
2.Создание экспертной системы на языке логического программирования PROLOG, содержащей базу правил, начальные факты и возможные исходы.
Теоретическое введение.
Синтаксис и семантика Пролог-программ
3.1. Объекты данных
На Рис.3.1. приведена классификация объектов данных Пролога. Прологсистема распознает тип объекта по его синтаксической форме в тексте программы.
Рис.3.1. Обьекты данных Пролога.
простые объекты |
|
структуры |
|
|
|
константы переменные
атомы |
|
числа |
|
|
|
10