Функциональное программирование и

advertisement
(Основные понятия) по дисциплине
«Функциональное программирование и интеллектуальные системы»
Екатеринбург 2015
1
Оглавление
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ ......................................................................................... 3
ЯЗЫКИ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ .......................................................................... 4
ФУНКЦИИ ВЫСШИХ ПОРЯДКОВ ........................................................................................................ 6
ЧИСТЫЕ ФУНКЦИИ............................................................................................................................. 6
РЕКУРСИЯ ........................................................................................................................................... 7
ПОДХОД К ВЫЧИСЛЕНИЮ АРГУМЕНТОВ .......................................................................................... 8
ФП В НЕФУНКЦИОНАЛЬНЫХ ЯЗЫКАХ ............................................................................................... 8
СТИЛИ ПРОГРАММИРОВАНИЯ.............................................................................................................. 9
ОСОБЕННОСТИ................................................................................................................................... 9
СИЛЬНЫЕ СТОРОНЫ .......................................................................................................................... 9
НЕДОСТАТКИ ................................................................................................................................... 11
КЛАССИФИКАЦИЯ ИНТЕЛЛЕКТУАЛЬНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ .......................................... 11
СИСТЕМЫ С ИНТЕЛЛЕКТУАЛЬНЫМ ИНТЕРФЕЙСОМ....................................................................... 12
ЭКСПЕРТНЫЕ СИСТЕМЫ .................................................................................................................. 14
САМООБУЧАЮЩИЕСЯ СИСТЕМЫ .................................................................................................... 16
ИНДУКТИВНЫЕ СИСТЕМЫ ............................................................................................................... 16
НЕЙРОННЫЕ СЕТИ ........................................................................................................................... 17
ИНФОРМАЦИОННЫЕ ХРАНИЛИЩА................................................................................................. 18
АДАПТИВНЫЕ ИНФОРМАЦИОННЫЕ СИСТЕМЫ .............................................................................. 19
2
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ
Функциональное
программирование—
раздел
дискретной
математики парадигма программирования, в которой процесс вычисления
трактуется как вычисление значений функций в математическом понимании
последних (в отличие от функций как подпрограмм в процедурном
программировании).
Противопоставляется парадигме императивного программирования,
которая описывает процесс вычислений как последовательное изменение
состояний (в значении, подобном таковому в теории автоматов). При
необходимости, в функциональном программировании вся совокупность
последовательных состояний вычислительного процесса представляется
явным образом, например, как список.
Функциональное программирование
предполагает обходиться
вычислением результатов функций от исходных данных и результатов
других функций, и не предполагает явного хранения состояния программы.
Соответственно, не предполагает оно и изменяемость этого состояния (в
отличие от императивного, где одной из базовых концепций является
переменная, хранящая своё значение и позволяющая менять его по мере
выполнения алгоритма).
На практике отличие математической функции от понятия «функции»
в императивном программировании заключается в том, что императивные
функции могут опираться не только на аргументы, но и на состояние
внешних по отношению к функции переменных, а также иметь побочные
эффекты и менять состояние внешних переменных. Таким образом, в
императивном программировании при вызове одной и той же функции с
одинаковыми параметрами, но на разных этапах выполнения алгоритма,
можно получить разные данные на выходе из-за влияния на функцию
состояния переменных. А в функциональном языке при вызове функции с
одними и теми же аргументами мы всегда получим одинаковый результат:
выходные данные зависят только от входных. Это позволяет средам
выполнения программ на функциональных языках кешировать результаты
функций и вызывать их в порядке, не определяемом алгоритмом и
распараллеливать их без каких-либо дополнительных действий со стороны
программиста.
λ-исчисления
являются
основой
для
функционального
программирования, многие функциональные языки можно рассматривать как
«надстройку» над ними.
3
ЯЗЫКИ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ
Наиболее известными языками функционального программирования
являются:
LISP—(Джон МакКарти, 1958) и множество его диалектов,
наиболее современные из которых:

Scheme

Clojure

Common Lisp
 Erlang — (Joe Armstrong, 1986) функциональный язык с
поддержкой процессов.
 APL— предшественник современных научных вычислительных
сред, таких как MATLAB.
 ML (Робин Милнер,1979, из ныне используемых диалектов
известны Standard ML и Objective CAML).
 F#— функциональный язык семейства ML для платформы .NET
 Scala
 Miranda (Дэвид Тёрнер, 1985, который впоследствии дал развитие
языку Haskell).
 Nemerle— гибридный функционально/императивный язык.
 XSLT и XQuery
 Haskell — чистый функциональный. Назван в честьХаскелла
