Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СИИ.doc
Скачиваний:
175
Добавлен:
02.05.2014
Размер:
3.54 Mб
Скачать

1.8. Инструментальные средства создания систем искусственного интеллекта

Средства построения СИИ включают:

  • языки программирования

  • языки инженерии знаний

  • вспомогательные средства

  • средства поддержки.

Рассмотрим эти средства.

      1. Языки программирования

В качестве языков программирования, используемых дня построе­ния СИИ, наиболее широко используются Си, Лисп, Пролог, Паскаль. Особенно следует отметить языки Лисп и Пролог в первую очередь в силу наличия в них встроенных средств для организации интеллектуальных процедур (унификация, альтернативный поиск, возврат (backtracking), обработка символьной информации, возможности реали­зации функций базы данных). Языки программирования делятся на три класса:

  • императивные языки;

  • функциональные языки;

  • логические языки.

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

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

Наиболее важным среди функциональных языков является язык Лисп. Лисп основан на функциональном - исчислении Черча. На его базе разработаны мощные инструментальные оболочки экспертных сис­тем KEE,LOOPS,ART,S.Iи др. Такие широко распространенные вер­сии языка Лисп как Интерлисп и Мехлисп имеют развитые редакторы и средства отладки.

Лисп был изобретен в 1956 г. Мак Карта. С момента изобретения Лисп трансформировался с языка чисто символьной обработки в язык общецелевого назначения. Большинство лисповских программ записы­ваются в форме функций: значения одних функций являются аргу­ментами других.

Например, если PLUS- функция сложения, то выражениеX + Yпо­лучает в Лиспе вид

(PLUS X Y),

а выражение (Х + Y + Z)принимает форму

(PLUS X (PLUS Y Z))

Аргументы и имена функций разделяются запятыми или пробела­ми.

Присваивание в форме X = аимеет вид

(SET X a).

Для записи условных выражений используется функция COND, первый аргумент которой представляет условную часть выражения (часть "ЕСЛИ..."), а второй - операционную часть (часть "ТО..."). Например,

(COND ((ZEROP S) (SET X 5)))

представляет условное выражение, условная часть "ЕСЛИ..." которою соответствует (ZEROPS), а операционная (SЕТ X 5).ZEROPесть функция сравнения с нулем. Приведенное выше выражение проверяет, равно лиSнулю, и в случае положительного результата проверки при­сваивает X значение 5.

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

АТОМ - проверяет, является ли аргумент атомом или списком

NULL - проверяет, является ли аргумент связанной или несвязанной переменной

EQUAL - проверяет равенство двух аргументов

GREATERP - проверяет, что один аргумент больше второго.

Пользователь может определять свои функции с помощью - выражений Черта, например:

(LAMBDA (A B) (DIFFERENCE (TIMES A A) (TIMES B B)))

здесь А, В- аргументы функции, которая сама имеет следующую струк­туру:

(DIFFERENCT (TIMES A A) (TIMES B B))

где DIFFERENCE - функция вычитания X - Y;

TIMES - функция умножения X * Y.

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

X2 - Y2.

Для того, чтобы выражение объявить как функцию, используется новая функция - DEFUNE. В общем случае, еслиfi--выражение для функцииfi, то ее объявление таково:

