ОСНОВЫ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА Козырева Г.Ф.

advertisement
АРМАВИРСКИЙ ГОСУДАРСТВЕННЫЙ
ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ
Козырева Г.Ф.
ОСНОВЫ ИСКУССТВЕННОГО
ИНТЕЛЛЕКТА
УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ
ДЛЯ СТУДЕНТОВ, ОБУЧАЮЩИХСЯ ПО СПЕЦИАЛЬНОСТИ «ИНФОРМАТИКА»
АРМАВИР 2004
4
Печатается по решению УМС АГПУ
Рецензент: Бисчоков Р. М., кандидат физико-математических наук, доцент,
начальник Интернет-центра Кабардино-Балкарской ГСХА
Козырева Г.Ф. Основы искусственного интеллекта. Учебно-методическое
пособие для студентов, обучающихся по специальности «информатика». –
Армавир, 2004г.
Рассматриваются
базовые
понятия
искусственного
интеллекта,
направления и перспективы развития исследований в области искусственного
интеллекта, основы языка логического программирования ПРОЛОГ.
Учебно-методическое пособие предназначено для студентов, обучающихся
по специальности «информатика», а также может использоваться всеми, кто
интересуется вопросами искусственного интеллекта и логического
программирования.
5
Оглавление
Введение………………………………………………..……………………... 4
1. Искусственный интеллект: предмет, история
развития, направления исследований ……..………………….. 5
1.1. Направления исследований в области
искусственного интеллекта…..…………………………………………….. 5
1.2. Основные задачи, решаемые в области
искусственного интеллекта….…………………………..………………..... 6
3.
Система знаний………………………………………………………..
Модели представления знаний………………………………….
4.
Экспертные системы………………………………………………...12
2.
8
9
3.1. Семантические сети……………………………………………………..9
3.2. Фреймовая модель ………………………………………….…………10
3.3. Продукционная модель………………………………………………..11
3.4. Логическая модель……………………………………………………..12
4.1. Назначение экспертных систем……………………………………….12
4.2. Типы задач, решаемых с помощью экспертных систем…………….14
4.3. Структура экспертных систем………………………………………...15
4.4. Основные этапы разработки экспертных систем……………………16
4.5. Инструментальные средства разработки экспертных систем………18
5.
ПРОЛОГ - язык логического программирования ……….19
5.1. Общие сведения о ПРОЛОГе…………………………………………19
5.2. Предложения: факты и правила………………………………………20
5.3. Запросы…………………………………………………………………21
5.4. Переменные в ПРОЛОГе……………………………………………...22
5.5. Объекты и типы данных в ПРОЛОГе………………………………...23
5.6. Основные разделы ПРОЛОГ-программы…………………………….23
5.7. Поиск с возвратом……………………………………………………...24
5.8. Управление поиском с возвратом: предикаты fail и отсечения ……26
5.9. Арифметические вычисления…………………………………………27
5.10. Рекурсия……………………………………………………………… .28
5.11. Списки…………………………………………………………………30
5.12. Стандартные задачи обработки списка………………………….….31
Литература………………………………………………................................35
6
Введение
В последние десятилетия искусственный интеллект вторгается во все
сферы деятельности, становится средством интеграции наук. Программные
средства, базирующиеся на технологии и методах искусственного интеллекта,
получили значительное распространение в мире. Интенсивные исследования по
созданию единого информационного пространства, создающего условия для
совместной дистанционной работы на основе баз знаний, сегодня начали
проводить все развитые в экономическом отношении страны. Курс «Основы
искусственного интеллекта» в высшей школе включает изучение таких
разделов как представление знаний в формальном языке, структура экспертных
систем и основные принципов их разработки, различные стратегии поиска
цели. Одной из основных линий курса является обсуждение вопросов
реализации систем искусственного интеллекта для решения конкретных
прикладных задач.
В качестве компьютерной поддержки курса
рассматривается
инструментальная среда разработки программ Visual Prolog. Язык
программирования Пролог, основанный на идеях и методах математической
логики, изначально создавался для разработки приложений искусственного
интеллекта. В среде Visual Prolog эффективно программируются такие
приложения, как базы знаний, экспертные системы, естественно-языковые
интерфейсы и интеллектуальные системы управления информацией. Высокий
уровень абстракции, возможность представления сложных структур данных и
моделирования логических отношений между объектами позволяют решать
задачи различных предметных областей.
Учебно-методическое пособие “Основы искусственного интеллекта”
поможет расширить представления будущего учителя информатики об
областях применения теории искусственного интеллекта, об имеющихся и
перспективных языках программирования и аппаратных структурах для
создания систем искусственного интеллекта.
7
1. Искусственный интеллект: предмет,
история развития, направления
исследований.
1.1. Направления исследований в области ИИ
Intellectus (лат) ум, рассудок, разум, мыслительные способности
человека. Искусственный Интеллект (ИИ) – область информатики, предметом
которой является разработка аппаратно-программных средств, позволяющих
пользователю решать задачи, традиционно считающиеся интеллектуальными.
Теорию искусственного интеллекта составляет наука о знаниях, о том, как их
добывать, представлять в искусственных системах, перерабатывать внутри
системы и использовать для решения практических задач. Технологии с
использованием ИИ применяют сегодня во многих прикладных областях.
Начало исследований в области ИИ (конец 50-х годов 20 в.) связывают с
работами Ньюэлла, Саймана и Шоу, исследовавших процессы решения
различных задач. Результатами их работ явились такие программы как
"ЛОГИК-ТЕОРЕТИК", предназначенная для доказательства теорем в
исчислении высказываний, и "ОБЩИЙ РЕШАТЕЛЬ ЗАДАЧ". Эти работы
положили начало первому этапу исследований в области ИИ, связанному с
разработкой программ, решающих задачи на основе применения разнообразных
эвристических методов.
Эвристический метод решения задачи при этом рассматривался как
свойственный человеческому мышлению "вообще", для которого характерно
возникновение догадок о пути решения задачи с последующей проверкой их.
Ему противопоставлялся используемый в ЭВМ алгоритмический метод,
который интерпретировался как механическое осуществление заданной
последовательности шагов, детерминированно приводящей к правильному
ответу. Трактовка эвристических методов решения задач как сугубо
человеческой деятельности и обусловила появление и дальнейшее
распространение термина ИИ
А. Нейрокибернетика.
Нейрокибериетика ориентирована на аппаратное моделирование структур,
подобных структуре мозга. Физиологами давно установлено, что основой
человеческого мозга является большое количество связанных между собой и
взаимодействующих нервных клеток - нейронов. Поэтому усилия
нейрокибернетики были сосредоточены на создании элементов, аналогичных
нейронам, и их объединении в функционирующие системы. Эти системы
принято называть нейронными сетями, или нейросетями. В последнее время
нейрокибернетика снова начала развиваться из-за скачка в развитии ЭВМ.
Появились нейрокомпьютеры, транспьютеры.
В настоящее время используются три подхода к созданию нейросетей:
аппаратный - создание специальных компьютеров, плат расширения,
наборов микросхем, реализующих все необходимые алгоритмы,
8
программный - создание программ и инструментариев, рассчитанных на
высокопроизводительные компьютеры. Сети создаются в памяти компьютера,
всю работу выполняют его собственные процессоры;
гибридный - комбинация первых двух. Часть вычислений выполняют
специальные платы расширения (сопроцессоры), часть - программные средства.
Б. Кибернетика «черного ящика».
В основу кибернетики "черного ящика" лег принцип, противоположный
нейрокибернетике. Не имеет значения, как устроено "мыслящее" устройство.
Главное, чтобы на заданные входные воздействия оно реагировало так же, как
человеческий мозг.
Это направление искусственного интеллекта было ориентировано на
поиски алгоритмов решения интеллектуальных задач на существующих
моделях компьютеров.
Исследования в области искусственного интеллекта прошли долгий и
тернистый путь: первые увлечения (1960 год), лженаука (1960-65), успехи при
решении головоломок и игр (1965-1975), разочарование при решении
практических задач (1970-1985), первые успехи при решении ряда
практических задач (1962-1992), массовое коммерческое использование при
решении практических задач (1993-1995). Но основу коммерческого успеха по
праву составляют экспертные системы и, в первую очередь, экспертные
системы реального времени. Именно они позволили искусственному
интеллекту перейти от игр и головоломок к массовому использованию при
решении практически значимых задач.
1.2. Основные задачи, решаемые в области
искусственного интеллекта
Представление знаний и разработка систем, основанных на знаниях
Разработка моделей представления знаний, создание баз знаний,
образующих ядро экспертных систем (ЭС). В последнее время включает в себя
модели и методы извлечения и структурирования знаний и сливается с
инженерией знаний. В области искусственного интеллекта наибольшего
коммерческого успеха достигли экспертные системы и средства для их
разработки.
Игры и творчество.
Игровые интеллектуальные задачи - шахматы, шашки, го. В основе лежит
один из ранних подходов - лабиринтная модель плюс эвристики.
Разработка естественноязыковых интерфейсов и машинный перевод
Управление голосом, перевод с языка на язык. Первая программа в этой
области - переводчик с английского языка на русский. Первая идея - пословный
перевод, оказалась неплодотворной. В настоящее время используется более
сложная модель, включающая анализ и синтез естественно-языковых
сообщений, которая состоит из нескольких блоков. Для анализа это:
9
морфологический анализ - анализ слов в тексте;
10
синтаксический анализ - анализ предложений, грамматики и связей между
словами;
семантический анализ - анализ смысла каждого предложения на основе
некоторой предметно-ориентированной базы знаний;
прагматический анализ - анализ смысла предложений в окружающем
контексте на основе собственной базы знаний. Синтез включает аналогичные
этапы, но несколько в другом порядке,
Распознавание образов
Традиционное направление искусственного интеллекта, берущее начало у
самых его истоков. Каждому объекту ставится в соответствие матрица
признаков, по которой происходит ею распознавание. Это направление близко
к машинному обучению, тесно связано с нейрокибернетикой.
Новые архитектуры компьютеров
Разработка новых аппаратных решений и архитектур, направленных на
обработку символьных и логических данных (Пролог- и Лисп-машины,
компьютеры V и VI поколений). Последние разработки посвящены
компьютерам баз данных и параллельным компьютерам.
Интеллектуальные роботы
Роботы - это электромеханические устройства, предназначенные для
автоматизации человеческого труда.
Со времени создания сменилось несколько поколений роботов.
Роботы с жесткой схемой управления. Практически все современные
промышленные роботы принадлежат к первому поколению. Фактически это
программируемые манипуляторы.
Адаптивные роботы с сенсорными устройствами. Есть образцы таких
роботов, но в промышленности они пока не используются.
Самоорганизующиеся, или интеллектуальные, роботы. Это конечная цель
развития робототехники. Основная проблема при создании интеллектуальных
роботов - проблема машинного зрения.
В настоящее время в мире изготавливается более 60 тыс. роботов в год.
Специальное программное обеспечение
Разработка специальных языков для решения задач невычислительного
плана (LISP, PROLOG, SMALLTALK, РЕФАЛ и др.). Создание пакетов
прикладных программ, ориентированных на промышленную разработку
интеллектуальных систем, экспертных оболочек.
Обучение и самообучение
Модели, методы и алгоритмы, ориентированные на автоматическое
накопление знаний на основе анализа и обобщения данных. Включает обучение
по примерам (или индуктивное), а также традиционные подходы распознавания
образов.
11
2. Система знаний
Данные – отдельные факты, характеризующие объекты, процессы и
явления в предметной области.
Знанием является информация, которая отражает объективные свойства и
связи
некоторых
объектов,
явлений,
процессов,
сущностей
и
отношениями между ними как в субъективном, так и научном
(объективном) выражении.
Под системой знаний понимается совокупность знаний, образующих
целостное описание некоторой проблемы с доступной и достаточной степенью
точности. Целостность означает, что между отдельными сведениями,
входящими в знание, существуют связи и, следовательно, одни сведения могут
быть выводимы из других.
В системах искусственного интеллекта знания являются основным
объектом формирования, обработки и исследования. База знаний, наравне с
базой данных, - необходимая составляющая программного комплекса ИИ.
Машины, реализующие алгоритмы ИИ, называют машинами, основанными на
знаниях, а подраздел теории ИИ, связанный с построением экспертных систем,
- инженерией знаний.
Знания можно разделить на процедурные и декларативные. Исторически
первичными были процедурные знания, т.е. знания, "растворенные" в
алгоритмах. Они управляли данными. Для их изменения требовалось изменять
программы. Однако с развитием искусственного интеллекта приоритет данных
постепенно изменялся, и все большая часть знаний сосредоточивалась в
структурах данных (таблицы, списки, абстрактные типы данных), т.е.
увеличивалась роль декларативных знаний.
Сегодня знания приобрели чисто декларативную форму, т.е. знаниями
считаются предложения, записанные на языках представления знаний,
приближенных к естественному и понятных неспециалистам.
Для решения задач некоторой предметной области, необходимо создание
её концептуальной модели. Для представления знаний в ЭВМ они должны быть
формализованы.
Представление знаний - это соглашение о том, как описывается реальный
мир. Основная цель представления знаний: получить математические модели
реального мира, с целью получения на их основе, необходимых решений.
В системах искусственного интеллекта используются следующие
универсальные модели представления знаний:
1. Семантические сети
2. Фреймы
3. Логическая модель
4. Продукционная модель.
12
3. Модели представления знаний
3.1. Семантические сети
Семантическая сеть- это ориентированный граф, вершины которого понятия, а дуги - отношения между ними.
Понятиями обычно выступают абстрактные или конкретные объекты, а
отношения - это связи типа: "это" ("is"), "имеет частью" ("has part"),
"принадлежит", "любит".
Можно ввести несколько классификаций семантических сетей. Например,
по количеству типов отношений:
 однородные (с единственным типом отношений);
 неоднородные (с различными типами отношений).