Карри.

Ещё не полностью функциональные изначальные версии и Lisp и APL
внесли особый вклад в создание и развитие функционального
программирования. Более поздние версии Lisp, такие как Scheme, а также
различные варианты APL поддерживали все свойства и концепции
функционального языка.
Как правило, интерес к функциональным языкам программирования,
особенно чисто функциональным, был скорее научный, нежели
коммерческий. Однако, такие примечательные языки как Erlang, OCaml,
Haskell, Scheme (после 1986) а также специфические R (статистика), Wolfram
(символьная математика), J и K (финансовый анализ), и XSLT (XML)
находили применение в индустрии коммерческого программирования. Такие
широко распространенные декларативные языки как SQL и Lex/Yacc
содержат некоторые элементы функционального программирования,
например, они остерегаются использовать переменные. Языки работы с
электронными таблицами также можно рассматривать как функциональные,
потому что в ячейках электронных таблиц задаётся массив функций, как
4
правило зависящих лишь от других ячеек, а при желании смоделировать
переменные приходится прибегать к возможностям императивного языка
макросов.
Лямбда-исчисление стало теоретической базой для описания и
вычисления функций. Являясь математической абстракцией, а не языком
программирования, оно составило базис почти всех языков функционального
программирования на сегодняшний день. Сходное теоретическое понятие,
комбинаторная логика, является более абстрактным, нежели λ-исчисления и
было создано раньше. Эта логика используется в некоторых эзотерических
языках, например в Unlambda. И λ-исчисление, и комбинаторная логика
были разработаны для более ясного и точного описания принципов и основ
математики.
Первым функциональным языком был Lisp, созданный Джоном
Маккарти в период его работы в Массачусетском технологическом институте
в конце пятидесятых и реализованный, первоначально, для IBM 700/7000
(англ.)русск. Lisp ввел множество понятий функционального языка, хотя при
этом исповедовал не только парадигму функционального программирования.
Дальнейшим развитием Лиспа стали такие языки как Scheme и Dylan.
Язык обработки информации (Information Processing Language
(англ.)русск., IPL) иногда определяется как самый первый машинный
функциональный язык . Это язык ассемблерного типа для работы со списком
символов. В нём было понятие «генератора», который использовал функцию
в качестве аргумента, а также, поскольку это язык ассемблерного уровня, он
может позиционироваться как язык, имеющий функции высшего порядка.
Однако, в целом IPL акцентирован на использование императивных понятий.
Кеннет Е. Айверсон разработал язык APL в начале шестидесятых,
документировав его в своей книге A Programming Language (ISBN
9780471430148). APL оказал значительное влияние на язык FP (англ.) русск.,
созданный Джоном Бэкусом. В начале девяностых Айверсон и Роджер Хуэй
(англ.) русск. создали преемника APL — язык программирования J. В
середине девяностых Артур Витни (англ.)русск., ранее работавший с
Айверсоном, создал язык K, который впоследствии использовался в
финансовой индустрии на коммерческой основе.
В семидесятых в университете Эдинбурга Робин Милнер создал язык
ML, а Дэвид Тернер начинал разработку языка SASL в университете СентЭндрюса и, впоследствии, язык Miranda в университете города Кент. В
конечном итоге на основе ML были созданы несколько языков, среди
которых наиболее известные Objective Caml и Standard ML. Также в
семидесятых осуществлялась разработка языка программирования,
построенного по принципу Scheme (реализация не только функциональной
парадигмы), получившего описание в известной работе «Lambda Papers», а
5
также в книге восемьдесят пятого года «Structure and Interpretation of
Computer
Programs»,
в
которой
принципы
функционального
программирования были донесены до более широкой аудитории.
В восьмидесятых Пер Мартин - Лёф создал интуиционистскую
теорию типов (также называемую конструктивной). В этой теории
функциональное
программирование
получило
конструктивное
доказательство того, что ранее было известно как зависимый тип. Это дало
мощный толчок к развитию диалогового доказательства теорем и к
последующему созданию множества функциональных языков.
Haskell был создан в конце восьмидесятых в попытке соединить
множество идей, полученных в ходе исследования функционального
программирования.
Некоторые
концепции
и
парадигмы
специфичны
для
функционального программирования и в основном чужды императивному
программированию
(включая
объектно-ориентированное
программирование). Тем не менее, языки программирования обычно
представляют собой гибрид нескольких парадигм программирования,
поэтому «большей частью императивные» языки программирования могут
использовать какие-либо из этих концепций.
ФУНКЦИИ ВЫСШИХ ПОРЯДКОВ
Основная статья: Функция высшего порядка
Функции высших порядков — это такие функции, которые могут
принимать в качестве аргументов и возвращать другие функции.
Математики такую функцию чаще называют оператором, например,
оператор взятия производной или оператор интегрирования.
Функции высших порядков позволяют использовать карринг преобразование функции от пары аргументов в функцию, берущую свои
аргументы по одному. Это преобразование получило свое название в честь Х.
Карри.
ЧИСТЫЕ ФУНКЦИИ
Чистыми называют функции, которые не имеют побочных эффектов
ввода-вывода и памяти (они зависят только от своих параметров и
возвращают только свой результат). Чистые функции обладают несколькими
полезными свойствами, многие из которых можно использовать для
оптимизации кода:
Если результат чистой функции не используется, её вызов может
быть удален без вреда для других выражений.
 Результат вызова чистой функции может быть мемоизирован, то
