Языки программирования для ЭС и языки представления знаний

 

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

Оценивая данный процесс с сегодняшних позиций, можно указать в этой области две тенденции. Первая из них как бы повторяет «классический» путь развития средств автоматизации программирования: автокоды — языки высокого уровня — языки сверхвысокого уровня — языки спецификаций. Условно эту тенденцию мож­но назвать восходящей стратегией в области создания средств автоматизации разработки интеллектуальных систем. Вторая тенденция, нисходящая, связывает­ся со специальными средствами, уже изначально ориентированными на опреде­ленные классы задач и методов ИИ. В конце концов, обе эти тенденции, взаимно обогатив друг друга, должны привести к созданию мощного и гибкого инструмен­тария интеллектуального программирования. Но для настоящего этапа в этой области, по нашему мнению, характерна концентрация усилий в следующих на­правлениях:

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

2. Расширение базисных языков ИИ до систем представления знаний за счет спе­циализированных библиотек и пакетов.

3. Создание языков представления знаний (ЯПЗ), специально ориентированных на поддержку определенных формализмов, и реализация соответствующих
трансляторов с этих языков.

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

До недавнего времени наиболее популярным базовым языком реализации сис­тем ИИ вообще и ЭС, в частности, был ЛИСП [1978].

Как известно, язык ЛИСП был разработан в Стэнфорде под руководством Дж. Мак-карти в начале 60-х годов и не предназначался вначале для программирования задач ИИ. Это был язык, который должен был стать следующим за ФОРТРАНОМ шагом на пути автоматизации программирования.

К концу 80-х годов ЛИСП был реализован на всех классах ЭВМ, начиная с пер­сональных компьютеров и кончая высокопроизводительными вычислительны­ми системами/Новый толчок развитию ЛИСПа дало создание ЛИСП-машин, которые и в настоящее время выпускаются рядом фирм США, Японии и Запад­ной Европы.

В середине 60-х годов, то есть на этапе становления ЛИСПа, разрабатывались языки, предлагающие другие концептуальные основы. Наибо­лее важными из них в области обработки символьной информации являются, по нашему мнению, СНОБОЛ [1978], разработанный в лабораториях Белла, и язык РЕФАЛ [Турчин, 1968], созданный в АН СССР.

В основу языка РЕФАЛ положено понятие рекурсивной функции, определенной на множестве произвольных символьных выражений. Базовой структурой дан­ных этого языка являются списки, но.не односвязные, как в ЛИСПе, а двунаправ­ленные. Обработка символов ближе, как мы бы сказали сегодня, к продукционно­му формализму. При этом активно используется концепция поиска по образцу, характерная для СНОБОЛа. Таким образом, РЕФАЛ вобрал в себя лучшие черты наиболее интересных языков обработки символьной информации 60-х годов. В настоящее время можно говорить о языке РЕФАЛ второго [Климов и др., 1987] и даже третьего поколения; Реализован РЕФАЛ на всех основных типах ЭВМ и активно используется для автоматизации построения трансляторов, для построе­ния систем аналитических преобразований, а также, подобно ЛИСПу, в качестве инструментальной среды для реализации языков представления знаний [Хоро­шевский, 1983].

В начале 70-х годов появился еще один новый язык, способный составить конку­ренцию ЛИСПу при реализации систем, ориентированных на знания* — язык ПРОЛОГ [1982]. Он не дает новых сверхмощных средств програм­мирования по сравнению с ЛИСПом, но поддерживает другую модель организа­ции вычислений. Подобно тому, как ЛИСП скрыл от программиста устройство памяти ЭВМ, ПРОЛОГ позволил ему не заботиться (без необходимости) о пото­ке управления в программе. ПРОЛОГ предлагает такую парадигму мышления, в рамках которой описание решаемой задачи представляется в виде слабо структу­рированной совокупности отношений. Это удобно, если число отношений не слишком велико и каждое отношение описывается небольшим числом альтерна­тив. В противном случае ПРОЛОГ-программа становится весьма сложной для понимания и модификации. Возникают и проблемы эффективности реализации языка, так как в общем случае механизмы вывода, встроенные в. ПРОЛОГ, обеспе­чивают поиск решения на основе перебора возможных альтернатив и декларатив­ного возврата из тупиков.

В 70-х годах в программировании вообще и программировании задач ИИ, в част­ности, центр тяжести стал смещаться от процедурных к декларативным описа­ниям. К этому же времени в ИИ сформировались и концепции представления знаний на основе семантических сетей и фреймов. Естественно, что появились и специальные языки программирования, ориентированные на поддержку этих кон­цепций. Но из десятков, а может и сотен языков представления знаний (ЯПЗ) первого поколения лишь несколько сыграли заметную роль в про­граммной поддержке систем представления знаний. Харак­терными чертами этих ЯПЗ были: двухуровневое представление данных (абст­рактная модель предметной области в виде иерархии, множеств понятий и конкретная,модель ситуации как совокупность взаимосвязанных экземпляров этих понятий); представление связей между понятиями и закономерностей предметной области в виде присоединенных процедур; семантический подход к сопоставлению образцов и поиску по образцу.

Принципиально иное направление в программировании связано с методологиями непроцедурного программирования. Для этих целей используются непроцедурные языки программирования, которые можно разделить на объектные и декларативные. Объектно-ориентированный язык создает окружение в виде множества независимых объектов. Каждый объект ведет себя подобно отдельному компьютеру, их можно использовать для решения задач как "черные ящики", не вникая во внутренние механизмы их функционирования. Объектно-ориентированный подход к проектированию программных продуктов основан на:

– выделении классов объектов;

– установлении характерных свойств объектов и методов их обработки;

– создании иерархии классов, наследовании свойств объектов и методов их обработки.

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

Из языков объектного программирования, популярных среди профессионалов, следует назвать прежде всего:

С++ (Си++). Си++ - это объектно-ориентированное расширение языка Си, создан­ное Бьярном Страуструпом в 1980 году. Множество новых мощных возможностей, позволивших резко повысить производительность работы программистов, наложилось на унаследованную от языка Си определенную низкоуровневость, в результате чего создание сложных и надежных программ потребовало от разработчиков высокого уровня профессиональной подготовки;

Delphi (Дельфи) – язык объектно-ориентированного "визуального" программирования. Явился развитием языка Паскаль.

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

Анализ формализмов представления знаний и методов вывода решений позволяет сформулировать следующие требования к ЯПЗ:

• наличие простых и вместе с тем достаточно мощных средств представления
сложно структурированных и взаимосвязанных объектов;

• возможность отображения описаний объектов на разные виды памяти ЭВМ;

• наличие гибких средств управления выводом, учитывающих необходимость
структурирования правил работы решателя;

• «прозрачность» системных механизмов для программиста, предполагающая
возможность их доопределения и переопределения на уровне входного языка;

• возможность эффективной реализации.

Конечно, перечисленные требования во многом противоречивы. Но удачные язы­ки и системы представления знаний, как правило, появляются лишь тогда, когда в рамках разумного компромисса учтены все эти требования.