Наиболее часто в семантических сетях используются следующие
отношения:
 связи типа "часть-целое" ("класс-подкласс", "элемент-множество" и т.п.);
 функциональные связи (определяемые обычно глаголами "производит",
"влияет"...);
 количественные (больше, меньше, равно...);
 пространственные (далеко от, близко от, за, под, над...);
 временные (раньше, позже, в течение...);
 атрибутивные связи (иметь свойство, иметь значение...);
 логические связи (и, или, не) и др.
есть
4
4
дышать
животные
двигаться
крылья
1 кожа
4
1
птицы
перья
1
попугай
4
говорить
2
1
жабры
1
чешуя
Рыбы
2
2
секретарь
пиранья
4
ловить
змей
3
опасная
рис.1 Фрагмент семантической сети, описывающей предметную область
«животные».
13
Виды отношений: 1–«часть-целое»,
2–«подкласс-класс», 3–«имеет
свойство», 4–«умеет».
Проблема поиска решения в базе знаний типа семантической сети сводится
к задаче поиска фрагмента сети, соответствующего некоторой подсети,
соответствующей поставленному вопросу.
Преимущества сетей: 1) модель адекватно отображает представления о
мире, 2) позволяет работать не с полностью определенными знаниями.
Недостатки: Чем сложнее модель, тем больше сеть, тем сложнее поиск.
Эта модель ориентирована на использование языка LISP.
3.2. Фреймовая модель
Frame (рамка) является единицей представления информации об объекте,
который можно описать некоторой совокупностью понятий и сущностей.
Фрейм имеет внутреннюю структуру, состоящую из множества элементов,
называемыми слотами. Слоты могут быть разного типа (числа, тексты,
математические соотношения)и содержать не только конкретное значение, но и
имя процедуры, позволяющей вычислить её по некоторому алгоритму.
В слоте может размещаться ссылка на другой фрейм, что позволяет
строить иерархическую структуру фреймов и обеспечивать наследование
свойств родовых объектов.
<имя_фрейма>
<имя_слота 1> (<значение_слота 1>)
<имя_слота 2> (<значение_слота 2>)
…
<имя_слота n> (<значение_слота n>)
Имеются 2 типа фреймов: фреймы-прототипы (пустые фреймы,
описывающие понятия) и фреймы-экземпляры (описывают конкретные
объекты).
Например, фрейм-прототип «студент» может быть задан следующим
образом:
студент
ФИО (<значение_слота 1>)
группа (<значение_слота 2>)
предмет (<значение_слота 3>)
оценка (<значение_слота 4>)
Фрейм-экземпляр, описывающий конкретного студента:
студент
ФИО (Иванов Иван Иванович)
группа (401ФФ)
предмет (ОИИ)
оценка (отл.)
Важнейшим свойством теории фреймов является заимствованное из теории
семантических сетей наследование свойств. И во фреймах, и в семантических
сетях наследование происходит по АКО-связям (A-Kind-Of = это). Слот АКО
14
указывает на фрейм более высокого уровня иерархии, откуда неявно
наследуются, т.е. переносятся, значения аналогичных слотов.
Для работы с фреймами был разработан язык FRL (Frame Representation
Language).
Преимущества фреймовских систем:
 фреймовское представление позволяет описывать и управлять сложными