есть сохранен в таблице значений вместе с аргументами вызова. Если в

6
дальнейшем функция вызывается с этими же аргументами, ее результат
может быть взят прямо из таблицы, не вычисляясь (иногда это называется
принципом прозрачности ссылок). Мемоизация, ценой небольшого
расхода памяти, позволяет существенно увеличить производительность и
уменьшить порядок роста некоторых рекурсивных алгоритмов.
 Если нет никакой зависимости по данным между двумя чистыми
функциями, то порядок их вычисления можно поменять или
распараллелить (говоря иначе вычисление чистых функций удовлетворяет
принципам thread-safe)
 Если весь язык не допускает побочных эффектов, то можно
использовать любую политику вычисления. Это предоставляет свободу
компилятору комбинировать и реорганизовывать вычисление выражений
в программе (например, исключить древовидные структуры).
Хотя
большинство
компиляторов
императивных
языков
программирования распознают чистые функции и удаляют общие
подвыражения для вызовов чистых функций, они не могут делать это всегда
для предварительно скомпилированных библиотек, которые, как правило, не
предоставляют эту информацию. Некоторые компиляторы, такие как gcc, в
целях оптимизации предоставляют программисту ключевые слова для
обозначения чистых функций. Fortran 95 позволяет обозначать функции как
«pure» (чистые).
РЕКУРСИЯ
Основная статья: Рекурсия
В функциональных языках цикл обычно реализуется в виде рекурсии.
Строго говоря, в функциональной парадигме программирования нет такого
понятия, как цикл. Рекурсивные функции вызывают сами себя, позволяя
операции выполняться снова и снова. Для использования рекурсии может
потребоваться большой стек, но этого можно избежать в случае хвостовой
рекурсии. Хвостовая рекурсия может быть распознана и оптимизирована
компилятором в код, получаемый после компиляции аналогичной итерации в
императивном языке программирования.[15] Стандарты языка Scheme
требуют
распознавать
и
оптимизировать
хвостовую
рекурсию.
Оптимизировать хвостовую рекурсию можно путём преобразования
программы в стиле использования продолжений при её компиляции, как
один из способов.
Рекурсивные функции можно обобщить с помощью функций высших
порядков, используя, например, катаморфизм и анаморфизм (или «свертка» и
«развертка»). Функции такого рода играют роль такого понятия как цикл в
императивных языках программирования.
7
ПОДХОД К ВЫЧИСЛЕНИЮ АРГУМЕНТОВ
Функциональные языки можно классифицировать по тому, как
обрабатываются аргументы функции в процессе её вычисления. Технически
различие заключается в денотационной семантике выражения. К примеру,
при строгом подходе к вычислению выражения
print(len([2+1, 3*2, 1/0, 5-4]))
на выходе будет ошибка, так как в третьем элементе списка
присутствует деление на ноль. При нестрогом подходе значением выражения
будет 4, поскольку для вычисления длины списка значения его элементов,
строго говоря, не важны и могут вообще не вычисляться. При строгом
(аппликативном) порядке вычисления заранее подсчитываются значения всех
аргументов перед вычислением самой функции. При нестрогом подходе
(нормальный порядок вычисления) значения аргументов не вычисляются до
тех пор, пока их значение не понадобится при вычислении функции[17].
Как правило, нестрогий подход реализуется в виде редукции графа.
Нестрогое вычисление используется по умолчанию в нескольких чисто
функциональных языках, в том числе Miranda, Clean и Haskell.
ФП В НЕФУНКЦИОНАЛЬНЫХ ЯЗЫКАХ
Принципиально нет препятствий для написания программ в
функциональном стиле на языках, которые традиционно не считаются
функциональными, точно так же, как программы в объектноориентированном стиле можно писать на структурных языках. Некоторые
императивные языки поддерживают типичные для функциональных языков
конструкции, такие как функции высшего порядка и списковые включения
(list comprehensions), что облегчает использование функционального стиля в
этих языках. Примером может быть функциональное программирование на
языке Python. Другим примером является язык Ruby, который имеет
возможность создания как lambda-объектов, так и возможность
организации анонимных функций высшего порядка через блок с помощью
конструкции yield.
В языке C указатели на функцию в качестве типов аргументов могут
быть использованы для создания функций высшего порядка. Функции
высшего порядка и отложенная списковая структура реализованы в
библиотеках С++. В языке C# версии 3.0 и выше можно использовать λфункции для написания программы в функциональном стиле. В сложных
языках, типа Алгол-68, имеющиеся средства метапрограммирования
(фактически, дополнения языка новыми конструкциями) позволяют создать
специфичные для функционального стиля объекты данных и программные
конструкции, после чего можно писать функциональные программы с их
использованием.
8
СТИЛИ ПРОГРАММИРОВАНИЯ
Императивные программы имеют склонность акцентировать
последовательности шагов для выполнения какого-то действия, а
функциональные программы к расположению и композиции функций, часто
не обозначая точной последовательности шагов. Простой пример двух
решений одной задачи (используется один и тот же язык Python)
иллюстрирует это.
# императивный стиль
target = [] # создать пустой список
for item in source_list: # для каждого элемента исходного списка
trans1 = G(item) # применить функцию G()
trans2 = F(trans1) # применить функцию F()
target.append(trans2) # добавить преобразованный элемент в список
Функциональная версия выглядит по-другому:
# функциональный стиль
# языки ФП часто имеют встроенную функцию compose()
compose2 = lambda A, B: lambda x: A(B(x))
target = map(compose2(F, G), source_list)
В отличие от императивного стиля, описывающего шаги, ведущие к
достижению цели, функциональный стиль описывает математические
отношения между данными и целью.
ОСОБЕННОСТИ
Основной особенностью функционального программирования,
определяющей как преимущества, так и недостатки данной парадигмы,
является то, что в ней реализуется модель вычислений без состояний. Если
императивная программа на любом этапе исполнения имеет состояние, то
есть совокупность значений всех переменных, и производит побочные
эффекты, то чисто функциональная программа ни целиком, ни частями
состояния не имеет и побочных эффектов не производит. То, что в
императивных языках делается путём присваивания значений переменным, в
функциональных достигается путём передачи выражений в параметры
функций. Непосредственным следствием становится то, что чисто
функциональная программа не может изменять уже имеющиеся у неё
данные, а может лишь порождать новые путём копирования и/или
расширения старых. Следствием того же является отказ от циклов в пользу
рекурсии.
СИЛЬНЫЕ СТОРОНЫ
Повышение надёжности кода
Привлекательная сторона вычислений без состояний — повышение
надёжности кода за счёт чёткой структуризации и отсутствия необходимости
9
отслеживания побочных эффектов. Любая функция работает только с
локальными данными и работает с ними всегда одинаково, независимо от
того, где, как и при каких обстоятельствах она вызывается. Невозможность
мутации данных при пользовании ими в разных местах программы
исключает появление трудно обнаруживаемых ошибок (таких, например, как
случайное присваивание неверного значения глобальной переменной в
императивной программе).
Удобство организации модульного тестирования
Поскольку функция в функциональном программировании не может
порождать побочные эффекты, менять объекты нельзя как внутри области
видимости, так и снаружи (в отличие от императивных программ, где одна
функция может установить какую-нибудь внешнюю переменную,
считываемую второй функцией). Единственным эффектом от вычисления
функции является возвращаемый ей результат, и единственный фактор,
оказывающий влияние на результат — это значения аргументов.
Таким образом, имеется возможность протестировать каждую
функцию в программе, просто вычислив её от различных наборов значений
аргументов. При этом можно не беспокоиться ни о вызове функций в
правильном порядке, ни о правильном формировании внешнего состояния.
Если любая функция в программе проходит модульные тесты, то можно быть
уверенным в качестве всей программы. В императивных программах
проверка возвращаемого значения функции недостаточна: функция может
модифицировать внешнее состояние, которое тоже нужно проверять, чего не
нужно делать в функциональных программах.
Возможности оптимизации при компиляции
Традиционно
упоминаемой
положительной
особенностью
функционального программирования является то, что оно позволяет
описывать программу в так называемом «декларативном» виде, когда
жесткая последовательность выполнения многих операций, необходимых для
вычисления результата, в явном виде не задаётся, а формируется
автоматически в процессе вычисления функций. Это обстоятельство, а также
отсутствие состояний даёт возможность применять к функциональным
программам достаточно сложные методы автоматической оптимизации.
Возможности параллелизма
Ещё одним преимуществом функциональных программ является то,
что они предоставляют широчайшие возможности для автоматического
распараллеливания вычислений. Поскольку отсутствие побочных эффектов
гарантировано, в любом вызове функции всегда допустимо параллельное
вычисление двух различных параметров — порядок их вычисления не может
оказать влияния на результат вызова.
10
НЕДОСТАТКИ
Недостатки функционального программирования вытекают из тех же
самых его особенностей. Отсутствие присваиваний и замена их на
порождение новых данных приводят к необходимости постоянного
выделения и автоматического освобождения памяти, поэтому в системе
исполнения функциональной программы обязательным компонентом
становится высокоэффективный сборщик мусора. Нестрогая модель
вычислений приводит к непредсказуемому порядку вызова функций, что
создает проблемы при вводе-выводе, где порядок выполнения операций
важен. Кроме того, очевидно, функции ввода в своем естественном виде
(например, getchar из стандартной библиотеки языка C) не являются
чистыми, поскольку способны возвращать различные значения для одних и
тех же аргументов, и для устранения этого требуются определенные
ухищрения.
Для преодоления недостатков функциональных программ уже первые
языки функционального программирования включали не только чисто
функциональные
средства,
но
и
механизмы
императивного
программирования (присваивание, цикл, «неявный PROGN» были уже в
LISPе). Использование таких средств позволяет решить некоторые
практические проблемы, но означает отход от идей (и преимуществ)
функционального программирования и написание императивных программ
на функциональных языках. В чистых функциональных языках эти проблемы
решаются другими средствами, например, в языке Haskell ввод-вывод
реализован
при
помощи
монад
нетривиальной
концепции,
позаимствованной из теории категорий.
КЛАССИФИКАЦИЯ ИНТЕЛЛЕКТУАЛЬНЫХ ИНФОРМАЦИОННЫХ
СИСТЕМ
Интеллектуальная информационная система (ИИС) основана на
концепции использования базы знаний для генерации алгоритмов решения
прикладных задач различных классов в зависимости от конкретных
информационных потребностей пользователей.
Для ИИС характерны следующие признаки:
 развитые коммуникативные способности;
 умение решать сложные плохо формализуемые задачи;
 способность к самообучению;
 адаптивность.