(DEFUNE (имя_функции (fi))

Так, в случае выше имеем следующее объявление функции FUN1 с двумя аргументами:

(DEFUNE (FUN1 (LAMBDA (A B) (DIFFERENCE (TIMES A A) (TIMES B B))))

Теперь, например, подстановка FUN1 (5 3) дает в результате 16.

Важнейшее место в Лиспе занимают операции над списками, ос­новными из которых являются функции CAR. (выделяющая первый эле­мент списка),CDR(выделяющая остаток списка после удаления перво­го элемента) и CONS (соединяющая два списка).

Например, если:

X есть (2 6 4 7) то (CAR X) есть 2

X есть (3 2 1) то (CDR X) есть (2 1)

X есть ((2 6)(4 7) то (CDR X) есть (4 7)

X есть (5) то (CDR X) есть NIL.

X есть (2 4) и Y есть (6 7), то (CONS X Y) есть ((2 4) (6 7))

NIL- специальное обозначение для "лжи" или пустой список.

Языки программирования, подобные языку Лисп, представляют максимальную гибкость разработчику СИИ, но не подсказывают ему, как представлять знания и строить механизмы их обработки. Это ограни­чение в значительной мере снято в языке Пролог. Язык Пролог "реализует" математическую логику в программировании согласно идее, предложенной А. Кольмероэ и Р. Ковальским. Собственно, Пролог базируется на разновидности исчисления предикатов -так называемом клаузальном исчислении Хорна.

Клоз, это формула вида

x1 x2 ... xs (L1 ... Lm) (1.48)

где Li- атомарная формула (литерал), ,

xj - переменная, входящая в Li, j = .

Среди атомарных формул Liвыделяют позитивные (без отрица­ния) и негативные (с отрицанием) литералы:

(1.49)

или с учетом эквивалентности имеем

x1 ... xs (A1 ... Ak B1 & B2 & ... & Bn) (1.50)

Определение. Программным клозом называется формула

B1, B2, ..., Bn A,

содержащая ровно один позитивный литерал А, называемый головным (или просто заголовком). Часть клозаB1, B2, ..., Bn называется телом клоза (запятая, разделяющая литералы В, эквивалентна логической конъюнкции). Как видим из последнего представления, программный клоз - это логическая формула, имеющая форму продукции "ЕСЛИ- ТО", где часть "ЕСЛИ" соответствует телу клоза, а часть "ТО" - заголовку клоза.

Определение. Фактом называется клоз без тела, т.е.Аили еще проще:А.

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

Определение. Целью называется клоз без заголовка:

B1, B2, ..., Bn .

Предикатные формулы B1, B2, ..., Bn входящие в цели, называютсяпод­целями.

Программным представлением клоза является следующая форма, называемая правилом:

A(U1, ..., Unk):-

B1 (X1, ..., Xn1),

B2 (Y2, ..., Yn2),

....

Bm (Z1, ..., Znm),

где символ " :- " стоит вместо "", а символ запятая "," соответствует логической конъюнкции.

Выполнение правила заключается в доказательстве его заголовка (головного литерала). Этот процесс заканчивается в случае успеха нахождением подходящей интерпретации для правила. Для того чтобы доказать головную формулу. Пролог последовательно доказывает каждую формулу в теле правила. Так, чтобы доказать формулу A(U1, ..., Unk), последовательно доказываются формулыB1(...), B2(...), ..., Bm(...). Для каждой из этих формулBi(...)в свою очередь имеется множество правил, гдеBi(...)является заголовком.

Рассмотрим следующие правила

(1) площадь (X, Y) :-

фигура (X, Y),

write (X=, X, Y=, Y).

(2) фигура (квадрат, сторона * сторона).

(3) фигура (круг, /2 * радиус * радиус).

(4) фигура (треугольник, высота * основание * 1/2).

(5) фигура (_, не известно).

Пусть целью будет

площадь (круг, Z).

Такая цель означает, что нужно найти значение Z, соответст­вующее площади круга. Пролог пытается сначала нагой правило, в заголовке которого стоит литерал "площадь". В данном случае правило с заголовком указанного вида таково:

(1) площадь (Х, Y) - фигура (Х, Y).

Аргументы обеих формул в этом правиле совпадают и являются пе­ременными (которые принято записывать с заглавных букв). Первый шаг, выполняемый Прологом, это передача значений для XиYиз цели:

Х = круг, Y = Z.

В нашем случае Xполучает конкретное значение "круг", в то время как записьY = Z просто устанавливает факт равенства двух перемен­ных. Как только переменнаяYполучает значение,Zбудет присвоено то же значение. Теперь правило (1) трансформировалось в правило сле­дующего вида:

(1’) площадь (круг, Y):- фигура (круг,Y).

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

если (фигура(круг, Y)), то (площадь(круг, Y)).

Теперь Пролог формирует новую цель:

фигура (круг, Y).

Для этой новой цели он ищет подходящее правило. В нашей про­грамме таких правил 4 (правила (2) - (5)). Эти правила имеют усеченный вид: в структуре "если (...) то (...)", как видим, в них отсутствует часть "если (...)". С точки зрения логики это означает, что независимо от исходных условий, записываемых в части "если (...)", эти правила ут­верждают истинность частей "то (...)". Следовательно, доказывать такие правила не надо.

Итак, для цели "фигура (круг, Y)" выбирается правило

фигура (квадрат, "сторона * сторона'').

Как и на первом шаге, выполняется попытка передачи значений переменным. Иначе говоря, получается следующее:

круг = квадрат; Y = " сторона * сторона ".

Учитывая, что "круг" и "квадрат" не переменные (первый символ "к" - не заглавный). Пролог вместо присваивания сравнивает их. Ре­зультат сравнения - "ложь". Следовательно, правило (2) использовать нельзя. Однако, есть еще правила с заголовком "фигура". Поэтому Про­лог выбирает следующее по порядку:

  1. фигура (круг, " /2*радиус*радиус").

Текущая цель такова:

фигура (круг, Y).

Результат присваивания значений:

круг = круг; Y = " /2*радиус*раднус".

Цель доказана, поскольку доказывать правило (3) не надо, о чем было сказано выше. Поскольку выше было принято, что Y = Z, тоZав­томатически получает значениеZ= "л /2*радиус*радиус "

Стандартный предикат writeвыведет найденные значения, напеча­тав:

X = круг, Y = " /2*радиус*радиус".

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

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

Переменная считается свободной, если ей не присвоено никакое значение, в противном случае переменная считается связанной.

Алгоритм интерпретатора Пролога заключается в следующем. Если список целей пуст - работа завершается успехом. Если список це­лей не пуст,' то интерпретатор продолжает работу, выполняя процедуру 'ПРОСМОТР'.

Процедура 'ПРОСМОТР'. Правила программы последовательно просмаливаются от начала к концу до обнаружения первого правилаС, такого, что заголовокСсопоставим с первой цельюG1. Если такого правила обнаружить не удается, то восстанавливается предыдущий спи­сок целей и для него выполняется процедура 'ПРОСМОТР', начищая с последнего испробованного правилаС. Если список целей не пуст, а все правила для первом цели в самом первом списке целей проверены, то алгоритм завершается общей неудачей. ЕслиСнайдено и имеет вид

H:- B1, ..., Bn,

то переменные в Спереименовываются, чтобы получить такой вариантС'предложенияС, в котором нет общих переменных со спискомG1, ..., Gm.

Пусть С'- это

Сопоставляется G1сН'. ПустьS- результирующая конкретизация переменных. В спискеG1, ..., GmцельG1заменяется на список, что порождает новый список целей:

Заметим, что если С- факт, то из списка целей удаляется первая цельG1.

Переменные в новом списке целей устанавливаются согласно интерпретации S, что порождает новый список целей

Старый список L0 = G1, ..., Gm, сохраняется, а система переходит к доказательству нового спискаL1 , т.е. осуществляет переход к процеду­ре 'ПРОСМОТР'.

Мы обратимся к рассмотрению средств языка Пролог для разработки механизмов СИИ во второй части книги. Читателю потребуется 6азовый набор сведений о системе TURBO-PROLOG2.0, помещенный в Приложении 2. Чтение этого приложения может быть отложено до гла­вы, посвященной разработке базовых механизмов учебной СИИ во вто­рой части пособия.

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