знаниями больших объемов на основе описания концептуальных
объектов;
 в целях увеличения гибкости системы, декларативные и процедурные
знания концептуальных объектов комбинируют;
 при решении сложных проблем используют комбинации управления
выводом.
Недостатки: громоздкость, сложность модификации вида родовых
отношений.
3.3. Продукционная модель
Продукционная модель, или модель, основанная на правилах, позволяет
представить знания в виде предложений типа: Если (условие), то (действие).
если А1, А2, …, Аn, то В
А1, А2, …, Аn – факты
Под условием понимается некоторое предложение-образец, по которому
осуществляется поиск в базе знаний, а под действием - действия, выполняемые
при успешном исходе поиска (они могут быть промежуточными,
выступающими далее как условия, и терминальными или целевыми,
завершающими работу системы).
При использовании продукционной модели база знаний состоит из набора
правил, Программа, управляющая перебором правил, называется машиной
вывода. Чаще всего вывод бывает прямой (от данных к поиску цели) или
обратный (от цели для ее подтверждения - к данным). Данные - это исходные
факты, на основании которых запускается машина вывода - программа,
перебирающая правила из базы.
Продукционная модель чаще всего применяется в промышленных
экспертных системах. Она привлекает разработчиков своей наглядностью,
высокой модульностью, легкостью внесения дополнений и изменений и
простотой механизма логического вывода.
Преимущества продукционных систем:
 подавляющая часть человеческих знаний может быть представлена в
виде продукций;
 системы продукции являются модульными;
 при необходимости системы продукций могут реализовывать сложные
алгоритмы;
 прозрачность системы (легко проследить логику и объяснить
полученный результат).
15
Продукционные модели имеют два недостатка: при большом числе
продукций (> 1000) проверка непротиворечивости становится сложнее;
неоднозначность выбора из фронта готовой продукции.
Язык, использующий продукционную модель – ПРОЛОГ.
3.4. Логическая модель
В основе их описания лежит формальная система с четырьмя элементами:
М=<Т, Р, А, В > , где
Т – множество базовых элементов различной природы с
соответствующими процедурами;
Р – множество синтаксических правил. С их помощью из элементов Т
образуют синтаксически правильные совокупности. Процедура П(Р)
определяет, является ли эта совокупность правильной;
А- подмножество множества Р, называемых аксиомами. Процедура П(А)
дает ответ на вопрос о принадлежности к множеству А;
В – множество правил вывода. Применяя их к элементам А, можно
получить новые синтаксически правильные совокупности, к которым можно
применить эти правила снова. Процедура П(В) определяет для каждой
синтаксически правильной совокупности, является ли она выводимой.
4. Экспертные системы
4.1. Назначение экспертных систем
Экспертные системы (ЭС) - это сложные программные комплексы,
аккумулирующие знания специалистов в конкретных предметных областях и
тиражирующие этот эмпирический опыт для консультаций менее
квалифицированных пользователей.
Цель исследования экспертных систем - разработка программ, которые
при решении задач из некоторой предметной области, получают результаты, не
уступающие по качеству и эффективности результатам, полученным
экспертами.
Экспертные системы предназначены для решения неформализованных,
практически значимых задач. Использование экспертной системы следует
только тогда, когда их разработка является возможной и целесообразной.
Факты, свидетельствующие о необходимости разработки и внедрения
экспертных систем:
 нехватка специалистов, расходующих значительное время для оказания
помощи другим;
 потребность в многочисленном коллективе специалистов, поскольку ни один
из них не обладает достаточным знанием;
16
 низкая производительность, поскольку задача требует полного анализа
сложного набора условий, а обычный специалист не в состоянии просмотреть
(за отведенное время) все эти условия;
 наличие конкурентов, имеющих преимущество в том, что они лучше
справляются с поставленной задачей.
По функциональному назначению экспертные системы можно разделить
на следующие типы:
1. Мощные экспертные системы, рассчитанные на узкий круг пользователей
(системы управления сложным технологическим оборудованием, экспертные
системы ПВО). Такие системы обычно работают в реальном масштабе времени
и являются очень дорогими.
2. Экспертные системы, рассчитанные на широкий круг пользователей. К
ним можно отнести системы медицинской диагностики, сложные обучающие
системы. База знаний этих систем стоит недешево, так как содержит
уникальные знания, полученные от специалистов экспертов. Сбором знаний и
формированием базы знаний занимается специалист по сбору знаний –
инженер-когнитолог.
3. Экспертные системы с небольшим числом правил и сравнительно
недорогих. Эти системы рассчитаны на массового потребителя (системы,
облегчающие поиск неисправностей в аппаратуре). Применение таких систем
позволяет обойтись без высококвалифицированного персонала, уменьшить
время поиска и устранения неисправностей. Базу знаний такой системы можно
дополнять и изменять, не прибегая к помощи разработчиков системы. В них
обычно используются знания из различных справочных пособий и технической
документации.
4. Простые экспертные системы индивидуального использования. Часто
изготавливаются самостоятельно. Применяются в ситуациях, чтобы облегчить
повседневную работу. Пользователь, организовав правила в некоторую базу
знаний, создает на ее основе свою экспертную систему. Такие системы находят
применение в юриспруденции, коммерческой деятельности, ремонте
несложной аппаратуре.
Использование экспертных систем и нейронных сетей приносит
значительный экономический эффект. Так, например: - American Express
сократила свои потери на 27 млн. долларов в год благодаря экспертной системе,
определяющей целесообразность выдачи или отказа в кредите той или иной
фирме; - DEC ежегодно экономит 70 млн. долларов в год благодаря системе
XCON/XSEL, которая по заказу покупателя составляет конфигурацию
вычислительной системы VAX. Ее использование сократило число ошибок от
30% до 1%; - Sira сократила затраты на строительство трубопровода в
Австралии на 40 млн. долларов за счет управляющей трубопроводом
экспертной системы.
17
4.2. Типы задач, решаемых с помощью
экспертных систем
Интерпретация данных. Под интерпретацией понимается определение
смысла данных, результаты которого должны быть согласованными и
корректными. Примеры ЭС:
 обнаружение и идентификация различных типов океанских судов - SIAP;
 определение
основных
свойств
личности
по
результатам
психодиагностического тестирования в системах АВТАНТЕСТ и
МИКРОЛЮШЕР и др.
Диагностика. Под диагностикой понимается обнаружение неисправности
в некоторой системе. Примеры ЭС:
 диагностика и терапия сужения коронарных сосудов - ANGY;
 диагностика ошибок в аппаратуре и математическом обеспечении ЭВМ система CRIB и др.