11
Каждому из перечисленных признаков условно соответствует свой
класс ИИС. Различные системы могут обладать одним или несколькими
признаками интеллектуальности с различной степенью проявления.
Средства ИИ могут использоваться для реализации различных функций,
выполняемых ИИС. На рисунке приведена классификация ИИС, признаками
которой являются следующие интеллектуальные функции:




коммуникативные способности - способ взаимодействия конечного
пользователя с системой;
решение сложных плохо формализуемых задач, которые требуют
построения оригинального алгоритма решения в зависимости от
конкретной ситуации, характеризующейся неопределенностью и
динамичностью исходных данных и знаний;
способность к самообучению - умение системы автоматически
извлекать знания из накопленного опыта и применять их для решения
задач;
адаптивность - способность системы к развитию в соответствии с
объективными изменениями области знаний.
СИСТЕМЫ С ИНТЕЛЛЕКТУАЛЬНЫМ ИНТЕРФЕЙСОМ
Применение ИИ для усиления коммуникативных способностей
информационных систем привело к появлению систем с интеллектуальным
интерфейсом, среди которых можно выделить следующие типы.
1. Интеллектуальные базы данных. Позволяют в отличие от
традиционных БД обеспечивать выборку необходимой информации, не
12
2.
3.
4.
5.
присутствующей в явном виде, а выводимой из совокупности
хранимых данных.
Естественно-языковой интерфейс. Применяется для доступа к
интеллектуальным
базам
данных,
контекстного
поиска
документальной текстовой информации, голосового ввода команд в
системах управления, машинного перевода с иностранных языков. Для
реализации
ЕЯ-интерфейса
необходимо
решить
проблемы
морфологического, синтаксического и семантического анализа, а также
задачу синтеза высказываний на естественном языке. При
морфологическом анализе осуществляются распознавание и проверка
правильности написания слов в словаре. Синтаксический контроль
предполагает разложение входных сообщений на отдельные
компоненты, проверку соответствия грамматическим правилам
внутреннего представления знаний и выявление недостающих частей.
Семантический анализ обеспечивает установление смысловой
правильности синтаксических конструкций. В отличие от анализа
синтез высказываний заключается в преобразовании цифрового
представления информации в представление на естественном языке.
Гипертекстовые системы. Используются для реализации поиска по
ключевым словам в базах данных с текстовой информацией. Для более
полного отражения различных смысловых отношений терминов
требуется сложная семантическая организация ключевых слов.
Решение этих задач осуществляется с помощью интеллектуальных
гипертекстовых систем, в которых механизм поиска сначала работает с
базой знаний ключевых слов, а затем - с самим текстом. Аналогичным
образом проводится поиск мультимедийной информации, включающей
кроме текста графическую информацию, аудио- и видеообразы.
Системы контекстной помощи. Относятся к классу систем
распространения знаний. Такие системы являются, как правило,
приложениями к документации. Системы контекстной помощи частный случай гипертекстовых и ЕЯ-систем. В них пользователь
описывает проблему, а система на основе дополнительного диалога
конкретизирует ее и выполняет поиск относящихся к ситуации
рекомендаций. В обычных гипертекстовых системах, наоборот,
компьютерные приложения навязывают пользователю схему поиска
требуемой информации.
Системы когнитивной графики. Ориентированы на общение с
пользователем ИИС посредством графических образов, которые
генерируются
в
соответствии
с
изменениями
параметров
моделируемых или наблюдаемых процессов. Когнитивная графика
позволяет в наглядном и выразительном виде представить множество
параметров, характеризующих изучаемое явление, освобождает
пользователя от анализа тривиальных ситуаций, способствует
быстрому
освоению
программных
средств
и
повышению
13
конкурентоспособности
разрабатываемых
ИИС.
Применение
когнитивной графики особенно актуально в системах мониторинга и
оперативного управления, в обучающих и тренажерных системах, в
оперативных системах принятия решений, работающих в режиме
реального времени.
ЭКСПЕРТНЫЕ СИСТЕМЫ
Экспертные системы как самостоятельное направление в искусственном
интеллекте сформировалось в конце 1970-х годов. История ЭС началась с
сообщения японского комитета по разработке ЭВМ пятого поколения, в
котором основное внимание уделялось развитию "интеллектуальных
способностей" компьютеров с тем, чтобы они могли оперировать не только
данными, но и знаниями, как это делают специалисты (эксперты) при
выработке умозаключений.
Область исследования ЭС называют "инженерией знаний". Этот термин
был введен Е. Фейгенбаумом и в его трактовке означает "привнесение
принципов и инструментария из области искусственного интеллекта в
решение трудных прикладных проблем, требующих знаний экспертов".
Другими словами, ЭС применяются для решения неформализованных
проблем, к которым относят задачи, обладающие одной (или несколькими)
из следующих характеристик:





задачи не могут быть представлены в числовой форме;
исходные данные и знания о предметной области обладают
неоднозначностью, неточностью, противоречивостью;
цели нельзя выразить с помощью четко определенной целевой
функции;
не существует однозначного алгоритмического решения задачи;
алгоритмическое решение существует, но его нельзя использовать по
причине большой размерности пространства решений и ограничений
на ресурсы (времени, памяти).
Главное отличие ЭС и систем искусственного интеллекта от систем
обработки данных состоит в том, что в них используется символьный, а не
числовой способ представления данных, а в качестве методов обработки
информации применяются процедуры логического вывода и эвристического
поиска решений.
ЭС охватывают самые разные предметные области, среди которых
лидируют бизнес, производство, медицина, проектирование и системы
управления.
14
Во многих случаях ЭС являются инструментом, усиливающим
интеллектуальные способности эксперта. Кроме того, ЭС может выступать в
роли:



консультанта для неопытных или непрофессиональных пользователей;
ассистента эксперта-человека в процессах анализа вариантов решений;
партнера эксперта в процессе решения задач, требующих привлечения
знаний из разных предметных областей.
Для классификации ЭС используются следующие признаки:




способ формирования решения;
способ учета временного признака;
вид используемых данных и знаний;
число используемых источников знаний.
По способу формирования решения ЭС можно разделить на
анализирующие и синтезирующие. В системах первого типа осуществляется
выбор решения из множества известных решений на основе анализа знаний,
в системах второго типа решение синтезируется из отдельных фрагментов
знаний.
В зависимости от способа учета временного признака ЭС делят на
статические и динамические. Статические ЭС предназначены для решения
задач с неизменяемыми в процессе решения данными и знаниями, а
динамические ЭС допускают такие изменения.
По видам используемых данных и знаний различают ЭС с
детерминированными
и
неопределенными
знаниями.
Под
неопределенностью знаний и данных понимаются их неполнота,
ненадежность, нечеткость.
ЭС могут создаваться с использованием одного или нескольких
источников знаний.
В соответствии с перечисленными признаками можно выделить четыре
основных класса ЭС (см. рис.):