Мониторинг. Основная задача мониторинга - непрерывная интерпретация
данных в реальном масштабе времени и сигнализация о выходе тех или иных
параметров за допустимые пределы. Главные проблемы - "пропуск" тревожной
ситуации и инверсная задача "ложного" срабатывания. Примеры ЭС:
 контроль за работой электростанций СПРИНТ, помощь диспетчерам
атомного реактора - REACTOR:
 контроль аварийных датчиков на химическом заводе - FALCON и др.
Проектирование. Проектирование состоит в подготовке спецификаций на
создание "объектов" с заранее определенными свойствами. Под спецификацией
понимается весь набор необходимых документов чертеж, пояснительная
записка и т.д. Примеры ЭС:
 проектирование конфигураций ЭВМ VAX ― 1/780 в системе XCON (или
R1),
 проектирование БИС - CADHELP;
 синтез электрических цепей - SYN и др.
Прогнозирование. Прогнозирующие системы логически выводят
вероятные следствия из заданных ситуаций. Примеры ЭС:
 предсказание погоды - система WILLARD:
 оценки будущего урожая - PI.ANT;
 прогнозы в экономике - ЕСОN и др.
Планирование. Под планированием понимается нахождение планов
действий, относящихся к объектам, способным выполнять некоторые функции.
В таких ЭС используются модели поведения реальных объектов с тем, чтобы
логически вывести последствия планируемой деятельности. Примеры ЭС:
18
 планирование поведения робота - STRIPS,
19
 планирование промышленных заказов - 1SIS,
 планирование эксперимента - MOLGEN и др.
Обучение. Системы обучения диагностируют ошибки при изучении какойлибо дисциплины с помощью ЭВМ и подсказывают правильные решения. Они
аккумулируют знания о гипотетическом "ученике" и его характерных ошибках,
затем в работе способны диагностировать слабости в знаниях обучаемых и
находить соответствующие средства для их ликвидации. Примеры ЭС:
 обучение языку программирования Лисп в системе "Учитель Лиспа";
 система PROUST - обучение языку Паскаль и др.
Решения экспертных систем обладают прозрачностью, т.е. могут быть
объяснены пользователю на качественном уровне.
Экспертные системы способны пополнять свои знания в ходе
взаимодействия с экспертом.
4.3. Структура экспертных систем
Структура экспертных систем включает в себя следующие компоненты:
База знаний – ядро ЭС, совокупность знаний предметной области,
записанная на машинный носитель в форме, понятной эксперту и пользователю
(обычно на некотором языке, приближенном к естественному). Параллельно
такому "человеческому" представлению существует БЗ во внутреннем
"машинном" представлении. Она состоит из набора фактов и правил.
Факты – описывают объекты и взаимосвязь между ними. Правила –
используется в базе знаний для описания отношений между объектами. На
основе отношений, задаваемых правилами, выполняется логический вывод.
База данных – предназначена для временного хранения фактов и гипотез,
содержит промежуточные данные или результат общения систем с
пользователем.
Машинно-логический вывод – механизм рассуждений, оперирующий
знаниями и данными с целью получения новых данных, для этого обычно
используют программно реализованный механизм поиска решений.
Подсистема общения – служит для ведения диалога с пользователем, в
ходе которого экспертная система запрашивает у пользователя необходимые
факты для процесса рассуждений, а также дающая возможность пользователю в
некоторой степени контролировать ход рассуждений.
Подсистема объяснения – необходима, для того чтобы дать пользователю
возможность контролировать ход рассуждений.
Подсистема приобретения знаний – программа, представляющая
инженеру по знаниям возможность создавать БЗ в диалоговом режиме.
Включает в себя систему вложенных меню, шаблонов языка представления
знаний, подсказок ("help" - режим) и других сервисных средств, облегчающих
работу с базой.
20
Экспертная система работает в двух режимах:
21
 приобретения знаний (определение, модификация, дополнение);
 решения задач.
В этом режиме данные о задаче обрабатываются и после
соответствующей кодировки передаются в блоки экспертной системы.
Результаты обработки полученных данных поступают в модуль советов и
объяснений и после перекодировки на язык, близкий к естественному,
выдаются в виде советов, объяснений и замечаний. Если ответ не понятен
пользователю, он может потребовать от экспертной системы объяснения его
получения.
4.4. Основные этапы разработки экспертных систем
Технологический процесс разработки промышленной экспертной системы
можно разделить на шесть основных этапов:
1. Выбор подходящей проблемы
Деятельность, предшествующая
решению
начать разрабатывать
конкретную ЭС, включает:
 определение проблемной области и задачи;
 нахождение эксперта, желающего сотрудничать при решении проблемы, и
назначение коллектива разработчиков;
 определение предварительного подхода к решению проблемы;
 анализ расходов и прибыли от разработки;
 подготовку подробного плана разработки.
2. Разработка прототипной системы
Прототипная система является усеченной версией экспертной системы,
спроектированной для проверки правильности кодирования фактов, связей и
стратегий рассуждения эксперта.
Прототип должен удовлетворять двум требованиям:
 прототипная система должна решать наиболее типичные задачи, но и не
должна бать большой.
 время и трудоемкость создания прототипа должны быть незначительными.
Оценивается и проверяется работа программ прототипа с целью
приведения в соответствие с реальными запросами пользователей. Прототип
проверяется на:
 удобство и адекватность интерфейсов ввода-вывода (характер вопросов в
диалоге, связность выводимого текста результата и др.)
 эффективность стратегии управления (порядок перебора, использование
нечеткого вывода и др.);
 качество проверочных примеров;
 корректность базы знаний (полнота и непротиворечивость правил).
22
Эксперт работает, как правило, с инженером по знаниям, который помогает
структурировать знания, определять и формировать понятия и правила, нужные
23
для решения проблемы. В случае успеха эксперт с помощью инженера
познания расширяет базу знаний прототипа о проблемной области.
При неудаче может быть сделан вывод о том. Что необходимые другие
методы решения данной проблемы или разработка нового прототипа.
3. Развитие прототипа до промышленной экспертной системы.
На этом этапе существенно расширяется база знаний, добавляются
большое число дополнительных эвристик. Эти эвристики обычно увеличивают
глубину системы, обеспечивая большее число правил для трудноуловимых
аспектов отдельных случаев. После установления основной структуры ЭС
инженер по знаниям приступает к разработке и адаптации интерфейсов, с
помощью которых система будет общаться с пользователем и экспертом.
Как правило, реализуется плавный переход от прототипов к
промышленным экспертным системам. Иногда при разработке промышленной
системы выделяют дополнительные этапы для перехода: демонстрационный
прототип - исследовательский прототип - действующий прототип промышленная система.
4. Оценка системы
Экспертные системы оцениваются для того, чтобы проверить точность
работы программы и ее полезность. Оценку можно проводить, исходя из
различных критериев, которые сгруппируем следующим образом:
 критерии пользователей (понятность и "прозрачность" работы системы,
удобство интерфейсов и др.);
 критерии приглашенных экспертов (оценка советов-решений, предлагаемых
системой, сравнение ее с собственными решениями, оценка подсистемы
объяснений и др.);
 критерии