классифицирующие,
доопределяющие,
трансформирующие
мультиагентные.
15
САМООБУЧАЮЩИЕСЯ СИСТЕМЫ
Самообучающиеся интеллектуальные системы основаны на методах
автоматической классификации ситуаций из реальной практики, или на
методах обучения на примерах. Примеры реальных ситуаций составляют так
называемую обучающую выборку, которая формируется в течение
определенного исторического периода. Элементы обучающей выборки
описываются множеством классификационных признаков.
Стратегия "обучения с учителем" предполагает задание специалистом
для каждого примера значений признаков, показывающих его
принадлежность к определенному классу ситуаций. При обучении "без
учителя" система должна самостоятельно выделять классы ситуаций по
степени близости значений классификационных признаков.
В процессе обучения проводится автоматическое построение
обобщающих правил или функций, описывающих принадлежность ситуаций
к классам, которыми система впоследствии будет пользоваться при
интерпретации незнакомых ситуаций. Из обобщающих правил, в свою
очередь, автоматически формируется база знаний, которая периодически
корректируется по мере накопления информации об анализируемых
ситуациях.
Построенные в соответствии с этими принципами самообучающиеся
системы имеют следующие недостатки:



относительно низкую адекватность баз знаний возникающим реальным
проблемам из-за неполноты и/или зашумленности обучающей
выборки;
низкую степень объяснимости полученных результатов;
поверхностное описание проблемной области и узкую направленность
применения из-за ограничений в размерности признакового
пространства.
ИНДУКТИВНЫЕ СИСТЕМЫ
Индуктивные системы позволяют обобщать примеры на основе
принципа индукции "от частного к общему". Процедура обобщения сводится
к классификации примеров по значимым признакам. Алгоритм
классификации примеров включает следующие основные шаги.
1. Выбор классификационного признака из множества заданных.
2. Разбиение множества примеров на подмножества по значению
выбранного признака.
16
3. Проверка принадлежности каждого подмножества примеров одному из
классов.
4. Проверка окончания процесса классификации. Если какое-то
подмножество примеров принадлежит одному подклассу, т.е. у всех
примеров
этого
подмножества
совпадает
значение
классификационного
признака,
то
процесс
классификации
заканчивается.
5. Для подмножеств примеров с несовпадающими значениями
классификационных признаков процесс распознавания продолжается,
начиная с первого шага. При этом каждое подмножество примеров
становится классифицируемым множеством.
НЕЙРОННЫЕ СЕТИ
Представляют собой классический пример технологии, основанной на
примерах. Нейронные сети - обобщенное название группы математических
алгоритмов, обладающих способностью обучаться на примерах, "узнавая"
впоследствии черты встреченных образцов и ситуаций. Благодаря этой
способности нейронные сети используются при решении задач обработки
сигналов и изображений, распознавания образов, а также для
прогнозирования.
Нейронная сеть - это кибернетическая модель нервной системы, которая
представляет собой совокупность большого числа сравнительно простых
элементов - нейронов, топология соединения которых зависит от типа сети.
Чтобы создать нейронную сеть для решения какой-либо конкретной задачи,
следует выбрать способ соединения нейронов друг с другом и подобрать
значения параметров межнейронных соединений.
В системах, основанных на прецедентах, БЗ содержит описания
конкретных ситуаций (прецеденты). Поиск решения осуществляется на
основе аналогий и включает следующие этапы:






получение информации о текущей проблеме;
сопоставление полученной информации со значениями признаков
прецедентов из базы знаний;
выбор прецедента из базы знаний, наиболее близкого к
рассматриваемой проблеме;
адаптация выбранного прецедента к текущей проблеме;
проверка корректности каждого полученного решения;
занесение детальной информации о полученном решении в БЗ.
Прецеденты описываются множеством признаков, по которым строятся
индексы быстрого поиска. Однако в системах, основанных на прецедентах, в
отличие от индуктивных систем допускается нечеткий поиск с получением
17
множества допустимых альтернатив, каждая из которых оценивается
некоторым коэффициентом уверенности. Наиболее эффективные решения
адаптируются к реальным ситуациям с помощью специальных алгоритмов.
Системы,
основанные
на
прецедентах,
применяются
распространения знаний и в системах контекстной помощи.
для
ИНФОРМАЦИОННЫЕ ХРАНИЛИЩА
ИХ отличаются от интеллектуальных баз, данных, тем, что
представляют собой хранилища значимой информации, регулярно
извлекаемой из оперативных баз данных. Хранилище данных - это
предметно-ориентированное, интегрированное, привязанное ко времени,
неизменяемое собрание данных, применяемых для поддержки процессов
принятия управленческих решений. Предметная ориентация означает, что
данные объединены в категории и хранятся в соответствии с теми областями,
которые они описывают, а не с приложениями, которые их используют. В
хранилище данные интегрируются в целях удовлетворения требований
предприятия в целом, а не отдельной функции бизнеса. Привязанность
данных ко времени выражает их "историчность", т.е. атрибут времени всегда
явно присутствует в структурах хранилища данных. Неизменяемость
означает, что, попав однажды в хранилище, данные уже не изменяются в
отличие от оперативных систем, где данные присутствуют только в
последней версии, поэтому постоянно меняются.
Технологии извлечения знаний из хранилищ данных основаны на
методах статистического анализа и моделирования, ориентированных на
поиск моделей и отношений, скрытых в совокупности данных. Эти модели
могут в дальнейшем использоваться для оптимизации деятельности
предприятия или фирмы.
Для извлечения значимой информации из хранилищ данных имеются
специальные методы (OLAP-анализа, Data Mining или Knowledge Discovery),
основанные на применении методов мате-матической статистики, нейронных
сетей, индуктивных методов построения деревьев решений и др.
Технология OLAP (On-line Analytical Processing - оперативный анализ
данных) предоставляет пользователю средства для формирования и проверки
гипотез о свойствах данных или отношениях между ними на основе
разнообразных запросов к базе данных. Они применяются на ранних стадиях
процесса извлечения знаний, помогая аналитику сфокусировать внимание на
важных переменных. Средства Data Mining отличаются от OLAP тем, что
кроме проверки предполагаемых зависимостей они способны самостоятельно
(без участия пользователя) генерировать гипотезы о закономерностях,
существующих в данных, и строить модели, позволяющие количественно
18
оценить степень взаимного влияния исследуемых факторов на основе
имеющейся информации.
АДАПТИВНЫЕ ИНФОРМАЦИОННЫЕ СИСТЕМЫ
Потребность в адаптивных информационных системах возникает в тех
случаях, когда поддерживаемые ими проблемные области постоянно
развиваются. В связи с этим адаптивные системы должны удовлетворять
ряду специфических требований, а именно:


адекватно отражать знания проблемной области в каждый момент
времени;
быть пригодными для легкой и быстрой реконструкции при изменении
проблемной среды.
Адаптивные свойства информационных систем обеспечиваются за счет
интеллектуализации их архитектуры. Ядром таких систем является
постоянно развиваемая модель проблемной области, поддерживаемая в
специальной базе знаний - репозитории. Ядро системы управляет
процессами
генерации
или
переконфигурирования
программного
обеспечения.
В процессе разработки адаптивных информационных систем
применяется оригинальное или типовое проектирование. Оригинальное
проектирование предполагает разработку информационной системы с
"чистого листа" на основе сформулированных требований. Реализация этого
подхода основана на использовании систем автоматизированного
проектирования, или CASE-технологий (Designer2000, SilverRun, Natural
Light Storm и др.).
При типовом проектировании осуществляется адаптация типовых
разработок к особенностям проблемной области. Для реализации этого
подхода применяются инструментальные средства компонентного
(сборочного) проектирования информационных систем (R/3, BAAN IV,
Prodis и др.). Главное отличие подходов состоит в том, что при
использовании CASE-технологии на основе репозитория при изменении
проблемной области каждый раз выполняется генерация программного
обеспечения,
а
при
использовании
сборочной
технологии
конфигурирование программ и только в редких случаях - их переработка.
19
Download