коллектива
разработчиков
(эффективность
реализации,
производительность, время отклика, дизайн, широта охвата предметной
области, непротиворечивость БЗ, количество тупиковых ситуаций, когда
система не может принять решение, анализ чувствительности программы к
незначительным изменениям в представлении знаний, весовых
коэффициентах, применяемых в механизмах логического вывода, данных и
т.п.).
5. Стыковка системы
На этом этапе осуществляется стыковка экспертной системы с другими
программными средствами в среде, в которой она будет работать, и обучение
людей, которых она будет обслуживать Под стыковкой подразумевается также
разработка связей между экспертной системой и средой, в которой она
действует.
Стыковка включает обеспечение связи ЭС с существующими базами
данных и другими системами на предприятии, а также улучшение системных
факторов, зависящих от времени, чтобы можно было обеспечить ее более
эффективную работу и улучшить характеристики ее технических средств, если
24
система работает в необычной среде (например, связь с измерительными
устройствами).
25
6. Поддержка системы
При перекодировании системы на язык, подобный Си, повышается ее
быстродействие и увеличивается переносимость, однако гибкость при этом
уменьшается. Это приемлемо лишь в том случае, если система сохраняет все
знания проблемной области, и это знание не будет изменяться в ближайшем
будущем. Однако, если экспертная система создана именно из-за того, что
проблемная область изменяется, то необходимо поддерживать систему в
инструментальной среде разработки.
4.5. Инструментальные средства разработки
экспертных систем
Языки искусственного интеллекта
Лисп (LISP) и Пролог (Prolog) - наиболее распространенные языки,
предназначенные для решения задач искусственного интеллекта. Есть и менее
распространенные языки искусственного интеллекта, например РЕФАЛ,
разработанный в России. Универсальность этих языков меньшая, нежели
традиционных языков, но ее потерю языки искусственного интеллекта
компенсируют богатыми возможностями по работе с символьными и
логическими данными, что крайне важно для задач искусственного интеллекта.
На основе языков искусственного интеллекта создаются специализированные
компьютеры (например, Лисп-машины), предназначенные для решения задач
искусственного интеллекта. Недостаток этих языков - неприменимость для
создания гибридных экспертных систем.
Специальный программный инструментарий
Библиотеки и надстройки над языком искусственного интеллекта Лисп:
KEE (Knowledge Engineering Environment), FRL (Frame Representation
Language), KRL (Knowledge Represantation Language), ARTS и др.,
позволяющие пользователям работать с заготовками экспертных систем на
более высоком уровне, нежели это возможно в обычных языках искусственного
интеллекта.
"Оболочки"
"Оболочки" – это пустые" версии существующих экспертных систем, т.е.
готовые экспертные системы без базы знаний. Примером такой оболочки может
служить EMYCIN (Empty MYCIN - пустой MYC1N), которая представляет
собой незаполненную экспертную систему MYCIN. Достоинство оболочек в
том, что они вообще не требуют работы программистов для создания готовой
экспертной системы. Требуется только специалисты в предметной области для
заполнения базы знаний. Однако если некоторая предметная область плохо
укладывается в модель, используемую в некоторой оболочке, заполнить базу
знаний в этом случае весьма не просто.
26
5. ПРОЛОГ - язык логического
программирования
5.1. Общие сведения о ПРОЛОГе.
ПРОЛОГ(ПРОграммирование
в
ЛОГике)
язык
логического
программирования, предназначен для решения задач из области искусственного
интеллекта (создание ЭС, программы-переводчики, обработка естественного
языка). Он используется для обработки естественного языка и обладает
мощными средствами, позволяющими извлекать информацию из баз данных,
причем методы поиска, используемые в нем, принципиально отличаются от
традиционных.
Основные конструкции ПРОЛОГа заимствованы из логики. ПРОЛОГ
относится не к процедурным, а к декларативным языкам программирования. Он
ориентирован не на разработку решений, а на систематизированное и
формализованное описание задачи с тем, чтобы решение следовало из
составленного описания.
Суть логического подхода заключается в том, что машине в качестве
программы предлагается не алгоритм, а формальное описание предметной
области и решаемой проблемы в виде аксиоматической системы. Тогда поиск
решения с помощью вывода в этой системе можно поручить самому
компьютеру. Главная же задача программиста — удачно представить
предметную область системой логических формул и таким множеством
отношений на ней, которые наиболее полно описывают задачу.
Фундаментальные свойства ПРОЛОГа:
1) механизм вывода с поиском и возвратом
2) встроенный механизм сопоставления с образцом
3) простая и легко изменяемая структура данных
4) отсутствие указателей, операторов присваивания и перехода
5) естественность рекурсии
Этапы программирования на ПРОЛОГе:
1) объявление фактов об объектах и отношениях между ними;
2) определение правил взаимосвязи объектов и отношений между
ними;
3) формулировка вопроса об объектах и отношениях между ними.
Теоретической основой ПРОЛОГа является раздел символьной логики,
называемый исчислением предикатов.
Предикат – это имя свойства или отношения между объектами с
последовательностью аргументов.
<имя_предиката>(t1, t2, ..., tn) ), t1,t2,...,tn – аргументы
27
Например, факт black(cat) записан с использованием предиката black,
имеющего один аргумент. Факт написал(шолохов, "ТИХИЙ ДОН") записан с
использованием предиката написал, имеющего два аргумента.
Число аргументов предиката называется арностью предиката и
обозначается black/1 (предикат black имеет один аргумент, его арность равна
единице). Предикаты могут не иметь аргументов, арность таких предикатов
равна 0.
Язык Пролог вырос из работ Алана Колмерауэра (A. Colmerauer) по
обработке естественного языка и независимых работ Роберта Ковалького (R.
Kowalski) по приложениям логики к программированию (1973 г.).
Наиболее известна в России система программирования Turbo Prolog —
коммерческая реализация языка для IBM-совместимых ПК. В 1988 г. вышла
значительно более мощная версия Turbo Prolog 2.0, включающая
усовершенствованную интегрированную среду разработки программ, быстрый
компилятор и средства низкоуровневого программирования. Фирма Borland
распространяла эту версию до 1990 г., а затем компания PDC приобрела
монопольное право на использование исходных текстов компилятора и
дальнейшее продвижение системы программирования на рынок под названием
PDC Prolog.
В 1996 г. Prolog Development Center выпускает на рынок систему Visual
Prolog 4.0. В среде Visual Prolog используется подход, получивший название
«визуальное программирование», при котором внешний вид и поведение
программ определяются с помощью специальных графических средств
проектирования без традиционного программирования на алгоритмическом
языке.
В Visual Prolog входят интерактивная среда визуальной разработки (VDE
— Visual Develop Environment), которая включает текстовый и различные
графические редакторы, инструментальные средства генерации кода,
конструирующие управляющую логику (Experts), а также являющийся
расширением языка интерфейс визуального программирования (VPI — Visual
Programming Interface), Пролог-компилятор, набор различных подключаемых
файлов и библиотек, редактор связей, файлы, содержащие примеры и помощь.
5.2. Предложения: факты и правила
Программа на ПРОЛОГе состоит из предложений, которые могут быть
фактами, правилами или запросами.
Факт – это утверждение о том, что соблюдается некоторое конкретное
соотношение между объектами. Факт используется для того, чтобы показать
простую взаимосвязь между данными.
Структура факта:
<имя_отношения>( t1,t2,...,tn) ), t1,t2,...,tn– объекты
Примеры фактов:
учится (ира, университет).
% Ира учится в университете
28
родитель(иван, алексей).
% Иван является родителем Алексея
язык_программирования (пролог). % Пролог – это язык программирования
29
Набор фактов составляет базу данных. В виде факта в программе
записываются данные, которые принимаются за истину и не требуют
доказательства.
Правила используются для того, чтобы установить отношения между
объектами на основе имеющихся фактов.
Структура правила:
<имя_правила> :- <тело правила> или
<имя_правила > if <тело правила>
Левая часть правила вывода называется головой правила, а правая часть телом. Тело может состоять из нескольких условий, перечисленных через
запятую или точку с запятой. Запятая означает операцию «логическое И», точка
с запятой – операцию «логическое ИЛИ». В предложениях используются
переменные для обобщенной формулировки правил вывода. Переменные
действуют только в одном предложении. Имя в разных предложениях
указывает на разные объекты. Все предложения обязательно заканчиваются
точкой.
Примеры правил:
мать (Х, У) :- родитель (Х, У), женщина(Х).
студент (X) :- учится (X, институт); учится (X, университет).
Правило отличается от факта тем, что факт - всегда истина, а правило
является истинным, если выполняются все утверждения, составляющие тело
правила. Факты и правила образуют базу знаний.
5.3. Запросы
Если имеется база данных, то можно написать запрос (цель) к ней. Запрос
— это формулировка задачи, которую программа должна решить. Его
структура такая же, как у правила или факта. Существуют запросы с
константами и запросы с переменными.
Запросы с константами позволяют получить один из двух ответов: “да”
или “нет”
Например, имеются факты:
знает (лена, таня).
знает (лена, саша).
знает (саша, таня).
а) Знает ли Лена Сашу?
запрос: знает (лена, саша).
Результат: yes
б) Знает ли Таня Лену?
запрос знает (таня, лена).
Результат: no
Если в запрос входит переменная, то интерпретатор пытается найти такие
ее значения, при которых запрос будут истинным.
а) Кого знает Лена?
30
запрос: знает (лена, Х).
Результат:
31
Х = таня
Х = саша
б) Кто знает Сашу?
запрос: знает (Х, саша).
Результат: Х = лена
Запросы могут быть составными, т.е. состоять из нескольких простых
запросов. Они объединяются знаком “,“, который понимается как логическая
связка “и”.
Простые запросы называются подцелью, составной запрос принимает
истинное значение тогда, когда истинна каждая подцель.
Для ответа, есть ли общие знакомые у Лены и Саши, следует составить
запрос:
знает (лена, Х), знает (саша, Х).
Результат:
Х = Таня
5.4. Переменные в ПРОЛОГе
Переменная в ПРОЛОГе не рассматривается как выделенный участок
памяти. Она служит для обозначения объекта, на который нельзя сослаться по
имени. Переменную можно считать локальным именем для некоторого объекта.
Имя переменной должно начинаться с прописной буквы или символа
подчеркивания и содержать только символы букв, цифр и подчеркивания: Х,
_у, АВ, Х1. Переменная, не имеющая значения, называется свободной,
переменная, имеющая значение – конкретизированной.
Переменная, состоящая только из символа подчеркивания, называется
анонимной и используется в том случае, если ее значение несущественно.
Например, имеются факты:
родитель (ира, таня).
родитель (миша, таня).
родитель (оля, ира).
Требуется определить всех родителей
Запрос: родитель(Х, _)
Результат:
Х = Ира
Х = Миша
Х = Оля
Областью действия переменной является утверждение. В пределах
утверждения одно и то же имя принадлежит одной и той же переменной. Два
утверждения могут использовать одно имя переменной совершенно различным
образом.
В ПРОЛОГе нет оператора присваивания, его роль выполняет оператор
равенства =. Цель X=5 может рассматриваться как сравнение (если переменная
X имеет значение) или как присваивание (если переменная X свободна).
32
В ПРОЛОГе нельзя для увеличения значения переменной записать
X=X+5. Следует использовать новую переменную: Y=X+5.
5.5. Объекты и типы данных в ПРОЛОГе
Объекты данных в ПРОЛОГе называются термами. Терм может быть
константой, переменной или составным термом (структурой). Константами
являются целые и действительные числа (0, -l, 123.4, 0.23E-5), а также атомы.
Атом – любая последовательность символов, заключенная в кавычки.
Кавычки опускаются, если строка начинается со строчной буквы и содержит
только буквы, цифры и знак подчеркивания (т.е. если ее можно отличить от
обозначения переменных). Примеры атомов:
abcd, “a+b”, “студент Иванов”, пролог, “Пролог”.
Структура позволяет объединить несколько объектов в единое целое. Она
состоит из функтора (имя) и последовательности термов.
Например, data (15, апрель, 1983)
data – функтор, (15, апрель, 1983) – термы
Число компонент в структуре называется арностью структуры: data/3.
Структура может содержать другую структуру в качестве одного из своих
объектов.
день_рождения (person(“Маша”,”Иванова”), data(15,апрель,1983))
Доменом в ПРОЛОГе называют тип данных. Стандартными доменами
являются:
integer – целые числа.
real – вещественные числа.
string – строки (любая последовательность символов, заключенная в
кавычки).
char – одиночный символ, заключенный в апострофы.
symbol – последовательность латинских букв, цифр и символов
подчеркивания,
начинающаяся
с
маленькой
буквы
или
любая
последовательность символов, заключенная в кавычки.
5.6. Основные разделы ПРОЛОГ-программы
Как правило, программа на ПРОЛОГе состоит из четырех разделов.
DOMAINS – секция описания доменов (типов). Секция применяется, если в
программе используются нестандартные домены.
Например:
name = string
data = integer
PREDICATES – секция описания предикатов. Секция применяется, если в
программе используются нестандартные предикаты.
Например:
знает (name, name)
33
студент (name)
CLAUSES – секция предложений. Именно в этой секции записываются
предложения: факты и правила вывода.
Например:
знает (лена, иван).
студент (иван).
знаком_студент(X,Y):- знает (X,Y ), студент (Y).
GOAL – секция цели. В этой секции записывается запрос.
Например:
знаком_студент(лена,X).
Простейшая программа может содержать только раздел GOAL, например:
GOAL
write (“Введите Ваше имя: ”), readln (Name),
write (“Здравствуйте, ”, Name, “!”).
Комментарий: write – стандартный предикат вывода, readln – стандартный
предикат ввода строкового значения
5.7. Поиск с возвратом
Поиск с возвратом (backtracking) – это один из основных приемов поиска
решений поставленной задачи в ПРОЛОГ’е. Выполняя поиск, ПРОЛОГ может
столкнуться с необходимостью выбора между альтернативными путями. Тогда
он ставит маркер у места развилки (точка отката) и выбирает первую подцель.
Если она не выполняется, то ПРОЛОГ возвращается в точку отката и переходит
к следующей подцели.
Рассмотрим механизм поиска на примере. Пусть имеются факты:
знает (лена, таня).
знает (лена, иван).
студент (иван).
Требуется определить, есть ли у Лены знакомые студенты.
Программа:
PREDICATES
знает (symbol, symbol)
студент (symbol)
знаком_студент(symbol, symbol)
CLAUSES
знает (лена, таня).
% (1)
знает (лена, иван).
% (2)
студент (иван).
% (3)
знаком_студент(X,Y):- знает (X,Y), студент (Y).
% (4)
GOAL
знаком_студент(лена, Name).
34
Поиск решения:
1. Пытаясь выполнить целевое утверждение знаком_студент(лена, Name),
ПРОЛОГ проверяет каждое предложение из раздела CLAUSES. В результате
сопоставления с предложением (4) - X=лена. Переменная Y унифицируется с
переменной Name.
2. Переход к первой подцели знает (лена,Y) и поиск соответствующего
предложения. В результате сопоставления с предложением (1) – Y=таня. Возле
факта знает (лена, таня) устанавливается маркер.
3. Переход ко второй подцели студент (таня) и поиск соответствующего
предложения. Факт не найден – возврат в точку отката.
4. Дальнейший поиск фактов, соответствующих первой подцели
знает(лена,Y). В результате сопоставления с предложением (2) – Y=иван.
5. Переход ко второй подцели студент (иван) и поиск соответствующего
предложения приводит к успешному завершению поиска.
Результат:
Name=иван
1 Solition
Дерево поиска можно представить следующим образом:
знаком_студент(лена, Name)
знаком_студент(X,Y)
X= лена Y= Name
знает (лена,Y)
знает(лена, таня)
знает(лена, иван)
Y=таня
Y=иван
студент (таня)
студент (иван)
нет
да
рис.2. Целевое дерево поиска с возвратом
Благодаря механизму поиска с возвратом ПРОЛОГ в состоянии находить
все возможные решения, имеющиеся для данной задачи.
Основные правила поиска с возвратом:
1) Цели должны быть доказаны по порядку, слева направо.
2) Для доказательства некоторой цели предложения просматриваются в
том порядке, в каком они появляются в тексте программы.
35
3) Для того, чтобы доказать заголовочную цель правила, необходимо
доказать цели в теле правила. Тело правила состоит, в свою очередь из
целей, которые должны быть доказаны.
4) Цель считается доказанной, если с помощью соответствующих фактов
доказаны все цели, находящиеся в листьевых вершинах дерева целей.
5.8. Управление поиском с возвратом: предикаты fail и
отсечения
Для управление поиском с возвратом используются два стандартных
предиката: fail и отсечения.
1. fail – это тождественно-ложный предикат, искусственно создающий
ситуацию неуспеха и заставляющий продолжить поиск. Использование
предиката fail позволяет найти все решения задачи.
Пример 1. Вывести список студентов 4-го курса.
DOMAINS
name=string
kurs=integer
PREDICATES
Student(name, kurs)
spisok
CLAUSES
Student("Ира",2).
Student("Юра",4).
Student("Коля",1).
Student("Леша",4).
Student("Оля",4).
spisok:-Write("Список студентов 4 курса"), nl, Student(X,4),
Write(X), nl, fail.
GOAL
spisok.
Комментарий: nl (new line) – предикат перевода курсора на новую строку
В данном примере после первого найденного решения (Х= «Юра») и его
вывода предикат fail заставляет вернуться в точку отката и продолжить поиск,
просматривая другие факты. В результате будут найдены все решения,
удовлетворяющие запросу.
Результат выполнения программы:
Список студентов 4 курса
Юра
Леша
Оля
36
2. Чтобы ограничить пространство поиска и прервать поиск решений при
выполнении какого-либо условия, используется предикат отсечения
(обозначается !), Однажды пройдя через отсечение, невозможно вернуться
назад, т.к. этот предикат является тождественно-истинным. Процесс может
только перейти к следующей подцели, если такая имеется.
Если задано предложение вида:
R:-A, B, ! , C.
то после достижения подцелей А и В процесс поиска других решений этих
подцелей прекращается и вычислительный процесс перейдет к следующей
подцели С.
Например, чтобы в примере 1 вывести все возможные пары одного из
студентов 4-го курса со всеми остальными студентами, следует изменить
правило spisok
spisok:- Student(X,4), !, Student(Y,_), X<>Y,
Write(X," - ",Y), nl, fail.
Результат выполнения программы:
Юра - Ира
Юра - Коля
Юра - Леша
Юра – Оля
5.9. Арифметические вычисления
Язык Пролог не предназначен для программирования задач с большим
количеством арифметических операций. Для этого используются процедурные
языки программирования. Однако в любую Пролог-систему включаются
обычные арифметические операции и функции:
X+Y
Сумма X и Y
X-Y
Разность X и Y
X*Y
Произведение X и Y
X/Y
Деление X на Y
X mod Y
Остаток от деления X на Y
abs(X)
Абсолютная величина числа X
sqrt(X)
Квадратный корень из X
random(X)
Случайное число в диапазоне от 0 до 1
random(Int,X) Случайное целое число в диапазоне от 0 до Int
sin(X)
Синус X
cos(X)
Косинус X
tan(X)
Тангенс X
log(X)
Натуральный логарифм (ln) числа X
37
Пролог располагает двумя числовыми
типами
доменов: целыми и
действительными
числами.
Пролог
позволяет
также
сравнивать
арифметические выражения, используя отношения:
=, <, <=, >, >=, <>
Для реализации математических действий в Прологе используются
предикаты. Следующие примеры демонстрируют их использование.
Пример 1.
Найти среднее арифметическое двух чисел.
PREDICATES
Sr (real, real, real)
CLAUSES
Sr (A, B, S):- S = (A+B)/2.
GOAL
Sr (8, 12, S), write (S).
Результат:
10
Пример 2.
Определить является ли натуральное число четным или нечетным
PREDICATES
Chet (integer)
CLAUSES
Chet (A): - A mod 2 =0, write (A, ‘- четное’); Write (A, ‘- не четное’).
GOAL
Chet (18).
Результат:
18 – четное
5.10. Рекурсия
Рекурсия – это второе средство для организации повторяющихся действий
в ПРОЛОГе. Рекурсивная процедура – это процедура, вызывающая сама себя до
тех пор, пока не будет соблюдено некоторое условие, которое остановит
рекурсию. Такое условие называют граничным. Рекурсия – хороший способ для
решения задач, содержащих в себе подзадачу такого же типа. Рекурсивное
правило всегда состоит по крайней мере из двух частей, одна из которых
является нерекурсивной. Она определяет граничное условие.
Рассмотрим рекурсивное определение правила на примере правила
predok
1. X является предком Z, если X - родитель Z
predok(X, Z):-roditel(X, Z)
2. X – предок для Z, если найдется такой Y, для которого X является
родителем и Y является предком Z .
38
Predok (X,Z) :- roditel (X,Y), predok (Y,Z).
Первая часть этого правила нерекурсивная, она определяет условие
завершения рекурсии. Поиск прекратится, как только будет найден ближайший
предок - родитель.
Программа:
DOMAINS
name = string
PREDICATES
roditel (name, name)
predok (name, name)
CLAUSES
roditel (коля, оля).
roditel (оля, маша).
predok (X, Z):- roditel (X, Z).
predok (X, Z):- roditel (X,Y), predok (Y, Z).
GOAL
predok (коля, маша).
Результат:
yes
Пример. Рекурсивное вычисление факториала
Задача нахождения значения факториала n! сводится к нахождению
значения факториала (n-1)! и умножения найденного значения на n.
Правило для вычисления факториала:
1. 0! = 1
fact (0, 1):- !.
2. N! = (N-1)!*N.
fact (N, FN):- M=N–1,
fact (M, FM), FN=FM*N.
% нерекурсивная часть правила
% рекурсивная часть правила
Программа:
PREDICATES
fact (integer, integer)
CLAUSES
fact (0, 1):- !.
fact (N, FactN):- M=N–1, fact (M, FactM), FactN=FactM*N.
GOAL
fact (3, FN), write (“3!=”, FN).
Результат работы программы:
3!=6
Для наглядного представления нахождения решения удобно использовать
дерево целей:
39
factorial (3, FactN)
------------------------factorial (3, 6)
M=N-1
---------2=3-1
M’=M-1
---------1=2-1
factorial (2, FactM)
------------------------factorial (3, 2)
FactN=FactM*3
--------------------6=2*3
factorial (1, FactM’)
------------------------factorial (1, 1)
FactM=FactM’*2
--------------------2=2*1
factorial (0, FactM’’)
FactM’=FactM’’*1
M’’=M’-1
-----------------------------------------------------factorial (0, 1)
1=1*1
0=1-1
рис.3 Целевое дерево вычисления факториала
5.11. Списки
Список – это объект, который содержит конечное число других объектов.
Список в ПРОЛОГе можно приблизительно сравнить с массивами в других
языках, но для списков нет необходимости заранее объявлять размерность.
Список в ПРОЛОГе заключается в квадратные скобки и элементы списка
разделяются запятыми. Список, который не содержит ни одного элемента,
называется пустым списком.
Примеры списков:
список, элементами которого являются целые числа: [1, 2, 3]
список, элементами которого являются строки: [“One”, “Two”, “Three”]
пустой список: []
Элементами списка могут быть списки: [[-1,3,5],[6,4,2,8]]
Чтобы использовать в ПРОЛОГ-программе списки, необходимо в разделе
DOMAINS описать тип домена в формате.
<имя домена> = <тип элементов>*
Например,
DOMAINS
list = <integer>*
Список является рекурсивным объектом. Он состоит из головы (первого
элемента списка) и хвоста (все последующие элемента). Хвост также является
списком.
Например, [A, B, C] - список , у которого А – голова, [B,C] - хвост
В ПРОЛОГе имеется операция “|”, которая позволяет делить список на
голову и хвост.
40
[A, B, C] = [A | [B, C] ] = [A | [B | [C] ] ] = [A | [B | [C | [ ] ] ] ]
Пустой список нельзя разделить на голову и хвост. Такая структура
позволяет использовать рекурсию для обработки списка.
Пример программы, осуществляющей вывод элементов списка.
DOMAINS
list = integer *
PREDICATES
writelist(list)
CLAUSES
writelist ([]).
writelist ([A | Z]) :- write (A), nl, writelist (Z).
GOAL
writelist([10, 20, 30, 40]).
Результат выполнения программы:
10
20
30
40
В данной программе A – голова списка, Z – его хвост
5.12. Стандартные задачи обработки списка
К наиболее типичным задачам обработки списков относятся:
1) генерирование списка;
2) объединение списков;
3) поиск заданного элемента в списке;
4) удаление указанного элемента из списка;
5) вставка указанного элемента в список.
1. Генерирование списка из (N2-N1) последовательных целых чисел,
начиная с N1.
Для формирования списка создадим отношение genlist(N1, N2, L), где
N1 – начальный элемент списка
N2 – его верхняя граница
L – список
Возможны случаи:
1) если N1 = N2, тогда N1 – не добавляется в список и L – пустой список.
genlist (N2, N2, [ ]) – первая часть правила (условие останова).
2) если N1 < N2, то N1 помещаем в голову списка, затем увеличиваем N1
на 1 и для нового значения снова вызывается genlist. Получаем вторую часть
правила:
genlist (N1, N2, [N1 | L]): - N1 < N2, N = N1+1, genlist (N, N2, L).
Таким образом, правило формирования списка имеет вид:
41
genlist (N2, N2, [ ]).
% нерекурсивная часть правила
genlist (N1, N2, [N1 | L]): % рекурсивная часть правила
N1 < N2, N = N1+1, GenList (N, N2, L).
Например, для формирования списка [2, 3, 4, 5] следует указать запрос:
GOAL
GenList (2, 6, L), Write (L), nl.
2. Объединение списков.
Создадим отношение append(L1, L2, L3), где L1, L2 – исходные списки,
L3 – список, полученный в результате присоединения L2 к L1.
Возможны случаи:
1) если L1 пустой список, то результирующий список L3 равен списку L2.
Получаем первую (нерекурсивную) часть правила:
append ([ ], L, L).
2) если L1 не пустой список, то делим его на голову и хвост ( [X | L1]).
Вторая (рекурсивная) часть правила:
append ([X | L1], L2, [X | L3]): - append (L1, L2, L3).
Таким образом, правило объединения списков имеет вид:
append ([ ], L, L).
append ([X | L1], L2, [X | L3]): - append (L1, L2, L3).
Например, для объединения списков [1, 2, 3] и [4, 5] следует написать
запрос:
GOAL
append ([1, 2, 3], [4, 5], L) write [L].
Результат:
[1, 2, 3, 4, 5]
При выполнении программы из L1 выделяется и заносится в стек по
одному элементу (голова списка) до тех пор, пока L1 не станет пустым. После
этого выполняется первая часть правила и L3 получает значение L2, то есть L3
= [4, 5] начинается выгрузка элементов из стека и добавление их в голову L3.
Правило append обладает большое гибкостью и позволяет решать
множество задач по обработке списка. Его можно использовать для решения
обратной задачи: разбиение исходного списка на две части.
Например, чтобы определить все возможные способы разбиения списка
[1,2,3], следует составить запрос:
GOAL
append (L1, L2, [1,2,3]), write (“L1=”, L1, “L2=”, L2), fail, nl.
Результат:
L1 = [ ]
L2 = [1, 2, 3]
L1 = [1]
L2 = [2, 3]
L1 = [1, 2]
L2 = [3]
L1 = [1, 2, 3]
L2 = [ ]
42
3. Поиск заданного элемента
Чтобы определить содержится ли элемент X в списке L создадим
отношение member(X, L).
Возможны случаи:
1) если X совпадает с головой списка L, то элемент найден и поиск
прекращается. Первая часть правила (нерекурсивная):
member (X, [X | L]).
2) если X не принадлежит голове, то он может принадлежать хвосту.
Отбрасываем голову списка и вызываем правило для оставшегося списка.
Вторая часть правила (рекурсивная):
member (X, [_ | L]: - member (X, L).
Таким образом, правило поиска элемента имеет вид:
member (X, [X | L]).
member (X, [_ | L]: - member (X, L).
Например, для ответа на вопрос «Содержится ли число 4 в списке
[2, 3, 4, 5]?», можно составить запрос:
GOAL
member(4, [2, 3, 4, 5]),Write (“yes”);Write (“no”), nl.
При выполнении поиска X сравнивается с головой L. Если элементы не
совпадают, то первый элемент отбрасывается и X сравнивается с головой
полученного списка и так далее, пока L не станет пустым списком. Если
элемент X найден, то цель достигнута, выводится сообщение “yes”, иначе
выводится “no”.
4.Удаление элемента из списка.
Определим отношение del(X, L, L1), где
X – удаляемый элемент;
L – исходный список;
L1 – список, полученный в результате удаления X из L.
Возможны два случая:
1) если X – голова списка, то результирующий список равен хвосту
списка L. Первая часть правила (нерекурсивная):
del(X, [X|L], L).
2) если X принадлежит хвосту, то список L делим на голову и хвост. Для
хвоста снова вызывается правило del. Вторая часть правила (рекурсивная):
del(X, [Y|L], [Y|L1]):- del(X,L,L1).
Полная запись правила удаления элемента из списка:
del(X, [X|L], L).
del(X, [Y|L], [Y|L1]):- del (X,L,L1).
Например, для удаления из списка [1, 2, 3, 4] элемента 3, следует
составить запрос:
GOAL
43
del(3, [1, 2, 3, 4], L),Write (L), nl.
Результат: [1, 2, 4].
При выполнении программы X сравнивается с первым элементом списка.
нет
X=3
[1 | 2, 3, 4] - первая часть правила не выполняется, 1 заносится
в стек, рекурсивный вызов для хвоста [2, 3, 4]
нет
X=3
[2 | 3, 4] - первая часть правила не выполняется, 2 заносится в
стек, рекурсивный вызов для хвоста [3, 4]
да
X=3
[3 | 4] первая часть правила выполняется, результирующий
список принимает значение хвоста L = [4]. Элементы извлекаются из стека по
одному и становятся в голову списка L.
L = [1, 2, 4]
5. Вставка символа X в список
Определим отношение ins(X, L, L1), где
X – добавляемый элемент в список
L – исходный список
L1 – список, полученный в результате вставки элемента Х в список L
Отношение ins(X, L, L1) можно определить через del(X, L1, L). Если для
отношения del(X, L1, L) список L1 – исходный список, содержащий элемент Х,
то для ins(X, L, L1) список L1 является результирующим. Список L, не
содержащий Х, для del(X, L1, L) – результирующий, а для ins(X, L, L1) –
исходный.
ins(X, L, L1): - del(X, L1, L).
Например, для вставки элемента 5 в список [1, 2, 3] необходимо
составить запрос:
GOAL
ins(5, [1, 2, 3], L),Write (L), nl, fail.
Результат:
[5, 1, 2, 3]
[1, 5, 2, 3]
[1, 2, 5, 3]
[1, 2, 3, 5]
Примечание: так как отношение ins(X, L, L1) определено через del (X, L1, L),
то в разделе CLAUSES должно быть описано также правило del(X, L1, L).
44
Литература
1. Адаменко А., Кучуров А. Логическое программирование и Visual
Prolog.-CПб., 2003.
2. Братко И. Программирование на языке ПРОЛОГ для искуственного
интеллекта.- М., 1990.
3. Ин Ц., Соломон Д. Использование Турбо-Пролога. -М., 1993.
4. Клоксин У., Меллиш К. Программирование на языке ПРОЛОГ. -М.,
1991.
5. Макаллистер Дж. Искусственный интеллект и Пролог на микроЭВМ.М., 1990.
6. Нильсон Н. Искусственный интеллект. М., 1973.
7. Попов Э.В. Экспертные системы. М., 1987.
8. Симонс Дж. ЭВМ пятого поколения: компьютеры 90-х годов.- М.,1985 г.
9. Тимофеев А.В. Информатика и искусственный интеллект.- М.,1992.
10.Янсон А. Турбо-Пролог в сжатом изложении. -М.,1990.
45
Download