/
Автор: Марселлус Д..
Теги: компьютерные технологии искусственный интеллект программирование информационные технологии языки программирования язык программирования turbo
ISBN: 5-279-00613-0
Год: 2994
Текст
J
рселлус
Программирование
экспертных
систем
на
ТУРБО
ПРОЛОГЕ
Д. Марселлус
ПРОГРАММИРОВАНИЕ
ЭКСПЕРТНЫХ СИСТЕМ
НА ТУРБО ПРОЛОГЕ
Expert Systems
Programming
in Turbo Prolog
Daniel H. Marcellus
Technicon Science Center
Tarrytown, New York
Prentice Hall
Englewood Cliffs, New Jersey 07632
Д. Марселлус
Программирование
экспертных систем
на ТУРБО ПРОЛОГЕ
Перевод с английского И.И. Чижикова
Предисловие С.В. Трубицына
Москва
’’ФинаНсьГ'й'СТатистика'
1994
ББК 32.813
М28
УДК 681.3
Марселлус Д.
М28 Программирование экспертных систем на Турбо
Прологе: Пер. с англ. / Предисл. С.В.Трубицына. -
М.: Финансы и статистика, 1994. - 256 с.: ил.
ISBN 5-279-00613-0.
Книга продолжает ряд публикаций издательства, рассчитан-
ных на практическое освоение программистами и пользователя-
ми технологии экспертных систем (ЭС). На конкретных
примерах объяснены идеи проектирования и архитектура всех
основных блоков ЭС, а также способы их реализации на Турбо
Прологе.
Для программистов, желающих создавать интеллектуальные
программы и экспертные системы.
м 2404010000 - 009 _ Я1 -
М—016(^94" 884,3 ББК 32.813
© 1989 by Prentice-Hall,
Inc. a division of
ISBN 0-L3-29584L-4 (США) Simon & Schuster
Englewood Cliffs,
NJ 07632
ISBN 5-279-00613-0 (РФ) © И.И.Чижиков, перевод, 1994
© С.В.Трубицын, предисловие, 1994
ПРЕДИСЛОВИЕ
К РУССКОМУ ИЗДАНИЮ
Экспертные системы - это яркое и быстро прогрессиру-
ющее направление в области искусственного интеллекта.
Причиной повышенного интереса, который экспертные
системы (ЭС) вызывают к себе на протяжении всего свое-
го существования, т.е. уже более пятнадцати лет, являет-
ся возможность их применения к решению задач из самых
различных областей человеческой деятельности. Пожа-
луй, не найдется такой проблемной области, в которой не
было бы создано ни одной ЭС или по крайней мере, такие
попытки не предпринимались бы.
Отличительной чертой компьютерных программ, назы-
ваемых ЭС, является их способность накапливать знания
и опыт наиболее квалифицированных специалистов (экс-
пертов) в какой-либо узкой предметной области. Затем с
помощью этих знаний пользователи ЭС, имеющие обыч-
ную квалификацию, могут решать свои текущие задачи
столь же успешно, как это сделали бы сами эксперты. Та-
кой эффект достигается благодаря тому, что экспертная
система в своей работе воспроизводит примерно ту же
схему рассуждений, которую обычно применяет человек-
эксперт при анализе проблемы. Тем самым ЭС позволяют
копировать и распространять знания, делая уникальный
опыт нескольких высококлассных профессионалов до-
ступным широким кругам рядовых специалистов.
Уровень пользователей экспертных систем может варь-
ироваться в очень широком диапазоне - от бухгалтера до
президента компании или консультанта правительства.
От вида деятельности пользователей зависят и функции,
которыми наделяются создаваемые для них ЭС. На экс-
пертные системы, которые используют лица, занятые
анализом сложных ситуаций и принятием ответственных
решений, возлагается выполнение рутинных однотипных
операций по обработке больших массивов информации
(например, таких, как поиск в них “необычных” сведе-
ний, свидетельствующих о нарушении привычного поло-
жения дел и требующих принятия соответствующего
решения). Другой класс ЭС ориентирован на специали-
стов, не обладающих высокой квалификацией и нуждаю-
щихся в привлечении знаний экспертов для правильного
5
решения своих повседневных задач типа обнаружения не-
исправностей в механизмах, постановки диагноза больно-
му, юридически обоснованного разрешения спора и т.д.
В настоящее время технология экспертных систем по-
лучила широкое распространение. Так, на американском
и западноевропейском рынке систем искусственного ин-
теллекта (ИИ) организациям, желающим создать экспер-
тную систему, фирмы-разработчики предлагают сотни
инструментальных средств для их построения. Приклад-
ных же ЭС, успешно решающих задачи из определённого
узкого класса, насчитываются тысячи. Это позволяет го-
ворить о том, что ЭС сейчас составляют мощную ветвь в
индустрии программных средств.
Вместе с тем следует отметить, что на пути к тому
прочному положению, которое ЭС теперь занимают в ка-
честве важного компонента новой информационной
технологии, были и спады, и подъемы. За время сущест-
вования ЭС уважительное отношение к ним со стороны
как действительных, так и потенциальных пользовате-
лей порой изменялось на диаметрально противоположное.
Экспертным системам довелось пережить и период без-
граничной веры во всемогущество, и период, когда вы-
сказывались сомнения в их полезности вообще. Однако
выдвигаемые обвинения по большей части были нео-
боснованными, поскольку неэффективность ЭС проявля-
лась, как правило, лишь в случаях их некорректного
применения - или на низкопроизводительной аппарату-
ре, не соответствующей сложности предметной области,
или в задачах, для решения которых они не предназнача-
лись.
Разочарования постигали разработчиков ЭС, как пра-
вило, тогда, когда они пытались их использовать в ка-
честве инструмента для решения задач, требующих
привлечения чисто человеческих приемов мышления -
аналогий, ассоциаций и т.д., то есть нуждающихся в ме-
ханизмах, которые в ранних экспертных системах от-
сутствовали даже в зачаточном состоянии. Попытки
втиснуть творческий поиск решения сложной проблемы,
требующий рассуждений “по здравому смыслу”, в про-
крустово ложе обычно применяемой в ЭС модели вывода с
помощью правил вида “если ..., то ...” неизбежно приво-
дили к неудаче. Экспертные системы, основанные на пра-
вилах, оказались неперспективны, поскольку могли
решать лишь сравнительно простые задачи, не требую-
6
щие приложения интеллекта в истинном, а не метафори-
ческом смысле этого слова.
Компьютерные системы, которые могут лишь повто-
рить логический вывод эксперта, принято относить к ЭС
первого поколения. Однако специалисту, решающему ин-
теллектуально сложную задачу, явно недостаточно
возможностей системы, которая лишь имитирует деятель-
ность человека. Ему нужно, чтобы ЭС выступала в роли
полноценного помощника и советчика, способного прово-
дить анализ нечисловых данных, выдвигать и отбра-
сывать гипотезы, оценивать достоверность фактов,
самостоятельно пополнять свои знания, контролировать
их непротиворечивость, делать заключения на основе
прецедентов и, может быть, даже порождать решения но-
вых, ранее не рассматривавшихся задач. Наличие таких
возможностей является характерным для ЭС второго по-
коления, концепция которых начала разрабатываться 3-4
года назад. Экспертные системы, относящиеся ко второму
поколению, называют партнерскими, или усилителями
интеллектуальных способностей человека. Их общими
отличительными чертами является умение обучаться и
развиваться, т. е. эволюционировать.
Для сопоставления возможностей ЭС первого и второго
поколения рассмотрим их основные черты. Они могут
быть разбиты на следующие классы: представление зна-
ний, механизм вывода, интерфейс пользователя, объясне-
ние полученных результатов, приобретение знаний и
обучение *.
Ограничения, присущие ЭС первого поколения, состо-
ят в следующем.
Представление знаний:
• функционирование системы осуществляется только
на основе знаний, полученных от эксперта. Опыт,
приобретаемый ею в процессе эксплуатации, не на-
капливается и не применяется;
• используется какая-либо одна модель представления
знаний: продукции, семантические сети или фреймы;
• методы представления знаний позволяют описывать
лишь статические предметные области;
1 Сравнительный анализ ЭС первого и второго поколений приведен,
например, в работах: Keravnou Е.Т. What is a deep system? An analysis
of first-generation limitations and review of second-generation architectures.
-Computer Physics Communication, 1990, vol.61, N 3. P.3-12;
Devedzic V. Features of second-generation expert systems - an extended
overview. - Engineering Application of Artificial Intelligens, 1990, vol.3,
N 4. P.255-270.
7
• модели представления знаний ориентированы на от-
носительно простые и хорошо структурированные об-
ласти;
• отсутствуют знания о границах области компетент-
ности системы, за пределами которой система оказы-
вается неработоспособной;
• существует большое количество не выраженных яв-
но сведений, “скрытых” в структурах представления
знаний. Это обусловлено тем, что не все допущения и
предположения эксперта нашли отражение в модели
предметной области, включенной в систему.
Механизм вывода:
• получение новых заключений с помощью вывода на
знаниях, т.е. на основе парадигмы ЗНАНИЯ + ВЫ-
ВОД;
• реализация вывода только при условии полноты зна-
ний и данных;
• неумение проводить вывод с учетом связи объектов
или фактов в пространстве и во времени;
• скачкообразная потеря способности экспертной сис-
темы находить решения даже при незначительном
выходе задач за пределы области ее компетентности;
• неспособность найти приближенный ответ, если для
вывода точного решения нет всех требуемых данных
или отсутствуют подходящие правила вывода (как,
например, при попытке решить нестандартную зада-
чу);
• несоответствие схемы вывода в ЭС схеме рассужде-
ний эксперта;
• использование в структуре управления выводом об-
щих принципов, не полностью отражающих специ-
фику решаемых задач;
• отсутствие средств имитации процессов, протекаю-
щих в предметной области, что не позволяет задавать
системе вопросы вида “Что будет, если...” .
Интерфейс пользователя:
• отсутствие средств настройки на конкретного пользо-
вателя;
• жесткость диалога - ответы пользователя должны
быть представлены в строго определенном виде и
формате;
• сведения, получаемые ЭС от пользователя в процессе
экспертизы, не запоминаются, поэтому если они по-
требуются в следующем сеансе работы, то их придет-
ся вводить заново;
8
• несогласованность вопросов, задаваемых системой
пользователю в процессе проведения экспертизы: хо-
тя каждый вопрос в отдельности вполне логичен, в их
последовательности может отсутствовать целенап-
равленность;
• избыточность совокупности вопросов экспертной сис-
темы, адресованных пользователю, обусловленная
тем, что при ее разработке не были выявлены взаи-
мосвязи между данными, требующимися для получе-
ния решения и позволяющими построить для каждой
экспертизы оптимальную серию вопросов.
Объяснение полученных результатов:
• механистичность построения объяснений, формируе-
мых путем объединения аргументации, которая со-
держится в каждом из примененных правил. Это не
позволяет регулировать степень обобщенности выда-
ваемых объяснений в соответствии с пожеланиями
пользователя;
• несовершенство механизма объяснения полученного
решения, состоящего в том, что пользователь получа-
ет либо тривиальную аргументацию, либо она не по-
крывает всех его потребностей.
Приобретение знаний и обучение:
• пополнение знаний системы и контроль их непроти-
воречивости “вручную”;
• обязательность приведения знаний эксперта к виду,
который требует модель представления знаний в дан-
ной ЭС;
• несовпадение структуры знаний о предметной обла-
сти в ЭС с их организацией у эксперта. Это приводит
к появлению “пробелов” в знаниях ЭС и, как следст-
вие, к тому, что найденные ею решения могут не-
сколько отличаться от решений эксперта;
• отсутствие способности к обучению.
Перечисленные ограничения ЭС первого поколения
вызывают необходимость создания более совершенных и
эффективных систем, которые относятся ко второму по-
колению. Они должны удовлетворять следующим требо-
ваниям \
1 Характеристике ЭС второго поколения помимо статей, упомянутых
в примечании на с. 7, посвящены также работы: Загоруйко Н.Г.
Партнерские системы//Вычислительные системы. — Новосибирск,
1990. — № 134. — С.3-18; Финн B.K. Правдоподобные рассуждения в
интеллектуальных системах типа ДСМ. — Итоги науки и техники. —
ВИНИТИ, 1991. — Т.15. — С.54-101 (Информатика).
9
Представление знаний:
• используются не поверхностные знания в виде эври-
стических правил, как в ЭС первого поколения, а
глубинные, представляющие собой теории предмет-
ных областей (аналогичные естественнонаучным тео-
риям) и общие стратегии решения проблем. При
столкновении ЭС с новой для нее проблемой она мо-
жет на основе общих принципов такой теории очер-
тить контуры решения или определить конкретные
знания, которые необходимо привлечь для получения
точного решения;
• знания организованы в виде составных иерархиче-
ских представлений, включающих сети фреймов,
продукции и логические модели;
• система имеет не только модель предметной области,
но и модель самой себя, что позволяет ей эффективно
определять границы своей компетентности;
• одним из компонентов ЭС является база данных с не-
полной информацией;
• ЭС может решать задачи из динамических предмет-
ных областей, т.е. областей, знания о которых могут
изменяться непосредственно в процессе вывода (в
том числе и в результате действий самой ЭС);
• система включает средства для одновременной рабо-
ты с несколькими моделями предметной области, от-
личающимися друг от друга уровнями детальности.
Механизм вывода:
• замена принятого в ЭС первого поколения вывода ре-
шения на его обоснование, т.е. вместо дедукции ис-
пользуется аргументация, что более свойственно
человеческим рассуждениям. При обосновании реше-
ния основной операцией становится поиск аргумен-
тов, подтверждающих утверждение, которое система
должна доказать или опровергнуть. Таким образом, в
ЭС второго поколения осуществлен переход от па-
радигмы ЗНАНИЯ+ ВЫВОД к парадигме ЗНАНИЯ
+ АРГУМЕНТАЦИЯ1;
• сочетание достоверного (дедуктивного) и правдопо-
добного вывода, т.е. вывода, в котором каждому
получаемому заключению присваивается некоторый
вес, характеризующий степень его достоверности.
Решатель ЭС второго поколения построен по принци-
пу “правдоподобный вывод + достоверный вывод”;
1 См.: Будущее искусственного интеллекта: Сб. статей. Сост.: K.E Леви-
тин, Д. А.Поспелов. — М.: Наука, 1991.
10
• способность системы по мере необходимости ослаб-
лять или усиливать в задаче принятые допущения;
• наличие помимо свойственного ЭС первого поколе-
ния дедуктивного вывода средств для реализации ин-
дуктивного (от частного к общему) и абдуктивного
(от частного к частному) выводов, а также проведе-
ния немонотонных рассуждений, в процессе которых
поступившие факты иногда изменяют истинность
выведенных ранее заключений. Кроме того, системы
второго поколения могут обрабатывать в процессе
вывода временные и пространственные закономерно-
сти.
Интерфейс пользователя:
• ЭС включает модель пользователя, которая дает воз-
можность организовать взаимодействие с ним в опти-
мальной форме, т.е. форме, при которой решение
задачи будет получено за минимальное время. В та-
кой модели учитываются особенности работы конк-
ретного пользователя, специфика решаемых им
задач и типичные для него сценарии диалога.
Приобретение знаний и обучение:
• имеются средства управления процессом наполне-
ния ЭС знаниями и настройки на предметную об-
ласть, позволяющие выбирать модель представления
знаний, в наибольшей степени соответствующую
структуре знаний эксперта;
• ЭС располагает средствами автоматического обнару-
жения закономерностей. Это означает, что она может
получать знания не только от эксперта, но и самосто-
ятельно извлекать их из базы данных путем выдви-
жения гипотез и построения их обоснований, то есть
обучаться на примерах;
• система способна анализировать имеющиеся у нее
знания, обнаруживая противоречия между стары-
ми знаниями и вновь полученными от эксперта или
выведенными эмпирически, устанавливать факт их
неполноты или ошибочности. Для разрешения проти-
воречий или при необходимости получить недоста-
ющие данные система по собственной инициативе
обращается к пользователю. В этом проявляется од-
но из важнейших свойств ЭС второго поколения - их
активность.
Создание экспертных систем с широким спектром воз-
можностей, являющихся не механическими исполнителя-
ми воли человека, а его равноправными партнерами при
поиске решений в сложных ситуациях, требует привлече-
п
ния эффективных инструментальных средств программи-
рования. К числу таких средств относятся языки обработ-
ки символьной информации, одним из наиболее ярких
представителей которых является Пролог.
Пролог - язык высокого уровня, имеющий строгое тео-
ретическое обоснование и ориентированный на использо-
вание концепций и методов математической логики. Как
следует из его названия, Пролог предназначен для Про-
граммирования в терминах ЛОГики. Основной особенно-
стью Пролога, отличающей его от всех других языков,
является декларативный характер написанных на нем
программ.
Строительными блоками программы является множе-
ство объектов определенной структуры, а также функции
и отношения, связывающие эти объекты. Программа на
Прологе не является таковой в традиционном понимании,
так как не содержит управляющих конструкций типа ус-
ловных операторов, операторов цикла или перехода» Она
представляет собой модель некоторого фрагмента пред-
метной области, о котором идет речь в решаемой задаче.
Поэтому программирование на Прологе требует иного
стиля мышления, отказа от принятых программистских
стереотипов, что порой оказывается психологически
сложно. Действительно, вместо того, чтобы задать опре-
деленную последовательность действий, приводящих к
решению задачи, в программе на Прологе нужно описать
ее содержание в терминах объектов и отношений между
ними. Таким образом, вместо алгоритма решения задачи
программист составляет ее логическую спецификацию.
Что же касается построения алгоритма, то это выпол-
няется автоматически самой Пролог-системой с помощью
встроенного механизма логического вывода. При этом
цель решения задачи представляется в виде запроса к ба-
зе данных, в которой содержится описание предметной
области задачи. Для поиска в базе данных значений, тре-
буемых в запросе, Пролог-система инициирует механизм
вывода. Таким образом, вычисления в Прологе представ-
ляют собой процесс дедукции, направленный на построе-
ние доказательства целевого утверждения задачи.
В настоящее время как сам язык Пролог, так и многие
теоретические концепции, лежащие в его основе, по-
лучили широкое распространение в самых различных
областях, таких, как разработка новых архитектур вы-
числительных систем, формальное описание семантики
языков программирования, построение баз данных с де-
12
дуктивными возможностями, создание экспертных сис-
тем, а также лингвистика.
Пролог - быстро развивающийся язык, только за по-
следние годы появилось более десятка его новых диа-
лектов. Создано несколько систем программирования,
включающих трансляторы, отладчики и редакторы Про-
лог-программ. Пролог оказался очень восприимчив к
иным парадигмам программирования, далеким от мате-
матической логики, в частности к функциональному и
объектно-ориентированному программированию. В ре-
зультате появился язык, в котором сочетаются досто-
инства Пролога и Лиспа, и разработаны объектные
расширения Пролога, в которых имеются средства для ра-
боты с абстрактными типами данных.
В области систем представления знаний для решения
задач искусственного интеллекта разрабатываются гиб-
ридные модели, в рамках которых объединены семантиче-
ские сети и прологоподобные средства логического
вывода. Интеграция семантических и логических меха-
низмов, обменивающихся информацией в процессе вы-
вода, расширяет выразительные возможности модели
представления знаний и позволяет решать задачи, кото-
рые не могут быть решены с помощью каждого из этих
средств в отдельности. Примерами таких гибридных сис-
тем представления знаний могут служить KL-ONE, KL-
TWO, а также система KRYPTON, которые включают в
себя родовидовую иерархию понятий предметной области
и программы доказательства теорем.
В этой книге рассматриваются методы разработки экс-
пертных систем с помощью языка Пролог. К настоящему
времени в печати вышло немало прекрасных книг, пос-
вященных Прологу и его применению к решению раз-
личных задач, в том числе и из области искусственного
интеллекта. Однако книга Д.Марселлуса в этом ряду за-
нимает особое место, чему есть по крайней мере две при-
чины. Во-первых, она целиком ориентирована на
построение ЭС, что очень важно в условиях расширения
круга программистов, занятых их созданием. Во-вторых,
приведенные в ней программы в отличие от других изда-
ний имеют не иллюстративное, а самостоятельное зна-
чение, поскольку полностью реализуют основные блоки
экспертной системы.
Автор не углубляется в теоретические основы логиче-
ского программирования. Книга носит ярко выраженный
прикладной характер и ориентирована прежде всего на
13
программистов-практиков. Это могут быть как програм-
мисты, работающие на Прологе и желающие познако-
миться с методами его применения для построения ЭС,
так и специалисты в области ЭС, которые хотят оценить
возможности Пролога для создания своих программных
продуктов. Приведенные тексты Пролог-программ могут
быть непосредственно включены в состав рабочей версии
ЭС или использоваться в качестве образца при написании
свои£ собственных программ.
Читатель найдет в книге определение экспертных сис-
тем, классификацию решаемых ими задач, сопоставление
прямого и обратного выводов, методы работы с неопреде-
ленностью и правила пересчета факторов уверенности
при выводе. Две главы книги посвящены интерфейсу с ЭС
на естественном языке (ЕЯ). Хотя включение интерфейса
на ЕЯ в состав ЭС не получило широкого распростране-
ния, рассмотрение этих вопросов вполне оправдано, по-
скольку именно в задаче разбора фраз на ЕЯ особенно
ярко проявляются преимущества Пролога по сравнению с
традиционными процедурными языками программирова-
ния. К тому же и в этих главах автор сосредоточивается
на прагматических аспектах проблемы, опуская ее теоре-
тические основания. В результате читатель знакомится с
относительно простыми методами построения на Прологе
ЕЯ-интерфейса, которые могут быть им использованы для
построения практически полезных вопросно-ответных си-
стем.
Исчерпывающее предисловие автора книги исключает
необходимость давать ее более подробную характеристи-
ку. Книга содержит немало сведений, которые окажутся
незаменимыми при создании экспертных систем на Про-
логе. Прочтите ее.
С.В. ТРУБИЦЫН
ПРЕДИСЛОВИЕ
Экспертные системы (ЭС) - первый продукт, появив-
шийся на рынке как итог 30-летней изыскательской
работы в области искусственного интеллекта (ИИ). Эти
системы представляют собой программы для компьютера,
которые могут воспроизводить процесс решения пробле-
мы человеком-экспертом. В настоящее время интерес к
ЭС со стороны промышленности чрезвычайно возрос,
поскольку они способны дать средства, стимулирующие
повышение производительности труда и увеличение при-
быльности производства. Существует также мнение, что
внедрение машинного интеллекта в производство помо-
жет нам лучше разобраться в нашем собственном.
Как же изучить эту технологию? Какой выбрать под-
ход к изучению экспертных систем? В основном рабо-
ты по экспертным системам опубликованы в виде статей,
авторы которых описывают свои узкоспециальные проек-
ты. Подобные статьи не могут дать целостного восприятия
проблемы.
Еще одна трудность состоит в том, что большинство си-
стем, описанных в литературе, являются демонстрацион-
ными проектами, реализованными на дорогостоящем
оборудовании высокооплачиваемыми специалистами,
причем, как правило, такие системы работают лишь на
специализированных рабочих станциях, предназначен-
ных только для решения задач искусственного интеллек-
та.
Где же выход? Ответ нам представляется однозначным
~ в совершенствовании аппаратного и программного
обеспечения для компьютеров. Уровень его развития в
настоящее время позволяет создавать недорогие, но по-
лезные экспертные системы на небольших ЭВМ. Таинст-
венность, окружавшая разработку экспертных систем,
начинает рассеиваться. Оказывается, существует не-
сколько основных, очень мощных и весьма универсаль-
ных принципов построения ЭС. Цель настоящей книги
как раз и состоит в том, чтобы выявить эти основные
принципы и исследовать способы создания полезных ЭС
на небольших ЭВМ.
Язык, на котором описываются ЭС, - Пролог, а точнее
его диалект Турбо Пролог (Turbo Prolog). Однако мы не
15
ставим перед собой задачу дать в настоящей книге мето-
дику обучения этому языку.
Пролог - язык программирования, хорошо приспособ-
ленный для автоматизации различных форм логических
рассуждений. Конечно, можно создавать ЭС на языке
Бейсик или Паскаль либо на других процедурных языках,
но ЭС на Прологе будет более мощной./Во-первых, Про-
жог является языком очень высокого уровня: строка тек-
ста программы на Прологе выполняет большую работу,
чем строка программы на другом процедурном языке. Во-
вторых, этот язык наилучшим образом ориентирован на
естественные языки: он оптимально адаптирован для де-
кодирования соответствующей информации, представ-
ленной на естественном языке. (Такое декодирование
почти невозможно на Бейсике или Паскале.) Кроме того,
программировать на Прологе легче, чем на других язы-
ках, вследствие его декларативного характера, т. е. уси-
лия программиста в основном должны быть направлены
на описание проблемы, а не на выработку сложных после-
довательностей команд, которые предписывали бы маши-
не выполнение тех или иных действий. Система на
Прологе рассматривает данное описание проблемы как
фактическую программу (которой она и является на са-
мом деле). Поэтому часто говорят, что Пролог “выполня-
ет спецификацию программы”. И хотя такая фраза
звучит неправдоподобно, именно в этом заключается суть
декларативного программирования.
Многие программы ЭС были написаны на красивом
языке ИИ Лисп, которому присущи гибкость и вырази-
тельность, причем по гибкости Лисп подобен языку ассем-
блера. Но гибкость не всегда оказывается достоинством.
Пролог, к счастью, не столь гибок, как Лисп, что обуслов-
лено его высокоуровневым характером.
Таким образом, все вышеупомянутые свойства Проло-
га в совокупности делают его оптимальным языком для
создания несложных, но мощных программ ЭС.
Настоящая книга может быть рекомендована в качест-
ве учебного пособия для первого года обучения. Она
также полезна для программистов-практиков, которые
хотели бы самостоятельно изучить область ЭС.
Несколько слов о методике изложения материала.
Книга ориентирована на практическое использование и
построена на большом количестве примеров. Каждый
пример представляет один из важнейших принципов по-
строения архитектуры ЭС. В целом же эти примеры ил-
16
люстрируют основные свойства больших ЭС. Многие при-
меры даны как макеты, которые легко могут быть рас-
ширены или модифицированы для коммерческого
применения. Некоторые из них покажутся вам знакомы-
ми, поскольку они заимствованы из общедоступной лите-
ратуры по Прологу. Здесь приведено много новых
примеров, скажем, программа помощи студенту, про-
грамма-консультант по химическому синтезу, а также
полная оболочка ЭС и среда разработки.
Несмотря на то, что в книге используется Турбо Про-
лог, вы можете работать и с другими версиями Пролога. В
отличие от стандартного Пролога Турбо Пролог имеет не-
сколько встроенных функций, которые дают программи-
сту возможность максимально задействовать графику,
звук, память, порты ввода-вывода и т.п. IBM PC. Другие
версии Пролога не имеют этих свойств. В Турбо Прологе,
однако, отсутствуют некоторые новейшие свойства, в час-
тности способность рассматривать правила как данные,
способность сопоставлять имя предиката с переменной.
Впрочем, в книге мы не рассматриваем ни новейших, ни
низкоуровневых (машинных) свойств Турбо Пролога. Та-
ким образом, все описанные здесь программы должны ра-
ботать почти на любой версии Пролога.
Программы на Турбо Прологе выполняются очень быс-
тро, что обусловлено относительной простотой механизма
сопоставления с образцом. Программист должен помогать
этому механизму, давая описания типа параметров для
всех предикатов. Если вы запускаете любую из приведен-
ных в книге программ в стандартном Прологе, нет необ-
ходимости заниматься описаниями - она будет работать и
так.
Для вас важно научиться расчленять, изменять и рас-
ширять программу. Изучить ЭС можно только эмпириче-
ски. Поэтому в книге дается текст программы. Он
содержит оболочку ЭС, и приступать к работе над ней
можно незамедлительно, даже до освоения самого Проло-
га.
Программы будут работать на любом компьютере типа
IBM PC с Турбо Прологом. Вам потребуются опера-
Цинная система DOS 2.0 или более поздняя версия,
Дисплей и дисковод любых типов. Для компиляции
программ-примеров необходима свободная память объе-
мом как минимум 384К байт. Сама оболочка ЭС (уже
скомпилированная) может работать на системах с объе-
мом свободной памяти 256К байт.
17
Вопросы к автору книги следует направлять по его до-
машнему адресу:
Box 44
Walker Walley, NY 12588
Daniel H. Marcellus
Итак, мы приступаем к осуществлению нашей основ-
ной цели - изучить наиболее существенные принципы по-
строения экспертных систем и способы их реализации на
персональных компьютерах.
1. ВВЕДЕНИЕ
1.1. ЧТО ТАКОЕ
ЭКСПЕРТНАЯ СИСТЕМА?
Экспертная система - это компьютерная программа,
созданная для выполнения тех видов деятельности, ко-
торые под силу только человеку-эксперту, например
проектирования, планирования, постановки диагноза, пе-
ревода, реферирования, ревизии, выдачи рекомендаций.
Сферы применения экспертных систем - бизнес, проек-
тирование, исследования, управление.
Программы ЭС обычно работают таким способом, ко-
торый воспринимается как “интеллектуальный”, т.е. они
имитируют образ действий человека-эксперта.
Эти программы специфичны, поскольку, как правило,
используют механизм автоматического рассуждения (вы-
вода) и так называемые слабые методы, такие, как поиск
или эвристика. Они существенно отличаются от точных и
хорошо аргументированных алгоритмов и не похожи на
математические процедуры большинства традиционных
разработок.
Ниже приводится краткий (и далеко не исчерпываю-
щий) список областей, в которых применялись ЭС:
• оценка займов, рисков страхования и капитальных
вложений для финансовых организаций;
• помощь химикам в нахождении верной последова-
тельности реакций для создания новых молекул;
• отладка программного и аппаратного обеспечения
ЭВМ в соответствии с индивидуальными требования-
ми заказчика;
• диагностика и обнаружение неполадок в телефонной
сети на основании тестов и сообщений о неисправ-
ностях;
• идентификация и ликвидация неполадок в локомоти-
вах;
• помощь геологам в расшифровке данных, получен-
ных с помощью контрольного оборудования во время
бурения нефтяных скважин;
• помощь медикам в постановке диагноза и лечении
некоторых групп заболеваний, таких, как заражение
крови и различные виды рака;
19
• помощь навигаторам в расшифровке данных от под-
водных звукоулавливателей, установленных на дне
океана;
• получение молекулярной структуры химического
вещества на основании опытов;
• изучение и суммирование больших объемов быстро
изменяющихся данных, которые не в состоянии - из-
за скорости их изменения-прочитать человек, на-
пример телеметрических данных с искусственных
спутников системы LANDSAT.
В большинстве этих областей могли быть реализованы
и традиционные подходы, однако преимущества исполь-
зования здесь ЭС очевидны. В одних случаях применение
ЭС сделало программу более ориентированной на челове-
ка, в других - позволило программе задействовать опти-
мальный механизм рассуждения, в третьих - облегчило
поддержку и обновление программы. Потенциальные
преимущества применения ЭС будут обсуждены да-
лее.
1.2. ОБЩИЕ СВЕДЕНИЯ
О СТРУКТУРЕ
ЭКСПЕРТНЫХ СИСТЕМ
1.2.1. ЭКСПЕРТНЫЕ СИСТЕМЫ
КАК ОДИН ИЗ ВИДОВ ПРОГРАММ
ИСКУССТВЕННОГО ИНТЕЛЛЕКТА
Экспертные системы занимают небольшое, но важное
место среди программного обеспечения в целом. Для того
чтобы понять, что же представляют собой ЭС, необходи-
мо определить их место в программировании.
На рис. 1.1 показаны три основных стиля программи-
рования. Программирование ЭС представлено частью
области, которую мы назвали “программирование ИИ”.
Процедурное программирование - это программирование
на Бейсике, Паскале или Фортране, причем в целях и
способах оно существенно отличается от программирова-
ния ИИ.
При традиционном (процедурном) программировании
необходимо подробно сообщать компьютеру, что и как он
должен делать. Эти методы пригодны для решения конк-
ретных проблем, например для обработки данных, проек-
тирования или научной работы.
20
Программи-
рование ЭС
Программирование ИИ
Процедурное
программирование
Рис. 1.1. Три стиля программирования.
Программирование ЭС является частью области
программирования ИИ. Как методы программирования
обе эти области значительно отличаются от тради-
ционного (процедурного) стиля программирования
Программирование ИИ часто определяется “от про-
тивного”, как все то, что не укладывается в рамки про-
цедурного программирования. Однако большинство
программ ИИ имеют сходные элементы. Для этих про-
грамм характерно то, что они имеют дело со сложными
проблемами, которые недостаточно хорошо понима-
ются, для которых не существует четко заданных ал-
горитмических решений и которые могут быть
исследованы с помощью того или иного механизма сим-
волических рассуждений.
Значительные различия имеются также и во внутрен-
них механизмах машинных языков, используемых для
решения указанных выше проблем. В процедурном про-
граммировании акцент делается на применении операто-
ра присваивания (”«” или для перемещения данных
®/из фиксированных, предопределенных, поименован-
ных мест их нахождения в памяти. Эти поименованные
места являются переменными программы. Процедурное
программирование также зависит от характерной группы
команд”, которые управляют работой машины:
H-then-else переход
do-while вызовы процедуры
repeat-until последовательное выполнение (по умолчанию)
Программы ИИ обычно пишутся на языках типа Лисп
Или Пролог. Переменные такой программы существуют
21
скорее виртуально в стеке компьютера, а не в фиксиро-
ванных местах в памяти. Управление данными осуществ-
ляется посредством сравнения с образцом и построения
списков. Технология построения списков весьма проста, и
на ее основе может быть организована почти любая
структура данных. Далее при объяснении работы с
Прологом будут рассмотрены многочисленные примеры
создания списков. Программы ИИ, кроме того, использу-
ют отличный от традиционных программ набор операто-
ров:
вызовы процедуры
последовательное выполнение
рекурсия
У программистов есть поговорка, наглядно иллюстри-
рующая разницу между языками ИИ и процедурного про-
граммирования: если задачу легко решить на Фортране,
то ее трудно будет решить на Лиспе; если же задачу легко
решить на Лиспе, то ее трудно будет решить на Фортране.
Такая же связь, хотя и несколько менее ярко выражен-
ная, существует между языками Паскаль и Пролог.
Теперь мы можем более подробно рассмотреть взаимо-
отношения между программами ИИ и экспертными сис-
темами. Граница между ними не так уж четко очерчена
(см. примеры по реальным ЭС в разд. 1.1). Для пояснения
различий между программами ИИ и ЭС ниже приводится
список известных программ ИИ, которые не являются
экспертными системами:
• программа, которая может просмотреть, а затем вы-
дать в перефразированной форме текст рассказа ре-
бенка и даже дать ответы на некоторые вопросы по
тексту. Программа должна в какой-то степени
“понимать” язык и причинно-следственные отноше-
ния в повседневной жизни;
• программа для печати с голоса: пользователь говорит
в микрофон, а программа выдает печатный текст;
• программы, которые демонстрируют и моделируют
человеческий интеллект, например программа, спо-
собная решать задачи по нахождению аналогии в
геометрических фигурах (такие задачи обычно вклю-
чаются в интеллектуальные тесты);
• программы, решающие задачи скорее символьной,
чем числовой математики: программа выдает реше-
ние задачи интегрирования не в форме числа, а в
форме математической функции;
22
• программы, которые доказывают или даже открыва-
ют математические теоремы автоматически;
• программы, которые могут проводить анализ изобра-
жения, снятого телевизионной камерой, выбирать и
классифицировать его объекты.
Заметьте, что для понимания, например, рассказа ре-
бенка требуется большой опыт и высокий уровень интел-
лекта. Если мы сможем заставить машину делать это
эффективно, мы, несомненно, многое узнаем о том, что
такое интеллект. Однако такие задачи (понимание рас-
сказа и т.п.) не имеет смысла ставить перед экспертом
или ЭС, потому что с ними легко справится любой чело-
век.
Экспертные системы отличаются от других про-
грамм ИИ своей целью и построением. Под целью мы
понимаем т.е. задачи для ЭС, которые подходят для чело-
века-эксперта, а под построением - создание не просто
механической, а интеллектуальной программы. Критери-
ями оценки ЭС являются следующие:
• отражает ли внутреннее функционирование програм-
мы подход к проблеме со стороны человека;
• может ли программа объяснять свои действия спосо-
бом, понятным человеку;
• может ли программа взаимодействовать с операто-
ром посредством гибкого диалога, подобного диалогу
на естественном языке.
Экспертные системы используют все методы програм-
мирования, которые применяются в других программах
ИИ.
Некоторые программы занимают пограничное положе-
ние между экспертными системами и программами ИИ.
Примером таких программ могут служить простые про-
граммы игры в шахматы. 25 лет назад люди с удовольст-
вием определили бы такую программу как ЭС. Однако
сегодня по этому поводу есть некоторые сомнения. Дело в
том, что действие большинства шахматных программ ос-
новано на “грубой силе”, т.е. они заносят в каталог все
возможные для компьютера ходы и, кроме того, учитыва-
ют все возможные контрходы игрока (человека), сделан-
ные в ответ на ход машины, а также все приемлемые ходы
к°мпьютера в ответ на ход человека-игрока. Данная мо-
предполагает несколько уровней игры, пока число
вариантов не станет столь огромным, что даже компьютер
е сумеет справиться с ним. Машина оценивает возмож-
варианты окончания игры и делает соответствующие
Мы расцениваем этот метод как метод с позиций гру-
23
бой силы, потому что машина просто вырабатывает и
классифицирует множество вероятных “сценариев” игры,
а затем делает ходы в соответствии с наиболее благопри-
ятным сценарием.
Результатом такого подхода может быть великолепная
шахматная игра, но не та, которую мы бы назвали “ин-
теллектуальной”. Шахматы, безусловно, являются об-
ластью деятельности специалиста (эксперта). Однако
программа в такой форме не считается экспертной систе-
мой, потому что она не функционирует подобно человеку:
внутренняя сущность программы остается механистиче-
ской, а не интеллектуальной. Наиболее совершенные
шахматные программы, использующие “человекоподоб-
ную” эвристику для ведения поиска и способные объяс-
нять свои ходы, были бы настоящими ЭС.
Итак, мы рассмотрели большинство особенностей ЭС.
Поскольку вы хотите научиться создавать программы ЭС,
необходимо изучить внутреннюю структуру таких про-
грамм. ^На рис 1.2 показаны некоторыеЭлементы архитек-
туры ЭС. ТТиже будут даны объяснения по каждому из
них. Эти элементы сами по себе просты, но в совокупно-
сти они подкрепляют и усиливают друг друга: возникаю-
щий синергизм приобретает очень мощный характер.
Рис. 1.2. Основные элементы архитектуры экспертных систем
Подобная группа операционных элементов является общей
для всех экспертных систем
24
1.2.2. ПРОГРАММЫ ПОИСКА
Программы ИИ, в том числе и ЭС, имеют специфиче-
скую организацию. Далее мы займемся ее описанием.
Программа имеет начальное состояние и осуществляет
поиск конечного состояния (т.е. цели). В программе пре-
дусмотрены возможности выбора, которые реализуются
автоматически и позволяют ей выполнять шаги от на-
чального состояния к новым состояниям, более или менее
близким к цели. Таким образом, программа отыскивает
цель, “шагая” от состояния к состоянию. Она должна рас-
познавать ситуацию, когда находит цель или попадает в
тупик. Как правило, на промежуточных стадиях вычис-
ляется некое число, посредством которого программа оце-
нивает свой ход. Цель может быть одна или же имеется
некоторый набор приемлемых целей (конечных состоя-
ний). Большинство программ работают по этой модели.
Рис. 1 .За. Карта дорог штата Нью-Йорк
Здесь показаны некоторые города штата и соединяющие их дороги.
Карта может использоваться для демонстрации различных маршру-
,пов путешествия из Мидлтауна в Кингстон, которые могут состав-
ляться компьютером
25
Теперь отвлечемся от абстрактных представлений и
покажем процесс поиска на конкретном примере. На
рис. 1.3а приведена карта дорог, соединяющих города в
штате Нью-Йорк. Она позволит нам изучить маршрут
от Мидлтауна до Кингстона. Фактически компьютер дол-
жен поработать с картой и спланировать наше путеше-
ствие. Верх карты соответствует северу, а цифры
отображают расстояние в милях. Дороги условно будем
считать прямыми.
Рис. 1.36. Дерево поиска, используемое программой для выбора марш-
рутов между городами Мидлтаун и Кингстон
Карта организована в виде дерева поиска. Начальный пункт является
вершиной дерева. Показаны все возможные маршруты, которые ведут
либо в тупик, либо в город Кингстон. На дереве поиска четко просле-
живаются все возможные варианты выбора для компьютера. Цикли-
ческие маршруты исключены.
На рис. 1.36 карта представлена в виде так называемо-
го дерева поиска. Эту карту и использует компьютер. Она
26
показывает все варианты выбора при движении из Мидл-
тауна (начальное состояние) и все варианты выбора в
каждом промежуточном пункте (состоянии), т. е. в дру-
гих городах. Место, откуда должен начаться поиск,
находится в вершине дерева поиска. Все дороги, начинаю-
щиеся в Мидлтауне, либо приводят в тупик, либо закан-
чиваются в Кингстоне. Задача машины состоит в том,
чтобы найти подходящую дорогу из вершины дерева к ко-
нечному состоянию (цели) в его нижней части.
Строя дерево, мы, конечно, исключим все дороги, ко-
торые образуют замкнутый цикл, например:
Мидлтаун-Пайн Буш-Нью Палц-Уолден-Пайн Буш-
Нью Палц-Кингстон
Операция по исключению циклов очевидна для челове-
ка, но не для машины.
Подходящее дерево поиска создается обычно при ре-
шении любой задачи поиска. Представьте себе, что ком-
пьютер, используя первоначальную карту (рис. 1.3а),
получает дерево поиска (рис. 1.3 б) и собирается с по-
мощью последнего найти дорогу в Кингстон. Какую стра-
тегию применит машина? Человек при взгляде на дерево
поиска сразу же выберет подходящую дорогу, но компью-
тер на это не способен.
Вот опыт, который заставит вас думать подобно маши-
не. Допустим, вы находитесь в темной комнате, ще на
одной стене нарисовано дерево поиска. У вас есть фона-
рик, но он может осветить максимум два соседних пункта
на дереве поиска. Кроме того, вы можете перемещать луч
фонарика по стене только вертикально, не отклоняясь
ни влево, ни вправо. Вам известно, где расположена вер-
шина дерева, откуда нужно начать поиск. Учитывая ре-
алии существующих языков программирования, именно
так будет выглядеть соответствующая программа для
компьютера. Как с помощью эффективного систематизи-
рованного способа перемещения луча фонарика найти
маршрут до Кингстона?
При отсутствии прочей дополнительной информации,
компьютер, безусловно, использует для поиска стратегию
“грубой силы”. Программы поиска, основанные на грубой
силе, осуществляют поиск цели, идя от состояния к состо-
янию, и систематически исследуют все возможные пути.
Для определения каждого последующего шага применя-
ется некая простая механическая стратегия, которая име-
ет две разновидности: поиск в глубину и поиск в ширину.
27
Стратегия поиска в глубину основана на скрупулез-
ном исследовании последовательностей одного варианта
выбора до изучения других вариантов. Поиск в данном
пункте выбора производится по несложной методике, на-
пример машина всегда первой исследует неизвестную ле-
вую ветвь дерева. Когда процесс поиска заходит в тупик,
он возвращается вверх в последний пункт выбора, где
имеются неизученные альтернативные варианты движе-
ния, и затем осуществляется следующий вариант выбора.
Стратегия поиска в ширину состоит в исследовании
всех дорог, исходящих из начального пункта, которые
имеют длину в один маршрут, затем дорог, имеющих дли-
ну в два маршрута (две дороги), затем три и так далее,
пока не будет найден ответ.
Обе эти стратегии, поиск в глубину и в ширину, гаран-
тируют рассмотрение всех возможных вариантов. Выбор
наиболее подходящего из них зависит от особенностей ис-
следуемой проблемы.
Обратимся к рис. 1.36, который иллюстрирует страте-
гию поиска в глубину. Программа просмотрит маршрут
Мидлтаун-Вартсборо-Монтичело, обнаружит, что он
оканчивается тупиком, и вернется к Мидлтауну (так как
других вариантов выбора в Вартсборо нет). Затем она по-
пробует пройти маршрут Мидлтаун-Пайн Буш-Эленвил,
снова обнаружит тупик, вернется к Пайн Буш и пой-
дет по маршруту Пайн Буш-Миневаска. Далее программа
еще раз вернется к Пайн Буш и исследует маршрут Пайн
Буш-Нью Палц-Кингстон, где и достигнет цели.
В среднем поиск в глубину подходит для решения про-
блемы, где все пути поиска от вершины дерева до его
основания имеют одинаковую длину. (Этот аспект будет
исследован в приведенной в конце главы задаче 6.)
Программа поиска в ширину в нашем примере нач-
нет поиск цели с проверки всех вариантов, отстоящих от
Мидлтауна на один маршрут (на одну “связь”, или доро-
гу) , т.е. проверит все нижеприведенные маршруты, но не
найдет цели:
Мидлтаун----Вартсборо
Мидлтаун----Пайн Буш
Мидлтаун----Ньюбург
Мидлтаун----Гошен
Затем, действуя слева направо, программа расширит
каждый из этих маршрутов и рассмотрит дороги длиной в
два звена. Большинство таких дорог ведут в тупик, на-
пример:
28
Мидлтаун----Вйртсборо-----Монтичело
Мидлтаун----Пайн Буш------Эленвил
Мидлтаун----Пайн Буш------Миневаска
Но три из этих маршрутов не оканчиваются тупиком.
Программа проверит их:
Мидлтаун----Пайн Буш------НьюПалц
Мидлтаун----Пайн Буш------Уолден
Мидлтаун----Ньюбург-------Рейнберг
Продвигаясь по дереву слева направо, программа рас-
ширит первый маршрут еще на одно звено и найдет доро-
гу длиной в три звена, которая ведет в Кингстон.
Таким образом, поиск в ширину пригоден для пробле-
мы, где ветви поиска в дереве (от вершины до основания)
имеют неодинаковую длину, и не существует указаний на
то, какая именно дорога приводит к цели.
Рассмотренные стратегии поиска являются поиском с
позиций грубой силы. Поиск окажется гораздо более эф-
фективным, если некоторый механизм в пунктах выбора
сам сможет делать наиболее желательный выбор. Это так
называемая эвристика поиска.
Существует целый ряд эвристических методов. Про-
стейший из них носит название “взбирание на гору”. Его
принцип: если у вас есть приемлемые варианты выбора,
выберите наилучший из них, используя любой критерий
рассуждения; если же вы попали в тупик, вернитесь в
последнее место, где имеются альтернативные неисследо-
ванные варианты выбора, и сделайте следующий наилуч-
ший выбор.
Чтобы наша программа выполняла эвристический по-
иск, она должна располагать базой для осуществления
выбора. Предположим, в качестве базы программа примет
соответствие направления каждой дороги азимуту: пред-
почтение будет отдаваться дороге, имеющей азимут, ска-
жем, 45 градусов. Такой подход не всегда действен, но это
хорошая стратегия. В нашем случае программа исследует
маршрут Митдлтаун-Пайн Буш-Миневаска и найдет ту-
ник, затем вернется назад, в то место, где существует воз-
можность другого выбора, т.е. в Пайн Буш, а потом сразу
отправится по маршруту Пайн Буш-Нью Палц-Кинг-
стон, который и приведет ее к цели.
Многие проблемы в ИИ связаны с характером поиска в
пространстве состояний. Мы показали вам разнообразные
Брианты поиска, но возникает вопрос: откуда же взялось
само дерево? Обычно машина создает дерево поиска на
29
основе предлагаемых ей начальных сведений, причем де-
лает это постепенно в процессе самого поиска.
Еще одна проблема связана с тем, что принимать за
ответ. В каких-то ситуациях имеется лишь единственный
ответ и единственная цель, в других - несколько конеч-
ных состояний (целей), каждое из которых подходит. На-
пример, в нашем примере существуют три маршрута в
Кингстон, а цель - найти только один маршрут. Иногда
бывает необходимо выбрать из конечных состояний (це-
лей) то, которое удовлетворяло бы определенному кри-
терию (например, длина пути до Кингстона не должна
превышать 50 миль). Часто приходится выбирать из не-
скольких целей ту, которая является, безусловно, луч-
шей. Это наиболее сложная ситуация, потому что
программа должна найти и запомнить все маршруты,
классифицировать их по оптимальности и выбрать наи-
лучший.
Проблема поиска - важная и большая тема, а мы лишь
слегка коснулись ее. Тех, кто заинтересуется этим вопро-
сом, мы отсылаем к любому из стандартных учебников по
ИИ.
1.2.3. УПРАВЛЕНИЕ
С ПОМОЩЬЮ ЭВРИСТИКИ
Мы уже упоминали о том, что одной из особенностей
ЭС является использование ими эвристики (см. разд.
1.2.2). Эвристика - это эмпирическое правило, с по-
мощью которого человек-эксперт в отсутствие формулы
или алгоритма пытается осуществить свои намерения. Ес-
ли же алгоритм есть, то человек-эксперт воспользуется
им. Но чаще алгоритма нет. Примером такой проблемы
может служить выбор победителя в спортивном состяза-
нии.
Большинство лучших эвристических программ стре-
мятся просто смоделировать процессы рассуждения чело-
века-эксперта, что не столь просто, но другого пути к
успеху нет.
Чтобы написать такую программу, необходимо сначала
тщательно исследовать деятельность человека-эксперта.
Это исследование включает наблюдения, интервьюирова-
ние и сбор статистики. Обычно эксперт имеет целый на-
бор стратегий для определенных ситуаций. Они и
составляют типичную эвристическую информацию.
30
Приведем несколько примеров. Игра в бейсбол. Если
вы берете интервью у игрока, то получаете такую эври-
стику:
Самое важное - это подача мяча.
Команда на своем поле чаще выигрывает, чем на чу-
жом.
Результаты команды за последние три недели более
важны, чем ее общие успехи (результаты) в течение года.
Если вы интервьюируете игрока в монополию, он мо-
жет вам дать следующую эвристику:
Главное - приобретать монополии на дешевую собст-
венность в начале игры. Затем вы вкладываете средства в
отели и разоряете всех, пока их денежные запасы невели-
ки.
Хорошая эвристика - мощное средство решения про-
блемы. Но ее довольно сложно найти (плохие эвристики,
как правило, имеются в избытке).
Задачи, для решения которых требуется эвристика, мо-
гут на первый взгляд казаться до абсурдного простыми.
Приведем пример такой задачи.
Компоновка деталей, которые вырезаются из материа-
ла определенных размеров, всегда была чрезвычайно
важной и сложной проблемой, особенно в швейных отрас-
лях промышленности, автомобилестроении. Никто не
знает, как создать машинную программу, которая опти-
мально расположила бы эти детали с помощыо математи-
ческих методов или алгоритма. Но человек успешно
справляется с такой задачей. Самые современные компь-
ютерные программы работают, имитируя стратегию чело-
века-эксперта.
Для того чтобы понять, как разрабатывается эвристи-
ка, проведите несложный эксперимент. Возьмите два от-
личающихся по размеру и цвету листа бумаги. Разрежьте
меньший из них на прямоугольники различных размеров
и видов. Затем расположите их на стороне большого лис-
та, как будто они представляют собой шаблоны и вы хоти-
те сделать вырезки по этим шаблонам из большого листа.
Попытайтесь расположить их как можно экономнее. Вы
сами увидите все варианты стратегий компоновки. Най-
дите опытным путем лучший вариант стратегии. Эти
стратегии и являются вашей эвристикой. Вложите их в
компьютерную программу, и полпути до создания ЭС бу-
дет пройдено. Интересно, что данная проблема слишком
сложна, чтобы ее можно было решить математическими
Методами, даже в случае с такими простыми формами,
как прямоугольники.
31
1.2.4. ОРИЕНТИРОВАННЫЙ
НА ЧЕЛОВЕКА
ДИАЛОГ
Экспертные системы, как правило, работают в интер-
активном (диалоговом) режиме, т.е. обмениваются ин-
формацией и выводами с пользователем в форме диалога.
Интеллектуальная программа может принимать вводи-
мые данные в свободной форме - в виде простых пред-
ложений на английском языке. Считается, что такая
программа ведет диалог на естественном языке: она осу-
ществляет общение, подобное коммуникации на естест-
венном языке.
В исследованиях по ИИ системы на естественном языке
подвергались интенсивному изучению. Это сложная про-
блема. Очень трудно заставить машину понимать не огра-
ниченную никакими условиями речь на естественном
языке. Фактически в настоящее время никто не знает ее
практического решения. Однако подобная технология на-
ходит некоторое применение. Если мы определим темы,
на которые будем разговаривать с компьютером, условим-
ся обмениваться данными только в форме простых пред-
ложений и ограничим структуру таких предложений до
нескольких несложных конструкций, задача окажется
выполнимой.
Способность восприятия на естественном языке не яв-
ляется необходимой для процессов рассуждения, состав-
ляющих ядро большинства ЭС. Но экспертные системы
столь часто имеют это свойство, что оно почти всегда вхо-
дит как составная часть в определение ЭС.
Чтобы машинный диалог был интеллектуальным, он
должен обладать некоторыми другими свойствами. На-
пример, когда ЭС вовлекает пользователя в диалог для
получения базовой информации, задаваемые ему вопросы
должны соответствовать скорее ситуации, чем одному из
вариантов вопроса из проверочного списка. Пролог пред-
лагает ряд несложных методов программирования, ко-
торые гарантируют соответствие задаваемых вопросов
реальной ситуации.
Отметим еще один необходимый атрибут диалога. Ког-
да выдается какое-то заключение или задается вопрос,
пользователь имеет право спросить: “Как получено такое
решение?” или “Зачем это нужно знать?”. Система долж-
на быть способна ответить на подобные вопросы таким об-
разом, чтобы создавалось впечатление интеллектуального
характера рассуждений. В зависимости от того, насколько
32
хорошо справится система со своей задачей, пользователь
поверит или не поверит тому, что говорит компьютер.
Итак, характерные черты ориентированного на пользо-
вателя диалога:
1) способность программы понимать предложения на
английском языке, заданные в свободной форме;
2) способность программы задавать вопросы, соответст-
вующие ситуации;
3) способность программы по запросу объяснять свои
заключения.
1.2.5. АРХИТЕКТУРА
ДЛЯ АВТОМАТИЧЕСКОГО РАССУЖДЕНИЯ,
ОСНОВАННАЯ НА ПРАВИЛАХ
1.2.5.1. Что такое правило?
Если мы внимательно посмотрим на механизмы, при-
меняемые большинством ЭС для своей работы, то обнару-
жим, что эти механизмы в основном построены на так
называемой “архитектуре, основанной на правилах”. И
хотя использование такой архитектуры не является обя-
зательным, многие считают ее неотъемлемой частью
ЭС.
Что же это за архитектура? Система, основанная на
правилах, содержит большое число таких вот элемен-
тов:
если (условие!), то (действие!)
если (условие!), то (действие!)
если (условиеЗ), то (действиеЗ)
Каждый из подобных элементов называется правилом,
или продукцией. Под условием подразумеваются обстоя-
тельства, при которых должно использоваться правило, а
под действием - то, что должно происходить, когда усло-
вие “срабатывает”.
Действие может быть любым, но обычно речь идет о
выводе заключения как части аргументации или доказа-
тельства. Ниже приводится пример правила, по которому
ЭС MYCIN (медицинской диагностики) выдает заключе-
ние:
Если (реакция микроорганизма положительная, и фор-
ма микроорганизма кокк, и
структура микроорганизма - звенья)
то (с вероятностью 0,7 этот микроорганизм
является стрептококком)
751
33
Введем новую терминологию. Взгляните на правило
Если (а), то (Ь)
где “а” называют антецедентом, или посылкой прави-
ла, “Ь” - следствием, или заключением. Оба варианта
считаются приемлемыми наравне с данным выше (усло-
вие и действие).
Мощность Пролога обусловлена в основном использо-
ванием правил. Все предложения в программе на Проло-
ге, не являющиеся простой констатацией факта, есть
правила в том смысле, в каком мы их понимаем здесь.
Приведем пример факта на Прологе:
father-of (dan, don).
А вот пример правила на Прологе:
grandfather-of(X,Z) if
father-of (X.Y) and father-of (Y,Z).
Расшифруем его. X является дедом Z, если X является
отцом Y, и Y является отцом Z. Текст перед if (если) -
следствие (или действие), а текст до if - антецедент (или
посылка). Синтаксис Пролога “обратен” синтаксису, в
котором обычно формулируются правила. Это связано с
тем, что, как было замечено, когда вы используете if (ес-
ли) для разделения правила на две части, then (то) стано-
вится ненужным.
Иногда действия в правиле фактически представляют
собой действия, а не просто заключения из каких-либо
рассуждений. Например, правило для системы управле-
ния оружием на реактивном истребителе выглядит так:
Если (класс_угрозы МИГ-21
и степень_угрозы велика
и местонахождение_угрозы впереди
и близостЬ-угрозы рядом)
То (открыть огонь)
Это типичная ЭС, которая может работать в режиме
реального времени.
1.2.5.2. Совокупность правил,
управляемых механизмом вывода
Понять каждое правило в отдельности довольно просто,
но возникает вопрос: как их следует применять? Как их
использовать вместе? Механизм, который применяет пра-
вила в некоторой последовательности для выполнения
работы, был назван механизмом вывода.
34
Существуют два вида механизмов вывода для ЭС.
Один из них основан на модели логического программи-
рования. другой - на так называемой модели системы
продукций. С точки зрения математической структуры
обе модели одинаковы, с точки зрения практики - отлич-
ны друг от друга.
Пролог имеет механизм вывода, построенный на моде-
ли логического программирования. Механизм вывода
встроен. Он представляет собой обычный механизм для
выполнения программы на Прологе. Работа начинается
попыткой исполнить высокоуровневое правило путем
проверки, истинна ли его предпосылка. Система проверя-
ет истинность таких предпосылок, исследуя, истинны ли
предпосылки этих предпосылок и т.д.
Иными словами, процесс вывода в Прологе является
процессом поиска в глубину и просмотра слева направо
внутри каждого данного логического предложения. Про-
цесс возвращается назад, если он заходит в тупик. (Пред-
полагается, что пользователь знаком с этим процессом.)
В другой разновидности механизма вывода (построен-
ном на модели системы продукций) правила скомпоно-
ваны в список. В простейшем варианте управление начи-
нается с начала списка. Правила проверяются последова-
тельно, пока не будет найдено то, для которого верно
условие. Тогда система выполняет действие, каково бы
оно ни было. Затем она пытается найти следующее прави-
ло для выполнения, вернувшись к началу списка или про-
должив поиск с того места, где он был прерван.
Второй способ действия механизма системы продук-
ций -- просмотреть весь список перед тем, как система
приступит к выполнению какого-либо правила, и собрать
все те правила, условия которых истинны, в “набор про-
тиворечий” (конфликтный набор). Затем система выби-
рает в соответствии с заданными приоритетами из этого
набора одно из правил и выполнит его. Это аналогично
процессу возбуждения нервных клеток.
Характерная черта системы продукций - повторяю-
щийся цикл:
Найти возбужденное правило, затем выполнить его.
Меняется только способ обнаружения системой прави-
ла для его последующего выполнения.
Разница между системой продукций и моделью логиче-
ского программирования заключается в основном в уп-
равлении. Управление в системе продукций имеет
линейный характер: решая, что делать на следующем
шаге, система просматривает список возможных правил и
35
из него выбирает одно. Система продукций действует по-
добно оператору выбора в процедурном языке.
Управление в Прологе имеет структуру дерева. Всегда
существует иерархия действий, которые необходимо вы-
полнить, что подразумевается уже в самом способе напи-
сания правил. Движение по дереву осуществляется строго
установленным и предсказуемым способом, который оп-
ределен стратегией поиска в глубину.
Ниже мы рассмотрим несложную систему продукций,
иллюстрирующую упомянутую выше особенность линей-
ного управления, а пока обсудим принцип “деревооб-
разного” управления в Прологе на примере программы,
определяющей, может ли человек водить автомашину.
can_drive(X) if
is_legal_driver (X) ,can_get_car (X).
is_legal-driver(X) if
hasJisense(X),lisense_8till_good(X).
hasJisense(X) .if
is_dd_enough (X) ,know8_how_to_drive (X) ,passed_test (X).
can_get-Car (X) if
ownS-Car (X) ,can_borroW-Car (X) ,can_rent_car (X).
может водить (), если
является водителем по закону (), может достать машину О.
является водителем по закону (), если
имеет права(), права еще не просрочены().
имеет права(), если
достиг определенного возраста (), знает, как водить (), прошел тест,
может достать машину (), если
владеет машиной(), может взять ее взаймы(), может арендовать ее()
Предположим, программе дан запрос:
саП-drive (John) может водить (джон)
Программа начнет работу с самого высокого уровня - с
правила “может водить”. Система попробует удовлетво-
рить это правило, пытаясь сначала удовлетворить прави-
ло “является водителем по закону(джон)”, а затем когда
это не получится, попытается удовлетворить ниже рас-
положенное правило “имеет-права (джон)”. Затем про-
грамма перейдет на еще более низкий уровень и начнет
исследовать правило “достиг определенного возра-
ста (джон)” и т.д. Иными словами, для того, чтобы про-
грамма достигла своей цели, необходимо соблюсти
иерархию правил. Управление в иерархии осуществляет-
ся по принципу поиска в глубину.
Теперь обратимся к обещанной несложной системе
продукций. Понятие системы из продукций является
весьма общим и имеет много вариантов. Они использу-
36
ются не только в ЭС. Например, такие системы часто
применяются в моделировании структуры мышления.
Приведем пример системы продукций, которая может
дать представление о жизнедеятельности простейших жи-
вотных:
Если (присутствует-хищник)
то (спасаться-бегством)
Если (необходимО-Спариться и присутствует_партнер)
то (спариваться)
Если (необходимО-Спариваться и не (присутствует_партнер)
то (найти_партнера)
Если (голоден и не (присутствует_пища)
то (найти_пищу)
Если (голоден и присутствует_пнща)
то (питаться)
Если (не (необходимо_спариваться) и не (голоден)
и не (присутствует-Хищник)
то (ничего_не_делать)
Итак, вы видите, что новая информация о состоянии
окружающей среды постоянно поступает в часть “усло-
вие” этих правил из органов чувств животного. Управ-
ление начинается с верхней части списка. Список
просматривается до тех пор, пока не будет найдена подхо-
дящая ситуация. Тоща выполняется действие, управле-
ние возвращается к началу списка и поиск продолжается.
Порядок правил имеет важное значение. Если животное и
голодно, и ему необходимо спариваться, порядок правил
определяет, чем ему заняться в первую очередь.
Может ли животное действительно иметь что-либо по-
добное в голове? Возможно, нет; с одной стороны, система
как таковая не может обучаться, с другой - может, если
включить в нее специальные правила, функцией которых
будет получение новых правил. Эти новые правила могут
быть добавлены к целому набору правил при соответству-
ющих обстоятельствах. Интересно, что системы продук-
ций более сложных типов великолепно подходят для
моделирования человеческого сознания. Но есть и опас-
ность настолько увлечься таким моделированием, что пе-
рестанешь понимать, что именно моделируешь.
Многие из ранних ЭС являлись системами продукций.
Эти системы были созданы для моделирования сознания и
Давали весьма ясное представление о некоторых процес-
сах мышления. Разработчики ЭС считали необходимым
смоделировать менталитет экспертов и поэтому использо-
вали системы продукций.
37
На ранних стадиях разработки ЭС не были выявлены
многие недостатки использования систем продукций для
практической работы, а именно:
1. Системы продукций не подходят для кодирования
стандартных алгоритмов, которые могут применяться для
решения проблемы, так как при этом способе управления
затруднены итерация и рекурсия.
2. Представляется невозможным статически рассмот-
реть группу продукций и определенно предсказать пове-
дение работающей программы, что обусловило новую
форму создания программ ИИ: (1) быстро собрать систе-
му, (2) испытать ее, (3) затем продолжить ее модифика-
цию (обычно единовременно изменять одну продукцию),
пока она не будет, наконец, работать должным обра-
зом.
Любой сторонник подобной методологии проектирова-
ния в более ортодоксальном направлении информатики
был бы немедленно поднят на смех. Такое возможно толь-
ко в ИИ, потому что на протяжении многих лет другой
способ написания программ ИИ был неизвестен. Не иск-
лючено, что это и является одной из причин столь дли-
тельного развития ранних ЭС.
3. Системы продукций выполняются очень медленно.
Аналогичная ЭС, закодированная как логическая про-
грамма в соответствующей версии Пролога, имеет ско-
рость выполнения в 10-50 раз выше. (См. Michael Van
Horn, Understanding Expert System, p. 161, Bantam Books,
New York, 1986.)
По мнению автора книги, система продукций модели-
рует мышления эксперта на слишком низком уровне.
Кроме того, нас (если мы не психологи) интересуют не
микроструктура сознания эксперта, а те результаты, ко-
торые он выдает.
Логическое программирование появилось спустя 10 -
15 лет после изобретения систем продукций и имеет мно-
жество преимуществ. Оно несравненно быстрее. При не-
обходимости можно использовать механизмы для
реализации стандартных алгоритмов, которые применя-
ются в других областях информатики. Кроме того, ло-
гическая программа может быть написана таким образом,
что будут сразу ясны ее результаты. Для логического
программирования Пролог подходит более, чем любой
другой язык процедурного программирования типа Па-
скаля. Пролог позволяет вам концентрировать внимание
именно на том, что делает программа. “Спрятан” лишь
38
механизм, используемый программой для получения тре-
буемых результатов. Этот механизм может быть весьма
сложным.
Наконец, реализовать систему продукций легче имен-
но на языке логического программирования, таком, как
Пролог. Трудно, если вообще возможно, реализовать
язык логического программирования, базируясь на языке
системы продукций, например OPS5.
Несмотря на все вышеизложенное, есть специалисты,
которые считают системы продукций наиболее подходя-
щей технологией для ЭС. Это типичный пример того, как
прочно устанавливаются стереотипы, даже в новой обла-
сти научного знания.
1-2.5.3- Преимущества систем,
основанных на правилах
Как вы уже видели, основанная на правилах архитек-
тура обычно имеет механизм вывода, базирующийся на
модели логического программирования или на модели си-
стемы продукций. Теперь рассмотрим аргументы “за” и
“против” использования правил (а не чего-нибудь еще) в
качестве основы для ЭС.
Существуют по меньшей мере четыре причины, объяс-
няющие столь широкое применение архитектуры, осно-
ванной на правилах:
1. Индивидуальные правила часто отражают способ
оформления экспертами собственной эвристики для ре-
шения проблемы. Именно так эксперт будет описывать
проблему.
2. Правила являются естественными модулями и, подо-
бно любой модульной структуре, обеспечивают простую
модификацию системы.
3. Автоматические рассуждения выполнять (т.е. заста-
вить компьютер рассуждать) несложно, если они ведутся
на основе правил. Фактически сегодня в области ИИ дру-
гих способов реализовать автоматические рассуждения
нет.
4. Если программа основана на правилах, машина мо-
жет легко дать связный отчет в своих действиях. Как упо-
миналось выше, когда компьютер предлагает ввести
информацию, пользователь должен иметь возможность
спросить: *3ачем это нужно?”. Компьютер может отве-
тить, выдав в определенном порядке правила, с которыми
он только что работал. При выводе заключения пользова-
тель также должен иметь возможность задать вопрос:
“Как оно получено?”. И снова система, основанная на
39
правилах, довольно легко может построить пояснение,
трассируя использованные при получении данного заклю-
чения правила.
Вы можете подумать, что уже достаточно знаете о пра-
вилах, но ничего не узнали о том, как же их комбиниро-
вать для создания ЭС. Будьте терпеливы: именно об этом
пойдет речь в остальной части книги, а пока мы рассмот-
рим еще несколько вопросов.
1.2.6. ОТДЕЛЕНИЕ ЗНАНИЙ
ОТ СТРУКТУР УПРАВЛЕНИЯ
Итогом 20-летнего опыта работы с ЭС явились некото-
рые основные принципы их проектирования. Один из на-
иболее важных принципов состоит в том, что правила,
которые несут проблемные знания, должны содержаться
отдельно от механизмов или правил, воплощающих меха-
низм вывода. Это обусловлено двумя причинами.
1. Если сходные группы объектов объединяются вместе,
то легче найти правила, согласно которым выполняются
определенные виды работ в системе, и при необходимости
изменить, уничтожить или добавить.
2. Если все проблемные знания хранятся отдельно от
правил вывода, то легче повторно использовать имею-
щийся проект ЭС для создания новых систем. В действи-
тельности многие программы были созданы на основе
существующих систем, где были удалены проблемные
знания, а затем установлены новые проблемные знания,
соответствующие решаемой проблеме. Экспертная сис-
тема с удаленными проблемными знаниями называется
оболочкой. Оболочки стали очень выгодным програм-
мным продуктом (см. гл. 7).
1.3. АВТОМАТИЧЕСКОЕ РАССУЖДЕНИЕ
1.3.1. ОСНОВНЫЕ МЕХАНИЗМЫ ДЕДУКЦИИ
(ЛОГИЧЕСКОГО ВЫВОДА)
Заставить машину выполнять простой процесс рассуж-
дения несложно. Эта способность составляет ядро боль-
шинства ЭС. В целом знания ЭС должны быть введены в
форме правил для того, чтобы могли быть реализованы
процессы автоматического рассуждения. Как вам уже из-
вестно, та часть компьютерной программы, которая
применяет правила, а затем управляет рассуждениями,
получила название механизма вывода.
40
Логический вывод - центральное понятие в ЭС. Оно
имеет два аспекта: использование рассуждений для на-
хождения различных предположений, которые обуслов-
лены имеющимися фактами и правилами, или для
изучения заключений, которые представляют интерес и
могут быть (а могут и не быть) истинными. Первый метод
носит название прямой цепочки рассуждений, второй -
обратной цепочки рассуждений. Почти все ЭС построены
либо на первом, либо на втором методе.
В качестве примера запишем несколько правил и фак-
тов, которые могли бы составить простую логическую сис-
тему:
факты
г
s Все они представляют собой истинные
t утверждения
и
v
W
Так, факт г может означать, что “Джон имеет меди-
цинскую страховку”, а факт w, что “у Салли грипп”.
Теперь запишем несколько правил:
у и w~* х
U И Z “*у
r~*z
Стрелка (->) означает, что написанное слева подразу-
мевается, то есть позволяет нам сделать заключение о
том, что написано сг рава. Например, первое правило мо-
жет обозначать, “если Джон имеет медицинскую страхов-
ку и если его заявление будет удовлетворено, страховая
компания оплатит ему счета за медицинское обслужива-
ние”.
Эти правила и факты являются исходным материалом,
на базе которого будут выполняться процессы логическо-
го вывода. Для нас сейчас важна не форма хранения
самих правил и фактов, а исследование основных прин-
ципов процесса рассуждения.
1.3.2. ПРЯМАЯ ЦЕПОЧКА
РАССУЖДЕНИЙ
Прямая цепочка рассуждений предполагает использо-
вание правил для дедукции (логического вывода) новых
фактов, а также фактов, которые имплицитно существо-
вали и ранее, но могут быть сделаны явными посредством
применения правил.
41
Вот какова типичная модель операции прямой цепочки
рассуждений. Механизм вывода циклически просматри-
вает все правила. Он исследует каждое из них по очереди,
выясняя, является ли информация на левой стороне ис-
тинной. Если она истинна, механизм вывода добавляет
факт на правой стороне правила к хранимым истинным
фактам. Затем он переходит к следующему правилу, и
процесс повторяется. Проверив все правила, механизм
начинает работу заново.
Давайте проследим такой цикл с помощью логических
данных из разд. 1.3.1. Сначала имеется только одно дей-
ствующее правило:
r-> Z
Факт, который мы назвали г, находится среди храни-
мых истинных фактов, и так как г подразумевает z, меха-
низм вывода добавляет z к хранимому набору истинных
фактов. Затем механизм ищет следующее правило, год-
ное для выполнения. Факт и был дан как истинный в са-
мом начале. Мы только что получили новый факт z.
Имеется другое правило, которое подразумевает, что
и и z -> у
Механизм вывода находит и использует его. Таким об-
разом, мы добавили новый факт у к хранимым истинным
фактам и т.д.
Это и есть процесс прямой цепочки рассуждений: меха-
низм вывода работает для пополнения изначального запа-
са истинных фактов фактами, которые подразумеваются
посредством набора правил.
Подобная прямая цепочка рассуждений на практике
неприменима: в системе с реальным числом правил име-
ется столь много подразумеваемых (скрытых) фактов,
что, будучи обнаружены, они затмят те несколько фак-
тов, которые действительно представляют интерес и яв-
ляются полезными.
Однако системы, основанные на прямой цепочке рас-
суждений, существуют. Любая такая система имеет до-
полнительный механизм (иногда весьма специфичный в
зависимости от проблемы) для того, чтобы определить, с
каким следующим правилом ей предстоит работать. Вме-
сто простого цикла, который механически выбирает пра-
вила, механизм выбора четко устанавливает приоритет
выбора тех или иных фактов и правил.
42
ЭС на базе прямой цепочки рассуждений чаще всего
применяются в планировании или проектировании (см.
примеры в разд. 1.4).
1.3.3. ОБРАТНАЯ ЦЕПОЧКА
РАССУЖДЕНИЙ
Рассмотрим теперь иной способ получения логического
вывода на основе фактов и правил. Начнем с заключения,
которое представляет для нас интерес и не является яв-
ным (истинным фактом). Оно не находится среди храни-
мых фактов, когда мы запускаем систему. Мы хотим
выяснить, обусловлен (подразумевается) ли данный факт
другими, известными нам фактами и правилами. Сущест-
вует ли некий образец рассуждений, который может уста-
новить истинность этого факта?
Механизм вывода может провести такое исследование
посредством определения всех правил, которые приводят
к данному факту как к заключению. Затем механизм про-
сматривает посылки этих правил. Возможно, они уже
хранятся среди истинных фактов. Тогда можно считать,
что изучаемый факт является истинным и должен быть
добавлен в хранилище истинных фактов.
Но как быть, если ни одно из правил не может быть
использовано для непосредственного определения рас-
сматриваемого заключения из-за того, что необходимо
установить истинность их посылок. В таком случае мы
должны идти в обратном направлении и попытаться опре-
делить достоверность всех посылок в тех правилах, кото-
рые могут применяться для установления истинности
конечного вывода. Перемещение на много уровней назад
в древовидной структуре даст нам факты, которые явля-
ются истинными (явными). Это и есть обратная цепочка
рассуждений.
В качестве примера обратимся к тому же небольшому
набору фактов и правил, которым мы выше воспользова-
лись для описания прямой цепочки рассуждений. Предпо-
ложим, нам необходимо установить истинность х. Мы
можем сделать это, если знаем, что w и у являются истин-
ными. Здесь w представляет собой один из изначально
имеющихся фактов, поэтому нужно установить только
истинность у, который не является исходным фактом, для
чего потребуется установить истинность и и z. Факт и дан
как истинный , a z - нет. Мы сможем завершить весь про-
цесс, если установим истинность z. Посмотрим на пра-
вила. Если факт г верен, то и z, как следствие, будет
истинным. Но г - один из изначально данных фактов, и,
43
значит, мы доказали, что х является истинным. Цель до-
стигнута.
Механизм вывода в Прологе основан на обратной це-
почке рассуждений. Процесс выполнения программы
сводится к установлению истинности определенного
предложения на Прологе (и обычно в определении вели-
чин определенных переменных в процессе) посредством
обратной цепочки рассуждений и продолжается до тех
пор, пока не будут найдены некоторые базовые истинные
факты, известные системе.
ЭС, основанные на обратной цепочке рассуждений, как
правило, применяются при диагностике или классифика-
ции (см. примеры в разд. 1.4.1).
1.4. КЛАССИФИКАЦИЯ ЭКСПЕРТНЫХ СИСТЕМ
1.4.1. НЕКОТОРЫЕ КАТЕГОРИИ ЭС
Создано множество экспертных систем. Д.А.Уотерман
(Donald A. Waterman, A Guide to Expert Systems, pp. 244-
300, Addison-Wesley, Reading, Mass.,1985) описывает 181
ЭС, хотя во многих случаях их трудно отличить от про-
грамм ИИ.
Функции ЭС в зависимости от категории последних
могут быть следующими:
• интерпретация;
• диагностика и ремонт;
• проектирование и планирование;
• управление и контроль.
Далее приводятся примеры, иллюстрирующие все ка-
тегории ЭС.
1.4.2. ПРОГРАММЫ-ПРОТОТИПЫ В КАЖДОЙ КАТЕГОРИИ
Первая категория - системы интерпретации, что оз-
начает получение разумных выводов на основании исход-
ных данных. Примером ЭС такой категории служит
система DENDRAL. Ее проблемная область - химический
анализ. Если анализируется неизвестный химикат, обыч-
но сложная молекула органического соединения, причем
анализ производится посредством стандартных аналити-
ческих методов (спектроскопия и магнитный резонанс),
на выходе получаются спектральные графы с сотнями от-
дельных вершин. Каждая вершина сигнализирует о том
или ином свойстве анализируемой молекулы. Интерпре-
тировать эти графы чрезвычайно трудно, если молекула
44
достаточна сложна. ЭС выполняет процесс рассуждения и
решает, какая молекула могла дать такие спектры, а за-
тем выдает список молекул, упорядоченный по убыва-
нию степеней вероятности, в качестве возможного ответа.
Программа работает подобно опытному химику.
Еще один пример - система PROSPECTOR. Геолог мо-
жет описать программе характеристики исследуемой
минеральной формации, система же будет задавать со-
ответствующие ситуации вопросы и даст заключение о
том, какие минералы могут находиться в данном место-
рождении.
Это примеры программ интерпретации, которые ис-
пользуют прямую цепочку рассуждений. Ниже мы пока-
жем и другие программы, применяющие обратную
цепочку рассуждений или обе стратегии для решения од-
ной глобальной проблемы.
Следующая категория - системы диагностики и ре-
монта. Программы этого типа в основном используются в
медицине. Наиболее ранняя ЭС такого рода - MYCIN, по-
могающая врачу диагностировать (и лечить) заболевания
крови. Подобные системы применяются и в иных целях,
например при ремонте электрического оборудования.
Военные проявляют большой интерес к ЭС диагности-
ки, поскольку их применение позволило бы производить
ремонт сложного оборудования персоналу с невысокой
квалификацией. Да и в повседневной жизни аналогич-
ные проблемы возникают часто, например при почин-
ке автомобиля. Современный автомобиль - непростое
устройство. По некоторым сообщениям, один из автомо-
билестроителей собирался оснастить каждую машину
ЭС бортовым компьютером, о местонахождении которого
знал бы только механик. Терминал подключался бы к ав-
томобилю механиком, и ЭС помогала бы ему точно опре-
делить причину неполадок. Впрочем, автор этой идеи
признался, что сам бы он предпочел машину попроще.
ЭС этой категории иногда называют программами
классификации, потому что диагностика и классифи-
кация в сущности одно и то же. Например, программа
диагностики неисправностей в автомобиле, как прави-
ло, имеет свои критерии поломок для машины. Она
осуществляет “опрос” и “предписывает” тесты, пока не
установит неисправность путем классификации соответ-
ствующих признаков, например:
• слабый аккумулятор;
• засорились топливные форсунки;
• засорился топливный фильтр;
• разбит водяной насос и т.п.
45
Программы диагностики и ремонта обычно используют
обратную цепочку рассуждений.
Системы планирования и проектирования, несмотря
на различие этих видов деятельности, на уровне про-
грамм сходны. Они осуществляют компоновку последова-
тельностей действий или наборов объектов для решения
той или иной проблемы. Одна из ранних ЭС такого типа
SYNCHEM помогала выполнять некоторые операции при
синтезе сложной молекулы органического соединения.
Чтобы получить что-то действительно сложное, как, на-
пример, молекулу органики, необходимо выполнить в
определенной последовательности множество операций-
реакций. Данная система располагает знаниями о прием-
лемых дешевых исходных материалах для реализации
последовательности химических реакций. Программа
знает также об условиях протекания реакций, о возмож-
ных результатах и даже о трудности разложения хими-
ката, полученного из нежелательных примесей и
побочных продуктов.
Как правило, существует много способов получения
данного синтезированного химиката, причем не всегда яс-
но, чем один способ лучше другого. Химик исследует наи-
более приемлемую последовательность реакций, а не
найлучшую из всех последовательностей. На основе сво-
их внутренних критериев ЭС выдает ту последователь-
ность, которую она считает оптимальной. Однако если
химик отвергает ее по причинам, не предусмотренным в
программе, система выдает следующую последователь-
ность реакций, затем еще одну и т. д., пока не будет
получена та, которая удовлетворит и человека, и ком-
пьютер.
Задачи проектирования сходны с задачами планирова-
ния в том, что в них компонуется некий набор первичных
элементов (объектов). Примером ЭС, предназначенной
для решения таких задач, может служить XCON - систе-
ма, разработанная фирмой DEC для подбора конфигура-
ции компьютера VAX. Ежегодный объем продаж этих
компьютеров очень велик. Каждый заказ имеет свои ин-
дивидуальные особенности. Заказчики могут выбирать
различные варианты программного и аппаратного обес-
печения. Кроме того, аппаратное и программное обеспе-
чение не является независимым. Иногда выбор одного
варианта ограничивает применение других возможных
вариантов. К примеру, определенная операционная сис-
тема требует минимальной емкости памяти.
46
Для любого заказа необходимо составить детальный и
последовательный (непротиворечивый) список, который
должен охватывать все желания клиента. Эта важная ра-
бота трудна и утомительна для человека. В качестве вспо-
могательного средства и была разработана ЭС XCON. В
настоящее время подбор конфигурации компьютера VAX
осуществляется подобным способом. Экономия при внед-
рении XCON по сообщению DEC составляет 18 млн. дол.
ежегодно.
Программы планирования и проектирования, как пра-
вило, используют прямую цепочку рассуждений.
Исторически сложилось так, что ЭС первых трех кате-
горий появились ранее остальных.
Системы управления и контроля. Традиционные ме-
тоды позволяют весьма эффективно осуществлять управ-
ление и контроль, и лишь недавно в данной сфере стали
применяться ЭС.
Системы управления и контроля, как правило, связаны
с большими массивами вводимых и выводимых элемен-
тов, которые, в свою очередь, образованы некоторым
сложным устройством или системой. Цель управления и
контроля заключается в автоматическом поддержании
работы устройства оптимальным образом. ЭС применя-
ются в тех случаях, когда проблемная область управления
непроста и изменчива, так что необходим процесс рас-
суждений для выяснения требуемых мер контроля. В этом
и состоит отличие подобных программ от обычных, где
просто используется какой-либо алгоритм.
Подобные ЭС в настоящее время находят применение
для целей контроля на атомных и крупных электростан-
циях, а также на новейших реактивных (военных) само-
летах в качестве интерфейса между пилотом и системой
управления полетом. На таких самолетах ЭС необходи-
ма, чтобы помочь самолету “выжить” в случае повреж-
дения системы управления и перейти на оставшиеся
средства управления. Простейший способ достижения
этой цели — использовать возможности вывода ЭС.
Множество систем управления и контроля предполага-
ется применять в проектах Стратегической оборонной
инициативы (СОИ) для создания спутников, которые,
как предполагается, должны сбивать вражеские ракеты
на подлете к объектам. Рассуждения о том, какую цель
выбрать, как избежать ловушек и как приспособиться к
быстро изменяющейся ситуации, должны производиться
мгновенно. Выполнение операций подобного вида требует
47
чрезвычайно высокого быстродействия и высокого уровня
машинного интеллекта. Вопрос о том, возможна ли прак-
тическая реализация ЭС в этой области, остается откры-
тым.
Программы управления и контроля используют как
прямую, так и обратную цепочку рассуждений.
Кроме рассмотренных выше четырех категорий ЭС,
следует упомянуть еще две, которые, возможно, приобре-
тут первостепенное значение в будущем:
• прогнозирующие системы, способные, например,
предсказать виды на урожай на основе спутниковых
данных или колебания цен в следующем квартале;
• экспертные системы обучения могут построить и не-
прерывно обновлять компьютерную модель того, что
знает и чего не знает учащийся, причем режим обу-
чения будет строиться на основе именно такой моде-
ли.
Упражнения
1. Составьте список 10 ситуаций, в которых ЭС могут быть использова-
ны для деловых операций в небольшом городке. Чтобы придумать
что-либо, полистайте телефонную книгу.
2. Какую эвристику вы бы применили при решении следующих про-
блем?
• вы ищете место для парковки автомобиля на переполненной сто-
янке;
• в эфире идет радиопередача, которую вы хотели бы послушать, но
не знаете, на каких волнах ее искать, причем программы передач у
вас нет;
• находясь в большом здании офиса, вы заблудились, но стесняетесь
спросить, где находится отдел кадров.
3. Придумайте систему управления лифтом, предусматривающую кноп-
ки для трех этажей, а также для закрытия и открытия дверей, сен-
сорный датчик для обнаружения препятствия, возникающего при
закрытии дверей, реле-таймер для фиксации времени, в течение ко-
торого двери открыты, и отдельные кнопки вызова на каждом этаже.
Напишите систему продукций для управления лифтом. Пример ти-
пичной продукции:
Если (срок_действия_таймера_истек и
дверь_открыта и
ничто_не_препятствует_закрытию_двери)
то (закрыть_дверь)
4. Изучите приведенную выше схему классификации ЭС. Для каждой
из перечисленных здесь программ решите, является ли, она ЭС, и,
если да, определите ее тип:
• Программа для прогнозирования местной погоды.
48
• Программа для обнаружения того, что делать, если автомобиль не
заводится.
• Программа для определения стратегии гоночной яхты в регате. Эта
программа работает в режиме реального времени на протяжении
всего периода гонок.
• Программа для помощи отвечающему по телефону доверия, когда
отвечающий должен определить яд, который мог быть принят зво-
нящим.
• Программа для предсказания того, какой учебный курс читать и
сколько спланировать отделений на ближайшие три семестра на
большом факультете института.
• Программа для определения оптимального маршрута продавца в
любой данный день, причем продавец должен посетить всех кли-
ентов и израсходовать минимально возможное количество бензи-
на.
• Программа для получения трехразмерного рисунка дома на основе
имеющегося словесного описания устройства и размеров дома.
5. Изучите следующие правила вывода:
а “*10
f-*y
е-*р
Ь“* р
Ьис“* 1
сит "*х
dna^n
х и a “*z
р и у “*w
Изначально известно, что а, b и с истинны, и, кроме данных правил,
у вас больше нет никакой информации.
Как вы бы использовали прямую цепочку рассуждений для демонст-
рации истинности z?
Как вы бы использовали обратную цепочку рассуждений для демон-
страции истинности z?
Что вы можете сказать по поводу w?
Может ли быть одним из этих способов установлена истинность w?
Может ли быть установлена ложность w?
6. Изучите два дерева поиска, приводимые ниже (рис. 1.4).
В каждом дереве средняя длина пути от вершины до любого конечно-
го узла одна и та же, так что в определенном смысле эти деревья эквива-
лентны. Ваша задача заключается в исследовании последовательностей
поиска в ширину и в глубину. Конечные узлы представляют собой окра-
шенные объекты, поиск которых ведется. Промежуточные узлы пред-
ставляют собой те места,которые вам необходимо просмотреть на
каждом маршруте поиска. Подсчитайте среднее количество узлов, кото-
рое должно быть исследовано для нахождения объекта определенного
цвета. Выполните подсчет для каждого дерева и для каждого метода по-
иска. Чтобы получить среднее число, необходимо решить проблему по-
иска объекта определенного цвета, а затем подсчитать средние
результаты.
49
ДЕРЕВО 1.
ДЕРЕВО 2.
Г олубой
Рис. 1.4. К упражнению 6
2. СИСТЕМЫ, ИСПОЛЬЗУЮЩИЕ
ПРОСТОЙ ПОИСК
И РАСПОЗНАВАНИЕ ОБРАЗОВ
2.1. НЕСЛОЖНЫЕ, НО ВЕСЬМА ПОЛЕЗНЫЕ
ПРОГРАММЫ
Наиболее ярко достоинства языка Пролог проявляются
в двух аспектах - поиске и сопоставлении с образцом, что
обусловлено свойствами самого языка. Не удивительно,
что есть класс программ, обладающих указанными воз-
можностями и, несмотря на свою очень простую внутрен-
нюю структуру, являющихся экспертными системами по
роду решаемых ими задач.
Эти программы, как правило, принимают экспертные
решения в той области, где можно перечислить все до-
ступные решения, а затем сделать выбор, основываясь на
каком-либо методе классификации. Малое пространство
поиска обычно характерно для всех подобных систем.
Программы такого типа не могут считаться экспертны-
ми системами, если попытаться применить к ним струк-
турный критерий (т.е. они должны делать то, что они
делают, определенным способом), но мы их будем иссле-
довать очень тщательно хотя бы по следующим двум при-
чинам:
• они часто оказываются в высшей степени полезными;
• их можно использовать как “базис” для оценки более
сложных экспертных систем, которые действительно
могут решать интересные задачи благодаря заложен-
ной в них настоящей структуре экспертных систем.
В качестве первого примера мы рассмотрим программу
психологической помощи. При ее выполнении создается
впечатление, что она руководствуется жалобами больного
и вовлекает его в разумный (а возможно, даже и полез-
ный) диалог. Эта программа довольно проста и служит
прекрасной иллюстрацией того, что можно сделать с по-
мощью имеющихся в языке Пролог средств сопоставления
с образцом, почти ничем больше не пользуясь. Поиск ис-
пользуется только в том смысле, что Пролог автоматиче-
ски отыскивает образец в правилах, имеющих несколько
предложений.
Вторая программа, которую мы собираемся обсудить,
51
способна осуществлять более серьезный поиск, чем пер-
вая система, но пространство поиска по-прежнему мало,
и сохраняется грубый механический метод. Программа
выполняет автоматизированный химический синтез: на
основе информации о сложном веществе, которое нужно
синтезировать, она выдает способ его получения. Так же,
как и шахматная ЭС, эта система является пограничной.
Пытаясь обобщить такую простую систему в любом на-
правлении, мы сталкиваемся с комбинаторным “взры-
вом”: для нахождения ответа приходится просматривать
огромное количество вариантов. Существуют более изо-
щренные методы поиска, которые иногда помогают в по-
добных ситуациях и оказываются полезными при работе с
экспертными системами. Мы опишем их в гл. 3.
2.2. ПРОГРАММА
ПСИХОЛОГИЧЕСКОЙ ПОМОЩИ
2.2.1. МИНИАТЮРНАЯ ВЕРСИЯ,
ДЕМОНСТРИРУЮЩАЯ МЕТОД
СОПОСТАВЛЕНИЯ С ОБРАЗЦОМ
Эта программа называется MINDGAMES (мысленные
игры). Она предназначена для поддержания диалога с
“пациентом” в стиле тех психологов, которые практику-
ют нетрадиционный метод консультирования, предло-
женный психотерапевтом Карлом Роджерсом. Врач
должен себя вести как “вербальное зеркало пациента”.
Беседа начинается с выяснения тревог последнего, но сам
врач должен оставаться как бы в тени. Ему достаточно
лишь повторять слова пациента (отражая их, как в зер-
кале) и слегка направлять беседу в нужное русло. Есть
надежда, что такой диалог “включит” у пациента внут-
ренние модели сопоставления, которые приведут его в
состояние душевного равновесия. В конце концов люди
сами умеют сопоставлять с образцами.
Программы подобного типа имеют свою историю в
развитии искусственного интеллекта. На представленную
вам версию оказала влияние программа на языке Лисп,
описанная в учебнике Патрика Генри Уинстона “Искус-
ственный интеллект” (Patrick Henry Winston, Artificial
Intellegence, pp. 333-335, Addison-Wesley, Reading, Mass.,
1979). Эволюцию программы можно проследить вплоть до
первой программы психологической помощи “Элиза”
(ELIZA), созданной Джозефом Вейценбаумом.
52
MINDGAMES и аналогичные ей программы могут
служить интересным примером того, как с помощью
небольшой структуры можно создать иллюзию взаимо-
понимания. Сам Вейценбаум говорит, что первоначаль-
ный вариант программы был скорее шуткой. Он поместил
свое “детище” на некоторое время в локальную сеть Мас-
сачусетского технологического института, но многие сту-
денты восприняли систему всерьез, и автор вынужден был
прекратить ее использование, не желая выпускать в мир
чудовище.
2.2.2. МАШИНА В РОЛИ ПСИХОЛОГА
Как работает программа? Машина начинает диалог с
фразы:
“Расскажите, в чем заключается ваша проблема”.
Затем она собирает все ответы пациента и строит даль-
нейшее взаимодействие на основе некоторых образцов,
которые содержатся в собранных предложениях, т.е. ра-
ботает по методу сопоставления с образцом.
Приведем несколько образцов и тех ответов, которые
дает на них машина. Точки заменяют опущенные слова,
не интересующие программу.
Образец из предложения Ответ машины
...Я испытываю... Сколько времени вы это испытываете?
... гнев... А что вы испытываете сейчас?
... мать... Расскажите мне подробнее о своей семье.
... любовь... Вас пугают эмоции?
... ад и т.п.... Пожалуйста, не употребляйте такие слова.
... секс... Это представляется важным.
Очевидно, список образцов можно было бы продолжить
для придания ему большей правдоподобности.
В том случае, когда машина не может подобрать какие-
либо специальные ключевые предложения, выполняется
одно из двух действий, принятых по умолчанию. Если в
предыдущей части диалога хотя бы раз упоминалось сло-
во “мать” и кроме него нет ни одного образца, компьютер
всегда будет стараться повернуть диалог в этом направле-
нии фразой:
“Ранее вы упомянули о своей матери”.
Не найдя в ответах пациента никакого образца, маши-
на попросит:
“Расскажите подробнее”.
53
2.2.3. ДЕТАЛЬНОЕ РАССМОТРЕНИЕ
СТРУКТУРЫ ПРОГРАММЫ
Функция, управляющая ходом выполнения програм-
мы, устанавливается правилом, согласно которому от па-
циента поступает предложение и формируется ответ, а
затем цикл повторяется.
helpme if
write ("Расскажите, в чем заключается ваша проблема.”) ,nl,
repeat,
getclause(L),
makeans(L),
fail.
Предикат getclause запрашивает ответ и преобразует
его в список символов, используя встроенные в Турбо
Пролог функции.
Ответ машины формируется в соответствии с правилом
makeans следующим образом:
makeans (L) if recognize (L, 1),
write ("Сколько времени вы это испытываете?") ,nl,!.
makeans (L) if recognize (L,2),
write ("Расскажите мне подробнее о своей семье.”) ,nl,!.
makeans (L) if recognize (L,3),
write ("Вас пугают эмоции?”) ,nl,!.
makeans (L) if recognize (L,4),
write ("Пожалуйста, не употребляйте такие слова.”) ,nl,!.
makeans (L) if recognize (L,5),
write ("Пожалуйста, будьте точнее.”) ,nl,!.
makeans (L) if recognize (L, 6),
write ("Это представляется важным.”) ,nl,!.
makeans (L) if recognize (L,7),
write ("А что вы испытываете сейчас?”) ,nl,!.
makeans (L) if recognize (L,8),
write ("Слишком много игр.”),п!,!.
makeans (L) if recognize (L,9),
write ("Ранее вы упомянули о своей матери.”) ,nl,!.
makeans (L) if recognize (L, 10),
write ("Расскажите подробнее.”) ,nl,!.
Система “знает”, какое из правил makeans нужно ис-
пользовать, потому что первым внутри этого предиката
стоит другой предикат, в задачу которого входит распоз-
навание конкретной ключевой фразы в ответе пациента.
Организация правил makeans напоминает самую про-
стую форму продукционной системы (обсуждавшейся в
гл. 1). Сверху вниз просматривается список пар “ситуа-
ция - действие”, и выбирается первая подходящая про-
дукция. Затем сканирование повторяется с начала списка.
54
Приведем правила распознавания. На некоторые дета-
ли следует обратить особое внимание. Обычно плохим
стилем программирования считается использование в
языке Пролог оператора OR, но в ряде случаев это вполне
уместно. С его помощью мы можем заставить несколько
соответствующих триггеров инициировать один и тот же
ответ. Пожалуйста, отметьте для себя, что предикат
contains является частью программы, проверяющей, со-
держится ли конкретная значимая фраза в ответе пациен-
та.
recognize (L, 1) if contains ([i,испытываю] ,L).
recognize (L, 2) if contains ([мать] ,L),assert (мать).
recognize (L,3)
recognize (L,4)
recognize (L,5)
recognize (L, 6)
recognize (L, 7)
recognize (L,8)
recognize (_, 9)
recognize (_, 10).
if contains ([любовь] ,L)*
if contains ([ад] ,L).
if L-[да] orL-[нет]).
if contains ([секс] ,L).
if contains ([бешенство] ,L)
or contains ([гнев] ,L).
if contains ([комплекс] ,L)
or contains ([фиксация] ,L).
if мать.
Эти правила распознавания находятся в местах сопо-
ставления с образцом и управляют всей программой. Вто-
рое предложение правила recognize помещает слово
“мать” в базу данных, если оно появилось в процессе диа-
лога. Девятое предложение recognize может затем прове-
рить, появлялось ли в базе данных слово “мать”, если
компьютер ничего больше не может извлечь из ответов
пользователя. Одно из предложений recognize обязатель-
но будет выполнено, потому что последнее из них уста-
новлено на запрос общей информации.
2.3. ПОИСКОВЫЕ ВОЗМОЖНОСТИ
ЯЗЫКА ПРОЛОГ
2.3.1. ПОИСКОВЫЕ ПРОГРАММЫ ДЛЯ ГРАФОВ
В первой главе, знакомя вас с операторами поиска, мы
отметили различные пути использования небольшого де-
рева возможностей. Код на языке Пролог, созданный для
выполнения такой поисковой программы, легко запоми-
нается и объясняется. Он имеет много общего с кодом,
применяемым в более сложных поисковых системах. Это
пример-прототип. Ниже мы кратко рассмотрим задачу
нахождения нужного маршрута в дереве поиска.
55
Предположим, нас интересует дерево, изображенное
на рис. 2.1. Прежде всего наполним структуру некоторы-
ми фактами, что в принципе сделать несложно. Факты
могут выглядеть так:
dconnect(a,b).
dconnect(a,c).
dconnect(b,d).
dconnect(b,e).
dconnect(c,f).
dconnect(c,g).
dconnect(f.h).
dconnect(f,i).
Здесь dconnect(a,b) означает, что в дереве есть связь
между а и Ь.
Можем ли мы написать правило, определяющее марш-
рут вниз по дереву от конкретного узла к одному из “лис-
тьев”? Можно ожидать, что правило будет указывать,
например, на наличие маршрута от с к h, но не от Ь к h.
Размышляя о логике ситуации и не заботясь о том, как
на самом деле работает Пролог-программа, можно создать
такое правило:
dconnect(X,Y) if dconnect(X,Y), dconnect(Y,Z).
Рис. 2.1. Дерево для иллюстрации
поиска по маршрутам
Программа на языке Пролог предназначена для
определения наличия или отсутствия маршрута
от любого внутреннего узла дерева к узлу в его
основании. Например, можно установить путь
от с к h, но пути ombKi при движении вниз
по дереву нет
56
Речь здесь идет о том, что мы можем быть уверены в
наличии связи между X и Y, если сможем найти связь
между X и Z, а затем между Z и Y.
К сожалению, “работать” такая формула не будет, и
программа зациклится. Похоже, что наивные стратегии
поиска маршрутов с помощью Пролог-программы всегда
приводят к зацикливанию. Посмотрим, как это произой-
дет в нашем случае. Например, мы просим программу
считать целью следующий маршрут:
dconnect(a,h).
Программа воспользуется приведенными выше прави-
лами для установки подпроблем, так как прямой связи
между а и h нет. Возможно, она установит следующую
подпроблему:
dconnect (d,h).
и будет беспрерывно вызывать данное правило, пытаясь
найти промежуточные положения для подтверждения
этого потенциального маршрута, т. е. зациклится.
Есть очень простой и полезный способ избежать такой
ситуации. В дереве поиска необходимо отличать (пользу-
ясь разными именами) прямые связи от косвенных, пре-
дусматривающих маршруты, с вовлечением других узлов.
Мы будем сохранять факты связи в неприкосновенности,
но понимать, что dconnect означает прямую связь. Прави-
ло, утверждающее косвенные связи, должно быть записа-
но так:
connect(X,Y) if dconnect(X,Y)«
connect(X,Y) if dconnect(X,Z), dconnect (Z,Y)«
Обратите внимание на порядок предложений. Обычно
более простое правило нужно помещать перед более
сложным. В этом случае система всегда будет искать сна-
чала наипростейший ответ. Если простой ответ существу-
ет, то он будет найден, и не потребуется осуществлять
сложный поиск.
Теперь программа найдет все пути, которые мы ей по-
ручили искать.
2.3.2. НЕКОТОРЫЕ ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ
Читателю следует вспомнить о двух особенностях язы-
ка Пролог, которые будут постоянно использоваться в
этой части книги.
57
Первая особенность состоит в использовании предика-
та findall. Его задача - оценить все возможные ответы на
конкретный вопрос и объединить их в список. Это явля-
ется подготовительным шагом к другим операциям над
списком, таким, как отсечение повторяющихся фраз или
ранжирование ответов в соответствии с их качеством.
findall имеет следующий синтаксис:
Tindall (Variable, Structure, Listvariable)
(Переменная, Структура, Список переменных).
Основное внимание должно быть уделено Structure.
Предикат findall использует все, связанное со Structure,
как цель. Variable должна быть одним из аргументов
предложения, связываемого со Structure. Предикат findall
ищет все возможные варианты связывания Variable, кото-
рые могут возникнуть при достижении цели разными пу-
тями, и данные о каждом связывании помещаются в
список, определенный Listvariable.
Рассмотрим пример. Предположим, у нас есть база
данных с фактами о разных людях, и каждый факт связы-
вает имя человека, его рост в дюймах и массу в фунтах.
База данных может выглядеть так:
person (ату ,64,120).
person (jane,63,100).
person (dan,74,200).
Если мы захотим объединить массу всех людей в еди-
ной списковой переменной L, например для вычисления
ее среднего значения, то нужно задать следующую цель:
findall (X.person (-,-,Х) ,L).
Для имени и роста применяются анонимные перемен-
ные, так как они нас не интересуют.
Вторая особенность программирования, которую хоте-
лось бы отметить, - использование сложных объектов, а
также способы сопоставления двух таких объектов. Слож-
ные объекты весьма полезны при работе с программами
химического синтеза, с которыми мы собираемся поэкспе-
риментировать.
Базисными единицами в Пролог-программе являются
константы, переменные и структуры. Константа пред-
ставляет собой имя, а переменная - объект данных, кото-
рый может связываться с другими объектами данных.
58
Структура считается более сложной единицей. Она состо-
ят из функтора и аргументов. Функтор есть имя связи, в
которую включены аргументы. Например, структура
likes (John,food).
определяет, что Джон любит еду. Функтором здесь слу-
жит likes, а двумя аргументами - john и food. Аргумента-
ми функтора могут быть константы, переменные и другие
зтруктуры. В частности, мы можем создать более слож-
ную и более определенную структуру, например:
likes (John,food (ice_creem, cherry)).
Итак, вторым аргументом мы сделали структуру со
своими вариантами. Эта структура описывает конкрет-
ную пищу. Функтором здесь является food, а аргумента-
ми - ice-creem и cherry. Мы используем второй аргумент
(cherry) для указания типа первого (ice -creem). Однако
Пролог просто воспринимает функтор с двумя аргумента-
ми.
Сетевые структуры, подобные рассмотренной, очень
полезны для описания сложных объектов данных.
Когда при обработке запроса программа выбирает об-
разец для сложного объекта, важно понять, как происхо-
дит выбор. Например, по запросу:
likes (X,food (ice_creem, _)).
5удут найдены имена всех, кто любит мороженое, john -
одно из возможных возвращаемых значений. Это связано
с тем, что структура запроса выбирается среди подходя-
щих структур, хранимых в базе данных. Для случая john
подходящей структурой является следующая:
likes (John,food (ice-creem,cherry)).
При потенциальном сопоставлении с образцом сначала
необходимо удостовериться в том, что функторы верхнего
уровня одинаковы (likes). Затем сравниваются (слева на-
право) соответствующие аргументы обеих структур. В
случае их совпадения процесс сопоставления продолжает-
ся. Если одна из сравниваемых переменных - свободная,
го она связывается с соответствующим аргументом другой
структуры. При двух различных аргументах и отсутствии
связывания, которое может сделать их одинаковыми,
выбор заканчивается неудачей. Если аргумент структуры
59
является, в свою очередь, структурой (food), то правила
сопоставления применяются рекурсивно для всех внут-
ренних уровней.
Процесс сопоставления называется унификацией. Это
основной метод в тех ситуациях, когда Пролог получает
значения для переменных.
2.4. ПРОСТАЯ ПРОГРАММА
ХИМИЧЕСКОГО СИНТЕЗА
2.4.1. МИНИАТЮРНАЯ ВЕРСИЯ,
ИЛЛЮСТРИРУЮЩАЯ
ПРОЦЕСС ПОИСКА
Теперь рассмотрим пример очень полезной программы,
осуществляющей в основном поиск в ограниченном про-
странстве состояний. По мнению автора, многие практи-
ческие приложения построены именно таким образом, и
по мере освоения Пролога вы будете узнавать о них все
больше и больше.
Химический синтез означает следующее: предполо-
жим, вы придумали сложное химическое соединение и
хотите его создать. Укажите формулу вещества програм-
ме, и она сообщит вам последовательность более простых
соединений, которую можно использовать для получения
интересующего вас продукта. Если существует несколько
способов получения такого продукта, то система их пере-
числит, а также просчитает стоимость каждого синтеза,
что позволит выбрать из них наиболее подходящий.
Для понимания проблем, обсуждаемых в данном разде-
ле, вам не потребуются знания по химии. Вы будете их
получать в процессе знакомства с программой.
На первый взгляд химический синтез напоминает зада-
чу нахождения маршрута в дереве поиска. Желаемый ко-
нечный продукт создается из более простых соединений,
они, в свою очередь, - из еще более простых, и т. д. до тех
пор, пока мы не дойдем до исходных материалов. В этом
смысле наш “первый взгляд” оказался верным: мы имеем
дело с прототипом задачи поиска в дереве.
В этой “элементарной химии” прежде всего нам потре-
буется подтверждение возможности осуществления нуж-
ных химических реакций. Давайте заключим следующее
соглашение. Пусть первые буквы алфавита от а до h пред-
ставляют соединения низкого уровня, которые могут слу-
жить исходным материалом в химическом синтезе, буквы
60
алфавита - соединения, ожидаемые в результате синтеза.
Центральным элементом является химическая реак-
ция. Ее можно осуществить несколькими способами. Со-
средоточим внимание на двух относительно простых
соединениях а и Ь, которые нужно соединить в молекулу
i. Химик запишет эту информацию так:
a + b“* i
Мы же должны записать реакцию несколькими наибо-
лее удобными способами. Во-первых, для помещения ин-
формации в контекст языка Пролог нам потребуется
превратить ее в факт. Указанная выше реакция, преобра-
зованная в факт, записывается следующим образом:
rxn(i,[a,b]).
и читается так: “Реакция синтеза i происходит при соеди-
нении а и Ь”. Кроме того, мы можем представить реакцию
в виде треугольника, поместив продукт в его вершину,
а реактанты - в основание:
1
а b
Это похоже на фрагмент дерева, и такой записью
мы подчеркиваем, что собираемся искать рецепт создания
сложного соединения с помощью процесса поиска по дере-
ву.
Реакции низкого уровня начинаются с исходных мате-
риалов. Исходные материалы могут быть представлены в
виде соответствующих фактов, например
rawmaterial(a).
Rawmaterial (исходный материал) - дешевый и широко
распространенный, и его не нужно специально синтезиро-
вать.
Итак, синтез сводится к созданию списка всех реакций,
которые небходимо осуществить для получения нужного
соединения из имеющихся исходных материалов. Это ре-
цепт. Например, мы хотим синтезировать соединение q.
Если наша программа обнаруживает факт, что q можно
получить из i и j, i - из а и b, a j - из с и d, то это и есть
искомый синтез. Предположим, что система “знает”
только о тех реакциях, которые представлены на рис. 2.2.
61
Отметим две особенности указанных реакций. Обратите
внимание на то, что для некоторых соединений (p,w,z)
существует несколько способов синтеза и что далеко не
всегда два соединения, необходимых для получения
третьего, находятся на одном уровне. Иногда один реак-
тант может быть сложным (большая молекула, получен-
ная в результате других реакций), а другой простым
например, когда z получается из w (сложный) и к (про-
стой).
Реакция низшего уровня с исходными реактантами:
Реакция на среднем уровне
Реакция на высоком уровне
Реакция на высшем уровне
Рис. 2.2. Гипотетические реакции
для химического синтеза
Напоминаем, что буквы алфавита от a doh
представляют исходные материалы. На рисунке
приведены данные для нашей химической
бухгалтерии и системы помощи. Простые
химические реакции осуществляются так:
из двух гипотетических соединений, назовем
uxaub, синтезируется третье, ЬЭтот процесс
изображен треугольником ci в вершине uaub
в основании. Все возможные реакции, о которых
система должна знать,здесь показаны
62
2.4.2. ПРОГРАММИРУЕМЫЕ СТРАТЕГИИ ПОИСКА
2.4.2.1. Химический синтез:
нахождение дерева реакций
Для синтеза нового соединения из простых веществ, со-
здано объединенное дерево реакций, по которому можно
проследить, какие вещества соединяются между собой для
получения желаемого конечного продукта. Такое дерево
является гипотетическим. Оно не существует нигде, кро-
ме как в логических связях между реакциями.
Рис. 2.3 Типичное дерево реакций
Это дерево показывает один из возможных способов создания вещест-
ва w: w создается из jиг, jиз сudи т.д. Буквы в основании обознача-
ют исходные материалы, а числа рядом с ними указывают их стои-
мость. Число около каждого узла, находящегося внутри дерева, указы-
вает стоимость создания соединения (реакции) двух расположенных
ниже элементов. Например, соединение к и 1с целью получения г сто-
ит в относительных единицах 1
Например, наши базисные реакции, представленные
на рис. 2.2, предполагают один способ синтезирования w,
который и показан на рис. 2.3. Числа около узлов обоз-
начают стоимость соединения (этот вопрос мы обсудим
позднее).
Один из способов решения задачи синтеза связан с по-
нятием о химических предшественниках. Эти предшест-
63
венники представляют собой химические родительские
элементы. Возьмем любой узел в дереве реакций, изобра-
женном на рис. 2.3. Узлы, расположенные непосредствен-
но под ним, являются прямыми предшественниками
данного узла. Предшественниками считаются и все узлы
в поддереве, начинающемся от выбранного узла. Такие
рассуждения непосредственно наталкивают на мысль о
программе поиска по дереву, о которой шла речь выше.
Отношения предшественников можно выразить следу-
ющими правилами:
dprecursor-of(X,Y) if rxn(X,R),belongs_to(Y,R).
Здесь утверждается, что Y - предшественник конечно-
го продукта X в том случае, если это одно из соединений,
принимающих участие в реакции создания конечного
продукта (без промежуточных шагов). Предикат belongs-
to часто используется в Пролог-программах и иногда
употребляется под именем member или member-of. С его
помощью проверяют, является ли данный объект элемен-
том определенного списка.
belongs-to(X,[x:-]).
belongs-to(X, [_:Tail]) if belongs_to(X,Tail).
Для завершения определения понятия предшественни-
ков нам еще потребуются правила
precursor_of(X,Y) if dprecursor-of(X,Y).
precursor_of(X,Y) if
dprecursor_of (X,Z) ,precursor_of (Z,Y) •
В этих правилах утверждается, что Y суть предшест-
венник конечного продукта X, если он является его
прямым предшественником, и Y суть предшественник ко-
нечного продукта X, если он является прямым предшест-
венником его предшественника Z.
Напомним, что аргументы предиката - простые эле-
менты, за исключением второго аргумента гхп, который
представляет собой список. Обратите внимание на то, что
нужно использовать два различных имени при определе-
нии этих связей. Если употреблялось только одно имя, то
могут возникнуть обычные трудности, связанные с зацик-
ливанием программы.
Теперь мы можем определить понятие содействующей
реакции как реакции, в результате которой получается
64
или желаемый конечный продукт, или один из его пред-
шественников:
contrib-rxn (Y,rxn(Y,X)) if rxn(Y,X).
contrib-rxn(Y,rxn(Z,X)) if rxn(Z,X),precursor-of(Y,Z).
Например, реакции
ncn(w,[j,r]) Hrxn(j,[c,d])
являются содействующими при синтезе продукта w.
Заметим, что гхп используется и как свободный преди-
кат, и как аргумент в предикате contrib-rxn. Никаких
проблем нет. Такая конструкция очень удобна, а для
Пролога представляет просто другой уровень сопоставле-
ния образцов. В данной программе это используется по-
стоянно. Предикат будет появляться самостоятельно в
качестве сложного объекта, который служит аргументом
предиката более высокого уровня.
Наконец, мы можем определить синтез как список всех
содействующих реакций, имеющих отношение к конеч-
ному продукту:
synthesis (Y,Z) if findalUX,contrib-rxn (Y,X) ,Z)
Это простое решение. Здесь второй аргумент synthesis
представляет список реакций, собранных с помощью пра-
вила findall. Если мы используем данные, приведенные на
рис. 2.3 и даДим системе запрос
synthesis(w,X).
она предложит схему синтеза соединения w, и ответ будет
выглядеть так:
X-rxn(w,[j,r])
rxn(J, [c,d])
rxn(k,[e,f])
rxn(l, [e,b])
rxn(r, [kJ])
Как часто бывает в процессе решения задачи, мы ста-
раемся найти самый простой путь. Формулировка задачи
может считаться хорошей, если нужно знать предшест-
венников и содействующие реакции, но нас интересует
только способ получения конечного продукта. Его можно
найти, используя одно правило:
syn (YД ]) if rawmaterial (Y).
syn(Y.L) if rxn(YJXl,X2]).
syn(Xl,Ll),syn(X2,L2).
3—7Б1
65
append (LI ,L2,Q).
append ([rxn(Y, [XI ,X2]) ,Q,L) •
В такой формулировке первый аргумент syn является
простым элементом, а второй - списком реакций. Теперь
у нас есть одно правило с несколькими предложениями, в
котором удобно собраны в список все реакции, необходи-
мые для конкретного синтеза.
В более сложном предложении правила syn утвержда-
ется, что мы можем найти список L, определяющий син-
тез соединения Y, если решим более простые задачи.
Во-первых, нам нужна реакция непосредственного полу-
чения Y из XI и Х2. Во-вторых, необходимо синтезиро-
вать L1 и L2 для каждого из этих соединений. Затем с
помощью append мы объединим L1 и L2 в список Q и,
наконец, для получения ответа поместим только что най-
денную реакцию высшего уровня в начало нашего списка.
Заметьте, что все реакции используются как сложный
объект, представляющий собой один элемент конструиру-
емого списка. Конечно, предикат append должен быть оп-
ределен так, чтобы принимать объекты этого типа.
По мере накопления знаний, скажем, из нашего при-
мера, вам может показаться, что на языке Пролог про-
граммировать сложно. Конечно, сам по себе пример не
сложен, но создание такого кода - задача не для начинаю-
щих программистов. Однако не теряйте мужества. Про-
граммы этого типа очень полезны. Их нужно прочитать
несколько раз, прежде чем вам все станет ясным. Мы хо-
тим подчеркнуть, что концепции, излагаемые в настоя-
щей главе, необходимы для дальнейшего освоения
материала, хотя детали кодирования могут вам впослед-
ствии и не потребоваться.
2.4.2.2. Достаточно хороший синтез
Теперь мы готовы ответить на некоторые практические
вопросы. Немного поработав, вы сможете уже самостоя-
тельно решать проблемы типа “Как можно выполнить до-
статочно хороший синтез, наилучший синтез ”. Но для их
решения нужно знать стоимость каждой реакции синтеза.
В системах, основанных на поиске, выбор альтерна-
тивы всегда осуществляется путем сравнения стоимостей
со стоимостью, подходящей для решения конкретной
задачи. В нашем примере используются три стоимости:
исходных материалов, соединения реактантов и их
объединения в продукт. На каждой стадии стоимость
складывается из стоимостей самой реакции и ее непосред-
66
ственных предшественников. Эти стоимости, конечно,
интересуют химика, а не нас с вами.
Мы модифицируем формат наших основных фактов,
чтобы отобразить их стоимости в единицах на дереве ре-
акций. Вот как будут выглядеть новые факты для исход-
ных материалов (второй аргумент обозначает стоимость):
Новый формат Предыдущий формат
rawmaterial (а,5) rawmaterial (а)
Кроме того, каждая реакция также должна иметь свою
стоимость. Нам придется создать более сложный вид
базисной реакции, так как она теперь объединяет две не-
похожие информации. Первым аргументом может быть
сложный объект, получающий информацию об исполь-
зуемых соединениях. Второй аргумент получает ин-
формацию о стоимости их соединения и выделения из
них нужного продукта. Заметьте, что новый предикат,
названный path, взял на себя работу гхп, а гхп стал объе-
динять маршрут и стоимость.
Новый формат Предыдущий формат
rxn (path (i, [а, b]) ,3). гхп (path (i, [a,b]) •
Важно понимать, что стоимость, указанная в этих фак-
тах реакции, просто включает стоимость реакции, без
учета стоимости самих соединений. Общая же стоимость
складывается из этих частных величин.
На рис. 2.3 значения стоимостей во внутренних узлах
соответствуют стоимостям реакций, а около листьев -
стоимостям исходных материалов. Общую стоимость син-
теза в любом узле легко вычислить, прибавив к указан-
ной в данном узле все значения, расположенные ниже.
Следовательно, стоимость синтеза w равна 29.
Обратите также внимание на то, как изменяются опи-
сания domains и predicates по мере возрастания сложно-
сти базисных фактов:
domains
rxnlist - reaction*
reaction - rxn (rpath,cost)
rpath - path (chemical,reactants)
reactants - chemical*
chemical “ symbol
cost - integer
predicates
rawmaterial (chemical,cost)
rxn (rpath,cost)
67
syn (chemical,rxnlist,cost)
append (rxnlist,rxnlist,rxnlist)
Так как, введя стоимостные оценки, мы изменили ба-
зисные факты, требуется исправить правило synthesis для
вычисления общей стоимости синтеза конечного продук-
та. Теперь стоимость синтеза станет третьим аргументом
в измененной версии правила synthesis:
syn(Y, [ ] ,С) if rawmaterial(Y,С).
syn (Y,L,CT) if rxn (path (Y, [XI ,X2]) ,C),
syn(Xl,Ll,Cl),syn(X2,L2,C2),
CT-C+ C1+ C2,
append (LI ,L2,Q),
append ([rxn (path (Y, [XI ,X2]) ,C) ] ,Q,L).
Сохраняется прежний механизм управления, не считая
того, что общая стоимость добавляется как часть рекур-
сии.
Имея такую структуру, можно написать достаточно
хорошее правило синтеза. Предположим, что желаемый
продукт можно создать с помощью различных реакций
синтеза, каждой из которых соответствует своя сто-
имость. Нас же интересует реакция со стоимостью мень-
шей принятой нами величины. Запишем правило:
okay-syn (Y,syn (Y,L,CT),Cutoff) if
syn (Y,L,CT),CT< Cutoff
Итак, мы создали новый сложный объект, одним из ар-
гументов которого является описанный выше предикат
высокого уровня для синтеза. Это позволит программе
просматривать варианты синтеза до тех пор, пока не най-
дется удовлетворяющий критерию, указанному в правиле
самого высокого уровня.
2.4.2.3. Наилучший синтез
Последнее, что нам предстоит сделать, это, найдя удоб-
ный способ объединения всех реакций синтеза, выбрать
среди них наилучший. Такие задачи целесообразно ре-
шать последовательно.
Очевидно, в данном случае нужно использовать встро-
енный предикат findall. Однако findall имеет весьма
жесткую внутреннюю грамматику, поэтому нам придется
изменить форму компоновки в синтезе, прежде чем уда-
стся собрать вместе все реактанты. Мы определяем новое
предложение one-syn, которое является простой распа-
ковкой правила synthesis:
68
one-syn (Y,syn(Y,L,CT)) if syn(Y,L,CT).
Весь синтез как сложный объект становится аргумен-
том нового предиката one-syn подобно тому, что мы уже
видели в предикате okay-syn.
Используя новое правило, можно определить преди-
кат, который соберет все возможные реакции синтеза в
один большой список. В приведенном ниже предикате
первым аргументом является конечный продукт, а вто-
рым - список реакций синтеза:
all-syn(Y,X) if findall (S,one-syn (Y,S),X).
Объявление domains становится несколько запутанным
при использовании сложных объектов в качестве аргу-
ментов. Вот дополнение, которое мы должны внести в эту
часть программы для новых предложений (не забывайте о
том, что все старые объявления продолжают действовать,
хотя они и не указаны):
domains
synlist - synform*
synform - sy n (chemical, rxnlist,cost)
predicates
one-syn (chemical,synform)
all-syn (chemical,synlist)
okay-syn (chemical,synform,integer)
Остается решить единственный вопрос: как найти наи-
лучший синтез (т.е. самый дешевый)? Понятно, что нуж-
но собрать все реакции синтеза в один список, а затем
выбрать ту, которая имеет наименьшую стоимость:
best-syn(Y,Z) if all-syn(Y,X) and min(X,Z).
Вторым аргументом best-syn является правило, описы-
вающее простой синтез. Правило all-syn объединяет все в
список реакций синтеза (второй аргумент), a min прове-
ряет список и находит конкретный синтез с наименьшей
стоимостью.
Для пояснения работы min приведем простую версию
предиката, который просто находит наименьший элемент
в списке целых чисел:
min([X],X).
min([Hl:T],Hl) if min(T,H2) and Hl <-H2.
min([Hl:T] ,H2) if min(T,H2) andH2<Hl.
В модели химического синтеза предикат min выполня-
69
ет те же действия, однако стоимость располагается уров-
нем ниже и входит в сложный объект (синтез), а не ис-
пользуется непосредственно на высшем уровне. Правила,
измененные в соответствии с этим соображением, имеют
вид
min ([syn (Y,L,CT) ] ,syn (Y,L,CT)).
min([syn(Y,L,CT):T],syn(Y,L,CT)) if
min (T.syn (Y,L1 ,C 1)) and CT < - Cl.
min([syn(Y,L,CT):T] ,syn(Y,L2,C2)) if
min(T,syn(Y,L2,C2)) and C2 < - CT.
Последние дополнения к объявлениям в программе вы-
глядят так:
predicates
min (synlist'Synform)
best-syn (chemical .synform)
От всего этого голова может пойти кругом. Прочитав
два следующих коротких раздела, вам захочется отдох-
нуть или вернуться и перечитать главу о сложных объек-
тах, которые являются очень мощным средством, но не
очень легко воспринимаются.
Пожалуйста, отметьте место, до которого мы дошли.
Система химического синтеза сейчас находится на грани-
це того, что можно назвать реальной экспертной систе-
мой. Подобно некоторым шахматным программам, она
выполняет функции эксперта и работает по принципу по-
иска. Поиск осуществляется на многих уровнях дерева с
аналогичной иерархией, поэтому программа достаточно
сложна. Но она функционирует полностью механически,
а пространство поиска относительно невелико. Мы счита-
ем ее полезной программой, работающей в пределах
возможностей простого Пролога, в пограничной зоне экс-
пертных систем. Экспертные системы могут делать все,
что вы видели, и еще многое другое.
2.4.3. Реальная система химического синтеза
За последние 20 лет фирмы, производящие лекарствен-
ные препараты, вложили большие средства в разработку
программ типа тех, которые мы обсуждаем. Некоторые
из этих систем постоянно используются и продолжают
развиваться. Наиболее известная среди них SYNCHEM
написана на языке ПЛ/1. Если бы у разработчиков был
Пролог, им явно было бы легче.
70
Следует признать, что система химического синтеза,
которую мы здесь рассмотрели, весьма ограничена по сво-
им возможностям, но она указывает путь для создания
лучших систем. Ее ограничения наиболее отчетливо про-
являются в двух областях.
Во-первых, все реакции выписаны явным образом, а не
являются обобщенными, на основе которых можно созда-
вать конкретные примеры. В частности, кислотно-щелоч-
ные реакции программа осуществляет таким образом :
соляная кислота плюс гидроксид натрия поваренная соль
соляная кислота плюс гидроксид калия хлористый калий
соляная кислота плюс гидроксид кальция хлористый кальций
ит.д.
Каждая реакция рассматривается отдельно. В усовер-
шенствованном методе применялся бы какой-нибудь шаб-
лон, который выглядел бы, скажем, так:
(кислота) плюс (щелочь) (соль)
Системе также потребовалось бы узнать, к какому ви-
ду относится каждое вещество, чтобы его можно было ис-
пользовать в разных шаблонах, например:
base (гидроксид натрия)
base (гидроксид калия)
base (гидроксид кальция)
acid (соляная кислота)
ит.д.
Во-вторых, настоящие системы синтеза должны рабо-
тать с соединениями, никогда ранее не существовавшими,
а не теми, которые являются плодами чужих трудов (по-
думайте, откуда поступила в базу данных необходимая
информация о реакциях?).
Оба эти аспекта, конечно, можно обсудить, но тогда
программа, рассмотрение которой мы завершаем, будет
перегружена знаниями из специальной области, что толь-
ко затруднит освоение материала книги.
2.4.4. РАЗВИТИЕ ПО ПРИНЦИПУ “СНИЗУ-ВВЕРХ”
В заключение хотелось бы обратить ваше внимание на
то, что изучаемый пример демонстрирует нечто интерес-
ное о путях создания многих программ на Прологе. Это
принцип “снизу-вверх”, который весьма характерен для
Пролог-программ. Работа начинается с несложных логи-
71
ческих утверждений о простых и известных вещах. Далее
они объединяются в более сложные правила и объекты
данных. На каждой стадии мы опираемся на предыдущий
уровень до тех пор, пока не появится правило, содержа-
щее все, что нас интересует.
Упражнения
1. Посмотрите на дерево, изображенное на рис. 2.1. Предположим, что
сюда были добавлены следующие факты:
, dconnect(b,a).
dconnect(f,a).
Как нужно изменить программу, чтобы она могла по-прежнему на-
ходить пути от верхнего узла к листьям?
2. В таксономических системах типа той, что обычно используется для
классификации животных, упрощены некоторые виды поиска, пото-
му что объекты, расположенные на нижних уровнях дерева, наследу-
ют свойства вышерасположенных. Например, перечислим факты,
затрагивающие небольшую часть таксономии животных:
is-a (млекопитающее,позвоночное).
is-a (плотоядное, млекопитающее),
is-a (копытное, млекопитающее).
is-a (семейство псовых, плотоядный),
is-a (семейство кошачьих, плотоядное),
is-a(кошка, семейство кошачьих).
is-a (собака, семейство псовых).
is-a (корова, копытное).
has-property (позвоночное, позвоночник).
has-property (млекопитающее,кормит детей молоком).
has-property (плотоядное, острые зубы).
has-property(копытное, плоские зубы).
has-property (собака, лает).
has-property (кошка, мурлыкает).
has-property (корова, мычит).
Изобразите дерево, отражающее эти факты явным образом.
3. Сейчас программа химического синтеза обеспечивает реакции типа
х + у “*z
Какие изменения нужно в нее внести, чтобы реакции подобного рода
можно было включить в базу данных, о которой “знает** система?
Г “>8
Речь здесь идет о реакциях преобразования _ когда вы что-либо делаете
с веществом (например, нагреваете), оно превращается в нечто иное.
Какие нужно внести изменения, чтобы можно было включить в базу
данных реакции типа
q + r + s“* w
72
4. Какие изменения нужно внести в программу, чтобы она работала с
двумя стоимостными оценками. Одной из них может быть стоимость
самой реакции, а второй - время, затрачиваемое на ее выполнение.
5. Создайте небольшой набор данных из кулинарной области для приго-
товления какого-либо блюда с помощью программы химического
синтеза. В данном случае рецепт следует считать типом реакции.
6. Напишите предикат contains, используемый в программе
MINDGAMES; contains(X,Y) имеет два аргумента, каждый из кото-
рых является списком символов и выполняется всегда при появлении
списка X как подсписка списка Y.
7. Измените программу MIND GAMES так, чтобы следующие ответы че-
редовались друг с другом во всех случаях, когда в иеёледнем предло-
жении пациента встречается слово “почему”.
♦“Вопросы здесь задаю я. Теперь расскажите мне о своей работе”.
♦“Мы становимся воинственными, не так ли?”
3. ВЫБОР НАПРАВЛЕНИЙ ПОИСКА
С ПОМОЩЬЮ ЭВРИСТИК
3.1. ВВЕДЕНИЕ В ТЕХНОЛОГИЮ
ПРОГРАММИРОВАНИЯ С ЭВРИСТИКАМИ
Применяя стратегию “грубой силы” для нахождения
наилучшего решения задачи, программа ИИ перечисляет
все возможные решения, а затем выбирает то, которое
удовлетворяет установленному критерию. Если требуется
найти просто удовлетворительное решение, то программа
будет продуцировать решения до тех пор, пока не найдет
то, которое выше предела желаемости. Решения генери-
руются посредством перестановок всех управляющих пе-
ременных. Порядок исследования решений совпадает с
порядком, используемым системой вывода, а не с поряд-
ком, диктуемым логикой задачи.
Если пространство поиска достаточно мало, то описан-
ная процедура выполняется успешно, но для многих за-
дач требуется более направленное исследование этого
пространства. Эвристики используются для того, чтобы
некоторые наиболее важные области просматривались
прежде остальных с целью быстрого нахождения ответа.
Мы уже ранее обсуждали эвристики (см. гл. 1). Теперь
нам предстоит рассмотреть несколько конкретных приме-
ров их применения в программах.
Существуют два типичных способа включения эври-
стической информации о конкретной задаче в поисковую
структуру:
• с помощью эвристической оценочной функции, кото-
рая “взвешивает” утверждения конкретной задачи и
определяет их относительную значимость;
• непосредственно поместив эвристическую информа-
цию в правила. Например, правила в шахматной сис-
теме могут описывать не просто разрешенные
перемещения, а те, которые желательно предпри-
нять.
Здесь иллюстрируются обе эти техники. Начнем с
первой на примере знаменитой задачи “Восьмерка”.
“Восьмерка” - хорошая арена для исследования многих
простых стратегий поиска. Обычно задача представляется
так, как показано на рис. 3.1. Предположим, что квадрат-
ные фишки с номерами перемещаются в квадратной рам-
74
ке. Заданы начальное и конечное состояния. Задача за-
ключается в нахождении последовательности перемеще-
ний фишек из начального положения в конечное. Любую
фишку можно передвинуть по горизонтали или верти-
кали, если рядом есть свободное место, но двигаться по
диагонали запрещено.
Количество состояний слишком велико для их не-
посредственного перебора. Вместо этого представьте про-
грамму, перемещающую фишки в определенном порядке
от состояния к состоянию. Вычисляя эвристическую фун-
кцию для каждого состояния, она оценивает качество
ходов. Такое исследование может быть выполнено не-
сколькими способами с использованием эвристических
функций.
Мы обсудим только структуру решения задачи “Вось-
мерка”, потому что хорошая программа чересчур сложна
и может увести нас в сторону от полезных экспертных
систем.
Для иллюстрации другой стратегии, при которой эври-
стическая информация непосредственно вводится в пра-
вила, вам будет предложена программа Student Advisor
(помощник студента), составляющая расписание занятий
по курсу вычислительной техники. Она использует набор
эвристик, позволяющих простым и понятным образом не-
медленно прийти к удовлетворительному решению, по-
том к более хорошему и т.д., несмотря на то, что
пространство поиска велико.
3.2. ПОИСК С ПРИМЕНЕНИЕМ
ЭВРИСТИЧЕСКОЙ ОЦЕНОЧНОЙ ФУНКЦИИ
В программе химического синтеза вычислялась функ-
ция стоимости, причем после того, как определялось сле-
дующее вещество, которое предстояло создать, а также
для выбора наилучшего решения по завершении исследо-
вания всех возможностей. Она не является эвристической
оценочной функцией, хотя идея и похожа. Оценочная
функция скорее устанавливает, как близко вы подошли
к цели, а не качество ответа. Обычно оценочная функция
вычисляется на каждом шаге решения задачи, так что мы
можем приближаться к цели.
Обратимся к “Восьмерке”. Легко представить задачу в
виде, пригодном для работы в программе на Прологе.
Можно считать, что состояние игры соответствует списку
из девяти целых чисел, а позиции аргументов в списке -
фиксированным позициям в квадратной рамке. Так,
первый аргумент может отображать содержимое позиции,
75
находящейся в левом верхнем углу, второй - в середине
верхнего ряда и т.д. Для обозначения пустой клетки мож-
но использовать нуль. Задача может включать 9 фактори-
ал (9!) (более 350 000) возможных состояний.
Как представить перемещения? Вероятный вариант пе-
ремещения из начальной позиции:
[4,0,5,7,2,1,3,8,6] -* [4,2,5,7,0,1,3,8,6]
НАЧАЛЬНОЕ СОСТОЯНИЕ
Представление в виде рисунка
Представление в виде списка
КОНЕЧНОЕ СОСТОЯНИЕ
Представление в виде рисунка
Представление в виде списка
Рис. 3.1. Задача “Восьмерка*
Здесь показаны два варианта из известной детской игры “Восьмерке?.
Вы можете представить ее зрительно в виде квадрата с девятью воз-
можными позициями и восемью маленькими подвижными квадратика-
ми, расположенными внутри большого. Одна позиция пустая. Цель за-
дачи - найти последовательность перемещений, чтобы перейти из на-
чального положения в определенное конечное
Другими словами, пустой квадратик расположен в цен-
тре рамки. Возможные перемещения могут быть описаны
общими правилами, показывающими допустимые преоб-
разования. Таких правил 24. Правило, описывающее ука-
занное выше действие, может выглядеть так:
trans( [Pl ,0,РЗ,Р4,Х,Р6,Р7,Р8,Р9], [Pl ,Х,РЗ,Р4,0,Р6,Р7,Р8,Р9]),
где первый и второй списки аргументов в trans представ-
ляют состояние задачи до и после перемещения.
76
Даже если бы исчерпывающий поиск был запрещен,
его следовало начать с обдумывания операций, основан-
ных на грубых методах. Существуют два способа система-
тического исследования состояния задачи без
использования эвристик. При поиске в глубину рассмат-
риваются все последствия начального перемещения од-
ной фишки до того, как будет предпринята попытка
альтернативного начального хода. Этот принцип выдер-
живается на каждом уровне исследований. В начальном
положении можно сделать один из трех ходов:
[4,0,5,7,2,1,3,8,6] -> 14,2,5,7,0,1,3,8,6]
14,0,5,7,2,1,3,8,6] “> [0,4,5,7,2,1,3,8,6]
[4,0,5,7,2,1,3,8,6] [4,5,0,7,2,1,3,8,6]
Предположим, что действительно сделан первый пока-
занный шаг. Тогда становятся возможными три других
шага, приводящих к новым конечным положениям:
14,2,5,7,0,1,3,8,6] -> [4,2,5,0,7,1,3,8,6]
[4,2,5,7,0,1,3,8,6] [4,2,5,7,1,0,3,8,61
14,2,5,7,0,1,3,8,6] [4,2,5,7,8,1,3,0,61
Допустим, что опять выбран первый вариант. Теперь
возможны два перемещения (если мы не будем возвра-
щаться к тем позициям, которые уже были) и т.д.
При поиске в глубину всегда полностью исследуется
первая альтернатива до тех пор, пока не будет найден от-
вет или работа не зайдет в тупик. В случае тупика про-
грамма вернется на последнюю точку выбора и применит
ту же стратегию для исследования следующей возмож-
ности. Такой метод предполагает наличие определенного
порядка выборов в зависимости от конкретного состояния
задачи. Здесь просто осуществляется механическое ран-
жирование, вытекающее из внутренней структуры про-
граммы; не делается даже попытка проранжировать
варианты в соответствии с желательностью.
Поиск в ширину - еще одна стратегия полного исследо-
вания пространства поиска без использования эвристик.
Суть этой стратегии заключается в проверке всех альтер-
натив на расстоянии- п шагов от начала до того, как на-
чнется просмотр n + 1 шага. Поэтому программа поиска в
ширину, чтобы выяснить, не достигла ли она нужного ре-
шения, прежде разберет все указанные ниже трансформа-
ции:
[4,0,5,7,2,1,3,8,6] [4,2,5,7,0,1,3,8,61
14,0,5,7,2,1,3,8,6] [0,4,5,7,0,1,3,8,6]
[4,0,5,7,2,1,3,8,6] -> [4,5,0,7,2,1,3,8,6]
77
Далее она просмотрит с той же целью все пути на рас-
стоянии двух трансформаций от начала и т.д. Если мы
исключим повторения, то нужно просмотреть пять таких
путей.
[4,2,5,7,0,1,3,8,6] [4,2,5,0,7,1,3,8,61
[4,2,5,7,0,1,3,8,6] 14,2,5,7,8,1,3,0,6]
[4,2,5,7,0,1,3,8,6] [4,2,5,7,1,0,3,8,61
10,4,5,7,2,1,3,8,6] [7,4,5,0,2,1,3,8,61
[4,5,0,7,2,1,3,8,61 [4,5,1,7,2,0,3,8,6]
Помимо того, что поиск при исследовании большо-
го числа состояний оказывается довольно продолжи-
тельным, здесь возникает еще одна трудность, также
связанная с потерей времени. Генератор состояний, осу-
ществляющий перемещения, должен быть достаточно
“сообразительным”, чтобы избегать повторения ходов.
Если в данной области поиска нет ничего такого, что по-
могло бы быстро решить эту проблему, то остается только
путь сохранения списка всех просмотренных состояний.
Список нужно проверять всякий раз, когда программа со-
бирается сгенерировать следующий ход.
Итак, нам нужна помощь. Следующий шаг - использо-
вание эвристической информации. Вместо слепого пере-
мещения от одного состояния к другому мы теперь хотим
проранжировать все возможные ходы и выбрать тот, кото-
рый сочтем лучшим, обратимся к одной полезной эври-
стической функции, называемой расстоянием Хемминга.
Это расстояние между данным состоянием и нулевым. В
нашем случае оно измеряется числом квадратиков, нахо-
дящихся не на своих местах (пустая позиция не засчиты-
вается). Например, в следующей ситуации:
[4,0,5,7,2,1,3,8,61 положение в задаче
[3,4,8,7,1,5,0,2,61 положение цели
расстояние Хемминга равно семи. Если процедура поиска
сможет найти положение, где расстояние Хемминга равно
нулю, задача будет решена.
Одна из стратегий, которая представляется многообе-
щающей, заключается в том, что с помощью оценочной
функции вы выбираете наилучший ход и проверяете
тем же способом (используя оценочную функцию) все
его следствия, прежде чем предпримете какие-либо дру-
гие шаги. В случае тупика нужно возвратиться к бли-
жайшей развилке и попробовать сделать следующий
наилучший ход. Эта стратегия известна как метод овра-
78
гов, который является вариантом процедуры поиска в
глубину: сначала проверяются все следствия одного выбо-
ра на всю возможную глубину, и только потом происхо-
дит очередной выбор.
Метод оврагов хотя и интересен, мало поможет нам
при решении задачи “Восьмерка”. Почти неизбежно
программа будет попадать в локальные минимумы, на
“плато”, на “хребты”. Ситуации локальных минимумов
возникают, потому что программа может войти в со-
стояние, где ни один из доступных ходов не улучша-
ет ситуацию (по оценкам, возвращаемым эвристической
функцией). На плато все возможные шаги сохраняют то
же значение эвристической функции в конце передвиже-
ний, и эвристическая функция теряет направление вы-
бора. Хребет соответствует ситуации, когда программа
должна сделать ход, который временно ухудшает зна-
чения эвристической функции и только впоследствии
приводит к улучшению. Серьезный недостаток этой стра-
тегии заключается в ее “близорукости” - для совершения
выбора используется только локальная информация.
Существует другой вариант эвристического поиска,
объединяющего в себе позитивные черты поиска в глуби-
ну и в ширину. Он известен под названием Лучший пер-
вый шаг, и в целом дает хорошие результаты. На каждой
стадии поиска исследуется некоторое количество путей, и
оценочная функция вычисляется для конечного состоя-
ния этих путей. В Лучшем первом шаге поиск продол-
жается от конечного достигнутого состояния, имеющего
наилучшую оценочную функцию вверх до этого места. В
этой стратегии часто происходят прыжки от конца одного
пути к другому, пытаясь всегда работать с тем, что явля-
ется наиболее обещающим.
Для такого поиска требуется большая “бухгалтерия”,
так как все частичные пути должны постоянно поддержи-
ваться. Это очень эффективный метод, но длительное
время вычислений и большой объем учета вынуждают ча-
сто использовать более простую процедуру, которая быст-
ро проверяет много решений. Хорошая стратегия поиска
жестко зависит от проблемной области.
Эффективность эвристического поиска определяется
используемой оценочной функцией. Разработка опти-
мальной оценочной функции для задач типа “Восьмерка”
часто приводит к оптимальным результатам, но что каса-
ется данной конкретной задачи, то действительно наи-
лучшую оценочную функцию найти не так легко.
В принципе есть еще одна оценочная функция, доста-
79
точно простая, но требующая значительно больше време-
ни для вычислений. Она вычисляет для каждой фишки
расстояние от ее исходного положения до конечного, а по-
том суммирует эти расстояния. Последние вычисляются
по определенным правилам. Если фишка перемещается
вдоль верхней рамки, то число шагов равно числу затра-
гиваемых фишек плюс один. В том случае, когда фишка
перемещается от центра к периферии (или наоборот),
число шагов равно единице, если она находится в примы-
кающей позиции, и равно двум, - если в диагональной
позиции.
К сожалению, эвристический поиск может лишь уско-
рить решение задачи “Восьмерка”. Нет поискового мето-
да, быстро ведущего к прямому ответу. Это более сложная
проблема, чем могло показаться вначале, во всяком слу-
чае если применяется решение, основанное на поиске.
Очевидно, люди решают такие задачи по-другому.
Все усложненные поисковые стратегии управляются
эвристиками. Существуют некоторые более “хитрые”
стратегии, которые применительно к конкретным про-
блемным областям дают лучшие результаты, чем ис-
следованные нами типы поиска. Хороший обзор подоб-
ных стратегий дан в учебнике Elaine Rich, Artificial
Intelligence, McGraw-Hill, New York, 1983.
Столкнувшись с перечисленными выше трудностями,
читатель, вероятно, будет приятно поражен, обнаружив,
как много можно сделать, если полностью изменить на-
правление исследований. В следующем разделе мы попро-
буем заставить генератор перемещений производить
только разумные ходы и не будем рассматривать большие
разделы поискового пространства. Откажемся мы и от
оценочных функций и перейдем к проблеме построения
реальной экспертной системы.
3.3. ПОИСК С ЭВРИСТИЧЕСКИМИ ПРАВИЛАМИ:
ПОМОЩНИК СТУДЕНТА
33.1. КОНСТРУИРОВАНИЕ РАСПИСАНИЙ
С БОЛЬШИМ ПОИСКОВЫМ ПРОСТРАНСТВОМ
Мы хотим создать систему, позволяющую составить
оптимальное или близкое к нему расписание занятий для
студентов колледжа. Чтобы задача была выполнимой, ог-
раничимся составлением расписания занятий только по
курсу вычислительной техники.
Какое пространство поиска связано с этой задачей? Нас
интересуют расписание на следующий семестр для кон-
80
кретного студента. Если считать, что студент должен
пройти четыре курса, то пространство поиска будет опре-
деляться всеми возможными комбинациями курсов, орга-
низуемых учебным заведением, взятых по четыре за раз.
Для типичного колледжа среднего размера, предлагающе-
го единовременно 500 курсов, вероятное число расписа-
ний фактически составит 500 * 499 * 498 * 497.
Если бы мы применили подход перечисления и ранжи-
рования, принятый в программе химического синтеза, то
нам пришлось бы сгенерировать каждое возможное рас-
писание, оценить его по критерию числом и отсортиро-
вать ответы для нахождения наилучшего. Очевидно, что
это невозможно.
При использовании эвристической оценочной функции
для управления поиском, как в задаче “Восьмерка”, мы
должны были бы создать одно случайное расписание в ка-
честве отправной точки, а затем систематически вносить
и удалять из расписания курсы с целью тестирования и
улучшения функции, предназначенной для измерения
его качества.
Вы можете сказать: “На самом деле расписаний не так
много. Мы должны исключить курсы, которые студент
уже изучил. И так как он специализируется в какой-либо
области, имеет смысл рассмотреть лишь малую часть по-
искового пространства, соответствующего сфере его спе-
циализации”. Конечно, с одной стороны, вы правы, но с
другой - вы ограничили рамки поискового пространства с
помощью общего указания, т.е. эвристики.
Программа “Помощник студента” - настоящая экспер-
тная система, которая была бы очень полезной, если бы
широко применялась в учебных заведениях. Ее архитек-
тура проста. Она служит хорошим примером того, как не-
сложная стратегия поиска, усиленная встроенными в
правила эвристиками, дает прекрасное решение важной
задачи.
3.3.2. ЭВРИСТИКИ,
ОПРЕДЕЛЯЮЩИЕ ЗАДАЧУ
Допустим, мы хотим установить систему на какой-либо
компьютер. Студент, специализирующийся по компью-
терным дисциплинам, приходит в деканат факультета,
чтобы узнать, какие курсы ему предстоит пройти в сле-
дующем семестре, и отнимает минимум 15 мин у секре-
таря, который должен выполнить для него достаточно
81
рутинную работу. Вместо этого можно установить про-
грамму, дающую для него консультации. Терминал же
будет находиться в деканате.
Программа может выдавать следующую информацию:
общий план обучения и условия получения диплома
специалиста по вычислительной технике;
курсы, пройденные или пропущенные студентом.
Предварительная структура всех обязательных курсов.
Курсы, читаемые в данном семестре.
Для разработки такой программы необходимо сделать
некоторые предположения о том, как студент проходит
курсы обучения. Давайте учтем некоторые общие поло-
жения:
1. Каждый студент должен пройти за семестр четыре
курса.
2. Следует определить обязательные курсы для данной
специализации.
3. Желательно разрешить каждому студенту выбрать
для себя факультативные курсы.
4. Нужно включить в учебный план общеобразователь-
ные дисциплины.
5. Необходимо обеспечить в каждом семестре хотя бы
один факультативный курс.
Эти пять положений станут эвристиками, когда будут
включены в правила для составления хорошего расписа-
ния.
3.3.3. ДАННЫЕ ДЛЯ ПРОГРАММЫ - СПЕЦИФИКА КУРСОВ
Предположим, наша программа содержит набор общих
данных (в противовес данным для конкретного студента)
в виде четырех различных утверждений на языке Пролог.
Приведем набор фактов, определяющих обязательные
курсы:
req ("введение в вычисления").
req ("структуры данных").
req ("ассемблер").
req ("операционные системы").
ит. д.
Факультативные курсы определяются аналогичным об-
разом:
elec ("информатика").
elec ("трансляторы").
elec ("анализ алгоритмов").
ит.д.
82
Нам нужен хороший способ определения предвари-
тельных условий (т.е. уже пройденных курсов). Однако
мы должны установить только непосредственные предва-
рительные курсы. Простое правило, которое будет рас-
смотрено позднее, может определять также условия,
впоследствии подлежащие удалению. Формат непосредст-
венного предварительного условия:
impreq ("структуры данных", "введение в вычисления").
impreq ("мат. анализ 2","мат. анализ 1").
impreq ("операционные системы","ассемблер").
Читать это следует так: “Непосредственным предвари-
тельным условием для изучения операционных систем
является знание ассемблера”.
И, наконец, нам потребуется набор фактов, утвержда-
ющих, какие курсы из всего имеющегося каталога чита-
ются в данном семестре.
given-now ("введение в вычисления").
given-now ("мат. анализ 2").
ит. д.
Будем считать, что помимо этого массива общих дан-
ных в программе есть данные о курсах, пройденных конк-
ретным студентом, например такие правила:
waived ("введение в вычисления").
waived ("мат. анализ Г).
passed ("структуры данных").
passed ("ассемблер").
passed ("мат. анализ 2").
ит.д.
3.3.4. ПРОГРАММИРУЕМАЯ СТРАТЕГИЯ
ДЛЯ СОЗДАНИЯ ХОРОШИХ РАСПИСАНИЙ
Теперь создадим правило, позволяющее нам опреде-
лить, какие из обязательных и факультативных курсов
доступны студенту. Расписание можно построить в том
случае, если мы также будем учитывать порядок изуче-
ния курсов. Начнем с правила для обязательных курсов.
pos-req-course(X) if req(X)
and not (done-with (X)) and
given-now(X) and
have-preq-for(X).
Здесь утверждается, что X будет возможным обяза-
тельным курсом в расписании, если он является обяза-
83
тельным курсом, если студент его еще не прошел, если он
должен читаться в этом семестре и если студент сдал за-
четы по всем необходимым предварительным курсам.
Приведем правила, определяющие один курс, пройден-
ный студентом, а также все пройденные им курсы:
done-with(X) if waived (X).
done-with(X) if passed (X).
all-done-with(X) if Tindall(Y,done-with(Y),X).
Далее нам предстоит решить, можно ли перебрать все
предварительные курсы, необходимые для изучения обя-
зательного. Такое решение принимается в соответствии
со следующим правилом:
have-preq-for(X) if all_preq_for(X,Z) and
alf_done_with(Q) and
subset(Z,Q).
В списке утверждается, что студент прошел все предва-
рительные курсы в том случае, если все предварительные
для X курсы находятся в списке Z, а все курсы, пройден-
ные или пропущенные им, находятся в списке Q, и Z вхо-
дит в Q. Другими словами, Z есть подмножество Q.
Обратите внимание на то, как создается список, содер-
жащий все предварительные курсы для данного курса Y:
all-preq-for(Y.Z) if findall (X,preq(Y,X),Z).
preq(X,Y) if impreq (X,Y).
preq(X,Y) if impreq (X,Z) and preq(Z,Y).
В программе использованы два имени: непосредст-
венный предварительный курс (impreq) и более общий
предварительный курс (preq). Это предотвращает зацик-
ливание в дереве поиска. С подобным механизмом мы
уже встречались раньше.
Структура другого правила высокого уровня, которое
нам потребуется, сходна с правилом для возможного обя-
зательного курса. Правило для возможного факультатив-
ного курса выглядит так:
роз-elec-course (X) if elec (X) and
not(done_with(X)) and
given_now(X) and
have_preq_for (X).
Итак, все правила находятся на своих местах, и мы го-
товы создать для этой программы правило самого высоко-
84
го уровня, которое выберет вероятное расписание, исходя
из нашего аппарата возможных курсов более низкого
уровня. Однако возникает еще одна проблема. Нас инте-
ресует не просто возможное расписание, а наилучшее из
них. Не исключено, что затем нам захочется взглянуть на
следующее расписание, чтобы ознакомиться с имеющи-
мися альтернативами.
А что же эвристики? Мы их пока не использовали. В
этой программе эвристики принимают форму правил, оп-
ределяющих возможные расписания. Так как здесь будут
генерироваться только удовлетворяющие приведенным
выше правилам расписания, то можно отбросить большую
часть поискового пространства, которую пришлось бы
учитывать, если бы мы конструировали расписание более
случайным образом.
Стратегия эвристик обеспечивает простой способ вы-
явления наилучшего решения. Процедура основана на
внутреннем порядке использования правил в Прологе.
Первым помещается правило, определяющее наилучшее
расписание, вторым - для следующего по качеству распи-
сания и т.д. При генерации всех возможных расписаний
Пролог автоматически создает их, начиная с наилучшего
и кончая худшим.
Набор правил, выражающих возможные расписания,
имеет вид:
pos-schedule(A,B,C,"gen. elec.") if
pos-req-course (А), pos-req-course (В),
pos-req-course (C) ,ordered3 (A,B,C).
pos-schedule(A,B,C,"gen. elec.") if
pos-req-course (A), pos-req-course (B),
pos-elec-course (C) .ordered! (A,B).
pos-schedule(A,B,C,"gen. elec.") if
pos-req-course (A), pos-elec-course (B),
pos-elec-course (C) .ordered! (B,C).
pos-schedule(A,B,C,"gen. elec.") if
pos-elec-course (A), pos-elec-course (B),
pos-elec-course (C) ,ordered3 (A.B.C).
pos-schedule(A,B,"gen. elec.","gen. elec.") if
pos-req-course (A),pos-req-course (B), ordered! (A.B).
pos-schedule(A,B,"gen. elec.","gen. elec.") if
pos-req-course (A),pos-elec-course (B).
pos-schedule(A,B,"gen. elec.","gen. elec.") if
pos-elec-course (A),pos-elec-course (B), ordered! (A,B).
pos-schedule(A,"gen. elec.","gen. elec.","gen. elec.")
if pos-req-course (A).
pos-schedule(A,"gen. elec.","gen. elec.","gen. elec.")
if pos-elec-course (A)4.
pos-schedule("gen. elec.","gen. elec.",
“gen. elec.”,"gen. elec.").
85
Предикат, называемый unique, используется в этих
правилах для предотвращения повторения расписаний,
генерируемых на основе тех же предположений. Он выяв-
ляет повторение в списке одного и того же курса, а также
перестановки наборов одинаковых курсов. В этих прави-
лах переставляются только два члена, фраза А < В выпол-
няет то же самое.
Обратите внимание, что главной чертой данного ре-
шения является учет достаточно сложного набора пред-
положений о том, что студент будет делать в процессе
обучения посредством перечисления всех возможных
случаев. На основе этой информации производится эв-
ристический поиск в программе. Информация о пред-
почитаемое™ факультативных курсов учитывается с
помощью упорядочивания правил, а не рангового кри-
терия или оценочной функции.
Теперь у нас есть хороший механизм для консультации
по составлению расписания. Но осталась одна проблема,
связанная не со структурой нашей программы, а со специ-
фикой учебного заведения. Если “Помощник студента”
установлен на микрокомпьютере, находящемся в декана-
те, то программа не будет иметь доступа ко всем пройден-
ным студентом курсам.
Что можно сделать в такой ситуации? Студента можно
попросить ввести в компьютер курсы, но это весьма уто-
мительно. Конечно, технически несложно обеспечить
микрокомпьютеру доступ к главной базе данных коллед-
жа, откуда он сможет запрашивать информацию, однако
тогда программа значительно усложнится. Кроме того,
администраторы базы данных неохотно соглашаются на
столь свободное обращение к информации, за которую
они несут ответственность.
Наилучшим решением, вероятно, является другой путь
- задать студенту хорошо подобранные вопросы, позволя-
ющие установить его уровень. Вопросы должны требовать
ответа Да/Нет (одно нажатие клавиши). Этот способ ока-
жется эффективным, если вопросы будут задаваться на
основе внутренней модели курсов, которые студент (но-
вичок, второго года обучения и т.п.) уже прошел. Поэто-
му сначала нужно спрашивать о наивысшем возможном
курсе, пройденном студентом, так как положительный
ответ избавит от необходимости задавать вопросы по по-
воду остальных курсов.
Эффективные способы задания вопросов - тема (хотя и
86
неосновная) следующей главы. Мы сможем перейти к ее
обсуждению после нескольких последних заключитель-
ных замечаний.
33.5. ПРОГРАММИРОВАНИЕ БАЗ ЗНАНИЙ
Возможно, вы удивились, прочитав о способе создания
этой программы, и даже почувствовали себя одурачен-
ным. Я могу себе представить, как кто-то произнесет:
“Все, о чем здесь говорилось, уже давно описано со всеми
подробностями”. Это главная идея стиля программиро-
вания, ставшего традиционным для многих работ по
ИИ, - программирование баз знаний.
Суть его заключается в том, что вместо одного сложно-
го правила создайте набор простых правил по одному для
каждого случая. В частности, вместо сложного правила,
описывающего расписание с помощью взаимосвязанных
проверок, заданных в самом правиле, мы получили набор
более простых правил, выполняющих ту же задачу. Глав-
ная цель - уйти от сложного управления и прийти к слож-
ному или по крайней мере более разработанному и более
каталогизированному знанию. Это эмпирический факт,
что программа, написанная в таком стиле, имеет те же
функции, что и альтернативные варианты, но ее легче со-
здать, понять и модифицировать.
Упражнения
1. Напишите все правила трансформации, описывающие операции в за-
даче “Восьмерка”. Руководствуйтесь правилом, приведенным в этой
главе.
2. Напишите предикат для вычисления расстояния Хемминга между
двумя списками целых чисел. Первые два аргумента должны быть
списками, а третий - расстоянием.
3. Проанализируйте задачу “Пятерка”. Она меньше “Восьмерки”, но
построена по тем же правилам. Пять подвижных квадратиков разме-
щены на поле 2x3. Можете ли вы открыть еще какие-нибудь эври-
стики, которые допустимо использовать в данном случае?
Существует ли определенная стратегия, всегда гарантирующая ус-
пех?
4. Проанализируйте игру крестики-нолики на поле 4x4. Это - обычная
игра, использующая более широкую матрицу. Для выигрыша нужно
поставить подряд четыре знака. Какую хорошую эвристику можно
придумать для этой игры? Существуют ли какие-нибудь определен-
ные стратегии?
5. Напишите программу на Прологе для решения задачи “Восьмерка” с
помощью эвристики оврагов: используйте меру, определяющую ка-
чество каждой позиции, и заставьте программу по возможности уве-
личивать эту меру. После каждого хода печатайте конфигурацию
87
задачи и значение меры. Ваша программа иногда решает задачу? А
можете вы запрограммировать ее так, чтобы она всегда решала зада-
чу?
6. Какие изменения нужно внести в программу “Помощник студента*1,
чтобы курсы могли иметь альтернативные предварительные курсы?
7. Правила pos-schedule генерируют много перестановок одного расписа-
ния. Предикат unique предотвращает это явление. Изучите работу
unique в составе pos-schedule, а потом напишите его.
8. Создайте модуль, используемый совместно с программой “Помощник
студента*1 и эффективно задающий вопросы об изученных и сданных
студентом курсах.
9. Напишите маленькую экспертную систему, которая составляла бы оп-
тимальное меню для ресторана, используя как образец программу
“Помощник студента**.
4. УПРАВЛЕНИЕ СТРАТЕГИЕЙ ВЫВОДА
4.1. ПРЯМАЯ И ОБРАТНАЯ
ЦЕПОЧКИ РАССУЖДЕНИЙ
Разработка правил для экспертных систем базируется
на двух известных концепциях - прямой и обратной це-
почках рассуждений. Каждая концепция определяет
стратегию выбора в конкретных условиях. В данной главе
вы познакомитесь с этими концепциями, а также с такти-
кой задания вопросов интерактивными экспертными сис-
темами. Для имитации разумности поведения системы
очень важен способ получения информации. Довольно
просто создать программу на языке Пролог, которая будет
варьировать процесс опроса в зависимости от обстоя-
тельств. Ее вопросы всегда окажутся уместными; более
того, она может задавать минимально необходимое число
вопросов. Ниже мы рассмотрим, как заставить программу
вести себя таким образом.
В книгах по качественному анализу в химии (а также
при диагностике неисправностей в автомашине и даже в
медицинской литературе) часто приводятся списки вопро-
сов или тестов, позволяющих последовательно уточнять
задачу. Если такие структуры заложить в программу, ста-
нет ли она экспертной системой? По-видимому, нет, так
как это всего лишь дерево решений, “встроенное” в про-
грамму, а мы ожидаем от экспертных систем нечто боль-
шее. Однако здесь важен стиль вывода. О программах,
использующих такой метод, говорят, что они проводят
прямой вывод или прямую цепочку рассуждений. Суще-
ствует несколько крупномасштабных экспертных систем,
реализующих такую стратегию: XCON - система, помога-
ющая фирме Digital Equipment Corporation (DEC) подби-
рать для клиентов конфигурацию компьютеров VAX, и
DENDRAL - знаменитая система химического анализа.
Прямой вывод применим в тех ситуациях, когда число
потенциальных решений неуправляемо, а количество
блоков данных, определяющих начальное состояние про-
блемы, невелико. Например, имеется огромное число
способов сборки сложного компьютера из модульных ком-
понентов. Эта сложность возникает в связи с наличием
большого числа допустимых перестановок плат в гнездах.
При каждой перестановке возникают конкретные требо-
вания к соединительным кабелям. Мы привели пример
89
проблемы, имеющей большое пространство решений при
малом пространстве входных данных. Входные данные
представляют собой просто список компонентов, из кото-
рых надо собрать компьютер.
Проблема поиска структуры молекулы, по оценкам
списков на спектрограмме, также имеет большое про-
странство решений. Каждый пик соответствует характер-
ной группе атомов, присутствующей в молекуле, и
существует много способов перестановок групп, которые
будут давать одинаковые спектры. Входные данные вклю-
чают только список имеющихся пиков и их интенсив-
ность.
Стратегия прямого вывода должна на основе исполь-
зования данных и правил привести к правильному за-
ключению. Суть ее состоит в том, что задается
последовательность вопросов (или выполняется последо-
вательность проб), построенных таким образом, что
каждый из них позволяет отбросить большую группу по-
тенциальных ответов, благодаря чему значительно сужа-
ется пространство поиска. Так продолжается до тех пор,
пока не останется один определенный ответ. Если на каж-
дом шаге отбрасывается половина возможных ответов, то
прямой вывод по эффективности не уступает двоичному
поиску.
Другую модель использования свидетельств и заклю-
чений предлагает стратегия обратного вывода. В неко-
торых задачах имеется всего несколько решений при
наличии огромных объемов входной информации. В этом
случае целесообразно в каждый момент времени рассмат-
ривать только одно из возможных решений, а затем со-
брать и проверить все свидетельства, которые могут его
подтвердить или опровергнуть.
Наиболее известными экспертными системами с обрат-
ным выводом являются MYCIN, системы, сделанные на
его основе, и PROSPECTOR. MYCIN предназначена для
идентификации вируса, вызвавшего болезнь. Программы
этой группы обычно ограничиваются диагностикой болез-
ней отдельных систем организма (например, крови, серд-
ца, легких). Для каждой такой системы существует всего
несколько разновидностей вирусов, вызывающих конк-
ретную болезнь, поэтому здесь подходит обратный вывод.
PROSPECTOR использует сходную стратегию обратного
вывода. Рассматривая по очереди несколько внутренних
моделей рудных месторождений, система отыскивает мо-
дель, которой более всего соответствуют имеющиеся дан-
ные (или такой модели нет).
90
Многие люди обычно плохо воспринимают абстракт-
ные концепции, если они не проиллюстрированы хоро-
шим примером. Поэтому ниже мы решим задачу,
используя сначала обратный вывод, а затем прямой.
Объектом нашего исследования будет простая программа
“Птица, зверь или рыба”, которая обязана своим назва-
нием популярной игре.
В этом гипотетическом примере как пространство
входных данных, так и пространство возможных решений
невелики. Следовательно, можно создать две версии про-
граммы, каждая из которых реализует одну стратегию
вывода.
Программы такого типа имеют свою историю в области
искусственного интеллекта. Наша версия соответствует
структуре программы “Animals” (животные), описанной
в руководстве Borland Turbo Prolog Manual (Borland
International, Turbo Prolog - Owner’s Handbook, pp. 109-
112, Scotts Valley, Calif., 1986). Она представляет собой
адаптацию программы с тем же названием, написанной
на языке Лисп и изложенной в популярном учебнике по
искусственному интеллекту (Patrick Henry Winston,
Artificial Intelligence, pp. 144-147, Addison-Wesley,
Reading Mass.).
Начнем обсуждение с версии программы, использую-
щей обратный вывод, так как она ближе к встроенному в
Пролог механизму вывода.
4.2. ПРОГРАММА КЛАССИФИКАЦИИ С ОБРАТНОЙ
ЦЕПОЧКОЙ РАССУЖДЕНИЙ
4.2.1. “ПТИЦА, ЗВЕРЬ ИЛИ РЫБА**: ВЕРСИЯ 1
“Птица, зверь или рыба” (ПЗР) - это написанная на
языке Пролог простая программа - игра-загадка. Заду-
майте конкретное животное. Система попытается угадать
его, задавая вам вопросы, чтобы получить недостающую
информацию. Ниже приводится типичный диалог:
Вопрос Ответ
У него есть волосы? Нет
Оно дает молоко? Нет
У него есть перья? Нет
У него есть клыки? Нет
Оно ест мясо? Да
Оно плавает? Да
У него есть щупальца? Да
Задуманное вами животное — осьминог!
91
Программа ПЗР ведет четкий и разумный диалог, за-
прашивая у пользователя необходимую информацию, ко-
торой она еще не располагает. Такой режим
вопросов-ответов очень важен, но иногда трудно реализу-
ем. Его весьма сложно запрограммировать на каком-ли-
бо языке, отличном от Пролога, Лиспа или оболочки
экспертных систем.
В программе такого типа используется мало категорий;
система извлекает информацию, чтобы узнать, к какой из
категорий принадлежит задуманное животное. Существу-
ет много приложений подобного рода. К ним относятся
классификационные экспертные системы. Аналогичный
описанному выше диалог точно так же мог происходить с
врачом, пытающимся установить заболевание, или с на-
ладчиком аппаратуры, определяющим причину, по кото-
рой перестал работать ваш компьютер.
Структуру программы ПЗР, использующую обратную
цепочку рассуждений, можно рассматривать и как про-
дукционную модель вывода, и как модель логического
программирования. Она обладает характеристиками обе-
их моделей, что станет вам ясно после того, как вы по-
смотрите программу.
Структура версии с обратной цепочкой рассуждений
проектируется с помощью введения группы правил высо-
кого уровня. Каждое такое правило описывает одно живо-
тное, четко указывая, какая именно информация нужна
системе, чтобы прийти к выводу, что именно данное кон-
кретное животное является искомым ответом. Напри-
мер:
identify (octopus) if
not (it_is (mammal)) and
it_is (carnivorous) and
confirm (does,swim),
confirm (has,tentacles)
Сходные правила имеются для всех животных, которые
предстоит классифицировать программе.
Предикаты с правой стороны правил is_animal всегда
специфицируются другими правилами, помимо тех слу-
чаев, когда предикат просто проверяет, находится ли оп-
ределенная информация в базе данных. Информация,
вводимая в базу данных, извлекается из ответов пользо-
вателя на задаваемые вопросы. Все ответы сохраняются,
так как они могут потребоваться позднее.
Правила, проверяющие, находится ли в базе данных
определенная информация, состоят из двух частей. Пер-
вая часть обеспечивает просмотр базы данных, причем от-
92
вет может быть найден сразу. Во второй части находятся
запрос пользователю и запись его ответа в базу дан-
ных.
Свою работу программа начинает с использования ве-
дущего правила, называемого guess_animal:
guess_animal if identify (X),
write ("Задуманное вами животное — “,X),nl,!.
Далее система пытается по очереди установить истин-
ность или ложность каждого из правил высокого уровня,
т.е. найти кандидата, которого она сможет проверить на
соответствие предикату identify. Как и характерно для
Пролога, установление статуса правила высокого уровня
влечет за собой проверку всего дерева подчиненных фак-
тов и свидетельств, которые должны быть истинными,
чтобы подтвердить основное заключение. По мере про-
движения вниз по дереву программа соответственно ситу-
ации задает нужные вопросы в нужное время для
получения недостающей информации, поэтому ее поведе-
ние кажется разумным.
В программе ПЗР (версия 1) правила просто применя-
ются одно за другим, начиная с вершины дерева. В про-
цессе такого сканирования ответ, безусловно, будет
найден, если только правило для идентификации заду-
манного животного существует.
Линейное сканирование списка правил делает эту сис-
тему похожей на продукционную, а дерево подчиненных
свидетельств, которое должно быть создано для использо-
вания одного правила, - на логическую программную сис-
тему.
Если располагать правила по-разному, то будут проис-
ходить различные диалоги, причем одни из них могут
быть длиннее, другие короче. Однако программа всегда
извлекает пользу из всей поступившей информации и,
безусловно, ведет себя не хуже, чем человек, выполняю-
щий такое же задание.
В этой архитектуре есть еще одно интересное место.
Важен порядок правил identify. Если речь идет о части
настоящей экспертной системы, которая запускается мно-
гократно, и если животное X - наиболее подходящий от-
вет, а животное Y - следующий по приоритету, то
правило для определения животного X должно находить-
ся в программе первым, а правило для определения живо-
тного Y - за ним. Это позволяет минимизировать
93
количество задаваемых вопросов при использовании об-
ратной цепочки рассуждений.
4.2.2. КАК РАБОТАЕТ ПРОГРАММА?
Рассмотрим теперь правила высокого уровня, описыва-
ющие свидетельства в пользу конкретного животного.
Между прочим, все аргументы любого правила системы
описаны как symbol в domain, поэтому мы не приводим
предикат и описание типа.
identify (giraffe) if
it_is (ungulate) and
confirm (has,long_neck) and
confirm (has,long_legs) and
confirm (has,dark-spots)
identify (zebra) if
itjs(ungulate) and
confirm (has,black_stripes),!.
identify (cheetah) if
it_is (mammal),
it-is (carnivorous),
confirm (has,tawny_color),
confirm (has,black_spots) ,!.
identify (tiger) if
it_is (mammal) and
it_is (carnivorous) and
confirm (has, tawny_color) and
confirm (has,black-Stripes)
identify (eagle) if
it_is (bird) and
confirm (does,fly) and
it_is(carnivorous) and
confirm (has,use_as_national_symbol),!.
identify (ostrich) if
it_is (bird) and
not (confirm (does,fly)) and
confirm (has,long-neck) and
confirm (has,longjegs)
identify (penguin) if
it_is (bird) and
not (confirm (does,fly)) and
confirm (does,swim) and
confirm (has,black_and_white_color),!.
identify(blue_whale) if
it_is (mammal) and
not(it_is(carnivorous)) and
confirm (does,swim) and
confirm (has,huge_size),!.
identify (octopus) if
not(itjs(mammal)) and
it-is (carnivorous) and
confirm (does,swim),
confirm (has,tentacles),!.
identify (sardine) if
94
it_is(fish) and
confirm (has,small_size) and
confirm (has,use_in_sandwiches),!.
/* Если ответ не получен, то срабатывает это пра-
вило. */
identify (unknown).
Все правила поддерживаются на следующем, более
низком уровне некоторыми соподчиненными правилами
классификации животных:
itjs(bird) if
not (it_is (mammal)),
confirm (has,feathers),
confirm (does,lay_eggs),!.
itjs(fish) if
confirm (does,swim),
confirm (has,fins)
it_is (mammal) if
confirm (has,hair),!.
it-is (mammal) if
confirm (does,give_milk),!.
it_is(ungulate) if
itjs (mammal),
confirm (has,hooves),
confirm (does,chew.cud),!.
it_is (carnivorous) if
confirm (has,pointed_teeth),!.
it_is (carnivorous) if
confirm (does,eat_meat),!.
В данной версии ПЗР, как и в версии с прямой цепоч-
кой рассуждений, которую мы рассмотрим далее, боль-
шая часть работы совершается правилами confirm и
denied. Они используются для проверки конкретных ат-
рибутов животных, которые могут быть обнаружены в
процессе диалога и записаны в базу данных. Здесь задей-
ствован механизм вопросов-ответов, поэтому нам необхо-
димо подробно рассмотреть эти правила. Ниже следует
соответствующая часть программы.
database
db_confirm (symbol .symbol)
db_denied (symbol,symbol)
clauses
confirm(X,Y) if db_confirm(X,Y),!.
confirm(X,Y) if not (denied (X,Y)),! and check_if(X,Y).
denied(X,Y) if db_denied(X,Y),!.
checkJf(X,Y):-
write(X," it “,Y,"\n"),
readln (Reply),
remember (X,Y,Reply).
remember(X,Y,yes)
asserta (db_confirm (X,Y)).
95
remember(X,Y,no)
asserta (db_denied (X,Y)) ,
fail.
Прежде всего необходимо иметь факты, называемые
db_confirm и db.denied, которые становятся реальной
формой ответно-вопросной информации, когда они посту-
пают в базу данных. Это обусловлено тем, что в Турбо
Прологе допустимо помещать в базу данных в процессе
выполнения программы только те предложения, которые
представлены простыми фактами. Турбо Пролог позволя-
ет оптимизировать по скорости выполнения многие дейст-
вия, чему мы и находим здесь подтверждение. Предикаты
confirm и denied не могут использоваться для этой цели,
потому что есть правила, связанные с ними.
Обратите внимание на правила для confirm - их два.
Когда механизм вывода доходит до места, где требуется
узнать, был ли установлен некоторый атрибут животного,
он использует эти правила. Первое из них заставляет сис-
тему непосредственно просмотреть информацию, уже
включенную в базу данных. Если атрибут в ней найден,
процесс заканчивается. Второе правило инициирует по-
иск отрицания того, что мы пытаемся установить, и если
его также нет в базе данных, то вызывается правило
check_if. К этому моменту система определила, что не
располагает нужной информацией, поэтому она вынуж-
дена задать вопрос пользователю. Любой полученный
ответ запоминается с целью непосредственного или по-
следующего применения.
Теперь разберем структуру вопросов, порождаемых
правилом check_if:
has it wings Есть ли у него крылья
has it teeth Есть ли у него зубы
does it bite Кусается ли оно
does it shed_skin Сбрасывает ли оно кожу
Все, что программа помещает в базу данных, всегда
имеет вид пары, состоящей из глагола и атрибута, напри-
мер:
db.confirm (has,wings).
Так как программа хранит данные в таком виде, легко
создать грамматически правильное предложение для
предъявления его пользователю, просто поставив слово
“оно” между глаголом и атрибутом. Структуру подобного
типа можно увидеть и в правиле check_if.
Пользователь, вероятно, введет слова “да” или “нет" в
ответ на запрос, а запоминающее правило введет инфор-
96
мацию в базу данных посредством одного из двух преди-
катов:
db_confirm (verb,attribute)
db_denled (verb,attribute)
Поэтому если вы захотите перезапустить ПЗР (в такой
форме), то нужно сначала очистить базу данных от отве-
тов на вопросы, заданных при ведении последнего диало-
га. Они продолжают находиться в базе данных и будут
влиять на следующие результаты, если их не удалить или
не перезапустить программу.
Программа ПЗР производит выбор среди множества ги-
потез. Сначала каждое животное должно рассматриваться
как отдельная гипотеза. В любой момент времени про-
грамма работает только с одной гипотезой. Прежде чем
перейти к следующей гипотезе, она полностью подтверж-
дает или опровергает предыдущую и, естественно, никог-
да не возвращается к тому месту, где уже была.
В более сложных экспертных системах часто требуется
одновременно рассматривать все гипотезы. В этом случае
можно ввести, в некотором смысле, меру вероятности
каждой гипотезы. Выполнив необходимые оценки, про-
грамма примет ту гипотезу, которая имеет наибольшую
вероятность (см. гл. 5).
В следующем разделе вы познакомитесь с другой вер-
сией этой программы, которая с точки зрения пользовате-
ля подобна рассмотренной, но имеет иную внутреннюю
организацию.
4.3. ПРОГРАММА КЛАССИФИКАЦИИ С ПРЯМОЙ
ЦЕПОЧКОЙ РАССУЖДЕНИЯ
4.3.1. “ПТИЦА, ЗВЕРЬ ИЛИ РЫБА”: ВЕРСИЯ 2
Эта программа “играет” в ту же игру, что и предыду-
щая версия, но правила верхнего уровня здесь использу-
ются по-другому. Механизмы же задания вопросов
низкого уровня в обеих версиях ПЗР используются одни и
те же.
Версия 2 была спроектирована после тщательного изу-
чения возможных ответов и проработки последователь-
ности проверок. (Всякий раз после очередной проверки
оставшееся пространство вопросов делится приблизи-
тельно на равные части.) Суть метода прямой цепочки
рассуждений заключается в изобретении вопросов, позво-
ляющих на каждом шаге отбросить большое количест-
во возможных ответов, так что правильный ответ может
быть установлен быстро. Обратите внимание на то, что
4—751 п7
задаваемые при каждой проверке вопросы целиком зави-
сят от возможных ответов. Различные ответы (т.е. если
бы были задуманы разные животные) подразумевают не-
обходимость использования разных проверок.
На рис. 4.1 изображена блок-схема, поясняющая алго-
ритм работы программы. Заметьте, что эта версия ни в
коем случае не длиннее продукционной системы.
4.3.2. КАК РАБОТАЕТ ПРОГРАММА?
Изучение блок-схемы версии ПЗР с прямой цепочкой
рассуждений показывает, что вне зависимости от выбран-
ного маршрута поиска требуется не более четырех прове-
рок (а иногда достаточно и трех). Это отражено в
структуре основных правил:
guess_animal if find_animal,have_found(X),
write (’’Задуманное вами животное — “,X),nl,!.
find_animal
if testl (X) ,test2(X,Y) ,test3(X,Y,Z) ,test4(X,Y,Z,_),!.
find_animal.
В программе предусмотрены четыре правила проверки:
testl (X)
test2(X,Y)
test3(X,Y,Z)
test4(X,Y,Z,W)
Они должны охватить все, что может выясниться соот-
ветственно при первой, второй, третьей и четвертой про-
верках. Например, третья проверка управляет всем, что
происходит в прямоугольниках решений, расположенных
на блок-схеме (см. рис. 4.1) на глубине в три шага. test3
представляет собой правило с несколькими предложения-
ми. В зависимости от того, какое из предложений задейст-
вовано, могут быть заданы следующие вопросы:
Live on land? Живет на земле?
Has stripes? Имеет полосы?
Has tentacles? Имеет щупальца?
Does it fly? Летает?
Структура аргументов этих правил может показаться
необычной. По мере углубления проверки требуется все
больше аргументов для учета результатов предыдущих
проверок.
Правила проверки предполагают перечисление всех
возможностей. Различные комбинации аргументов в за-
действованном правиле отражают всю историю вывода до
98
указанного места. Например, testl может успешно завер-
шиться одним из двух способов:
testl (т) животное — млекопитающее
testl (а) животное — не млекопитающее
Рис. 4.1. Блок-схема программы
“Птица, зверь или рыба”: версия 2
ПЗР — программа классификации. Прямая цепочка рассуждении обес-
печивает серию двоичных выборов, что позволяет отбрасывать поло-
вину оставшихся возможностей (или почти половину) до тех пор,
пока не останется одна-единственная
99
Каковы возможные значения аргументов для правила
test2? Если оно завершилось успешно, появляются четыре
вероятных комбинации:
test! (ш,с) млекопитающее и плотоядное
test2(m,n) млекопитающее и не плотоядное
test!(n,w) не млекопитающее и плавает
test!(п,п) не млекопитающее и не плавает
Для проверок третьего уровня имеется еще больше воз-
можностей. Нам потребуется задать определяющее пра-
вило для каждого маршрута из прямоугольника решений
третьего уровня (на блок-схеме рис. 4.1):
test3(m,c,s) млекопитающее, плотоядное, с полосами
test3(m,c,n) млекопитающее, плотоядное, без полос
test3(m,n,l) млекопитающее, не плотоядное, живет на суше
test3(m,n,n) млекопитающее, не плотоядное, не живет на суше
test3(n,w,t) не млекопитающее, плавает, имеет щупальца
test3(n,w,n) не млекопитающее, плавает, не имеет щупалец
test3(n,n,f) не млекопитающее, не плавает, летает
test3(n,n,n) не млекопитающее, не плавает, не летает
Для test4 имеется меньшее число возможных значений
установок для аргумента, поскольку лишь в двух случаях
требуется более трех проверок: когда test3 успешно завер-
шается как test3(m,n,l) или как test3(n,w,n). Во всех ос-
тальных случаях животное уже идентифицировано.
test4(m,n,l,s)
млекопитающее, неплотоядное, с полосами, живет на суше
test4(m,n,l,n)
млекопитающее, неплотоядное, без полос, живет на суше
test4(n,w,n,f)
не млекопитающее, плавает, без щупалец, имеет крылья
test4(n,w,n,n)
не млекопитающее, плавает, без щупалец, без крыльев
Ниже приводится полная структура тестовых правил,
имеющихся во второй версии ПЗР.
testl(m) if itjs(mammal),!.
testl(n).
test2(m,c) if itjs(carnivorous),!.
test2(m,n).
test2(n,w) if confirm (does,swim),!.
test2(n,n).
test3(m,c,s) if confirm (has,stripes),
asserta (haveJound (tiger)) ,!.
test3(m,c,n) if asserta(haveJound(cheetah)).
test3(m,n,l) if not (confirm (does,swim)),
100
not (confirm (does, fly)),!.
test3(m,n,n) if asserta (have_found(blue_whale)).
test3(n,n,f) if confirm (does,fly),
asserta (have_found (eagle)),!.
test3(n,n,n) if asserta (have_found (ostrich)).
test3(n,w,t) if confirm (has, tentacles),
asserta (have_found (octopus)),!.
test3(n,w,n).
test4(m,n,l,s) if confirm (has,stripes),
asserta (have_found (zebra)),!.
test4(m,n,l,n) if asserta(have_found(giraffe)).
test4(n,w,n,f) if confirm (has,feathers),
asserta (have_found (penguin)),!.
test4(n,w,n,n) if asserta(have_found(sardine)).
Обратите внимание на то, что все проверки произво-
дятся посредством одних и тех же предикатов низкого
уровня (it_is, confirm и т.п.), которые уже применялись
ранее. Как возникает окончательный ответ? Когда при
поиске по какому-либо маршруту достигается основание
дерева решений, факт, идентифицирующий животное,
помещается в базу данных. Например, посмотрите на по-
следний предикат правила, определяющего test3(m,c,s).
Мы провели достаточное количество проверок, чтобы уз-
нать, что искомое животное - тигр. Позднее помещенный
в базу данных этот факт будет использован в качестве
ответа.
Взгляните на правило find_animal. Оно требует вы-
полнения всех четырех проверок, хотя, как видно из
блок-схемы, иногда достаточно только трех. Что здесь
происходит? Тщательное исследование показывает, что в
некоторых случаях основание дерева решений достигает-
ся на уровне test3, и в базу данных помещается ответ.
Однако правило find_animal, продолжая свою “работу”,
попытается удовлетворить test4, что невозможно. Это
не имеет большого значения, так как мы уже поме-
стили ответ в такое место, откуда сможем его получить
(в базу данных). Система возвращается назад и успешно
выполняет второе предложение правила find_animal, так
что процесс продолжается. Затем другие части правила
guess_rule обеспечат распечатку ответа.
4.4. СРАВНЕНИЕ ДВУХ ГЛАВНЫХ
СТРАТЕГИЙ ВЫВОДА
Программный код, используемый для структуры обрат-
ной цепочки рассуждений, выполнен по принципу “свер-
ху-вниз”, или “от цели”. Это связано с тем, что именно
цель определяет структуру правила высшего уровня. Точ-
но так же можно объяснить и принцип “сверху-вниз” - в
101
проекте прежде всего нужно сосредоточиться |на том, чего
мы хотим достичь, т.е. сформулировать цели, и уже затем
представить их в виде иерархии оолее простых задач.
Прямая цепочка рассуждений иногда называется рас-
суждением “снизу-вверх” или “от данных”. Она предус-
матривает работу непосредственно с данными, а не с
какой-либо целью или гипотезой высокого уровня.
Проведение опроса в обеих стратегиях является обос-
нованным. В прямой цепочке рассуждений делается по-
пытка свести к минимуму исследование нерелевантных
возможных решений, из-за чего общее число задаваемых
вопросов иногда оказывается меньшим. Однако вопросы
могут показаться пользователю необычными,* так как их
планировали, имея в виду определенные ключевые про-
верки. Пользователь может сразу не понять, почему ком-
пьютер задает именно эти вопросы. При использовании
же обратной цепочки рассуждений общее число вопросов
может быть больше, но так как все они ориентированы на
концепцию высокого уровня, которую проверяет система,
лежащая в их основе модель выглядит более понят-
ной.
Итак, какую же цепочку рассуждений предпочтитель-
нее применять: прямую или обратную? Обычно, выбора у
вас нет. Задача сама указывает нужный способ рассужде-
ний, и только один подход оказывается реализуемым.
Если предполагается небольшое число возможных аль-
тернатив, то лучшие результаты даст использование об-
ратной цепочки рассуждений. Задача, включающая
неизменную последовательность шагов, на каждом из ко-
торых возникает много возможностей, всегда решается с
помощью прямой цепочки рассуждений.
Однако в тех случаях, когда можно выбрать способ рас-
суждения, автор предпочитает стратегию обратной це-
почки по следующим трем причинам:
1. Программный код, написанный с использованием
обратной цепочки рассуждений, более ясный. Все правила
программы ПЗР версии 1 хорошо читаются. Они соответ-
ствуют интуитивному представлению человека о том, как
нужно описывать предметы, являющиеся частью какой-
либо иерархии. Описание выполняется по принципу
“сверху вниз”.
2. Этот программный код легче модифицировать и рас-
ширять. Для того чтобы добавить в структуру еще одно
животное, его достаточно просто определить. При исполь-
зовании же прямой цепочки рассуждений это не оче-
видно. При необходимости нескольких добавлений
приходится переделывать все правила, чтобы поддержать
прежний уровень эффективности проверок.
102
3. Встроенный механизм вывода языка Пролог также
использует обратный вывод, поэтому программный код,
написанный с использованием обратной цепочки рассуж-
дений, легче развивать.
Упражнения
1. Укажите, что может потребоваться для добавления следующих
двух животных в обе версии ПЗР:
Верблюд, парнокопытное, с горбом
Единорог, парнокопытное, с одним рогом
2. Изучив листинги программы ПЗР, вычислите среднее число воп-
росов, задаваемых в обеих версиях для определения животного.
3. Напишите вариант ПЗР (версия 2), где результаты последователь-
ности проверок помещаются в базу данных, а не передаются с по-
мощью аргументов.
4. Найдите набор правил (в руководствах и учебниках по вождению
и эксплуатации автомобилей), описывающих, что нужно сделать, ес-
ли не заводится автомобиль. Организуйте правила в систему с обрат-
ной цепочкбй рассуждений, как в структуре ПЗР, версия 1.
5. Организуйте правила, указанные в упражнении 4, в структуру с
прямой цепочкой рассуждений, как в структуре ПЗР, версия 2.
5. ЭКСПЕРТНЫЕ СИСТЕМЫ И ВЫВОД
В УСЛОВИЯХ НЕОПРЕДЕЛЕННОСТИ
5.1. БОЛЕЕ СЛОЖНЫЕ СИСТЕМЫ ВЫВОДА
5.1.1. ОЦЕНКА ВЕРОЯТНОСТИ
ПРИ ИСПОЛЬЗОВАНИИ НЕСКОЛЬКИХ ПОСЫЛОК
В жизни часто приходится оценивать гипотезы, для ко-
торых имеется неполная или недостаточная информация.
Иногда бывает трудно сделать точные оценки, но, несмот-
ря на неопределенность, мы принимаем разумные реше-
ния. Чтобы экспертные системы были полезными, они
также должны уметь это делать. В настоящей главе будут
рассмотрены различные методы управления процессом
вывода в экспертных системах, когда неопределенность
является неотъемлемой частью задачи.
Классической иллюстрацией при обсуждении данной
проблемы может служить медицинская диагностика.
Всегда существуют некоторые сомнения в четкости про-
явления симптомов того или иного заболевания. Сомне-
ние в наличии у пациента конкретного заболевания
сохраняется даже в том случае, когда все его симптомы
отчетливо выражены. Рассуждения, основанные на неоп-
ределенности, используются во всех системах медицин-
ской диагностики и консультаций по способам лечения.
Причина, очевидно, заключается в том, что если врач
воздержится от какого-либо лечения до тех пор, пока
симптомы не станут абсолютно ясными, то, возможно, па-
циента уже будет поздно лечить.
Рассуждения в условиях неопределенности имеют мес-
то и в системах наблюдения при наличии одновременно
нескольких конкурирующих гипотез и их постоянной пе-
реоценке по мере поступления новых данных. В конечном
счете выделяется одна гипотеза, которая позволяет сде-
лать соответствующий вывод. По такому принципу рабо-
тает программа PROSPECTOR, применяемая при поиске
рудных месторождений.
Системы распознавания речи также используют этот
метод. Распознавание речи - очень сложная задача, по-
этому в ней должны присутствовать конкурирующие ги-
потезы, например, о том, какое конкретное слово
употребляется в предложении. На основе имеющихся ги-
ки
потез с помощью различных источников неполной инфор-
мации делается опосредованный вывод.
Кроме того, многие программы, использующие эври-
стики, должны рассуждать в условиях неопределенности,
поскольку эвристика - приближенный метод, указываю-
щий направление поиска. Если существует только одна
применимая эвристика, то проблем нет. Но что делать,
если два эвристических метода ориентируют программу в
двух разных направлениях? А когда две эвристики указы-
вают одно и то же направление поиска, должно ли это
вызывать большее доверие, чем если бы была только одна
из них?
Существуют четыре важные проблемы, которые необ-
ходимо обсудить применительно к понятию неопределен-
ности в автоматических системах вывода:
1. Как количественно выразить степень определенно-
сти при установлении истинности (или ложности) некото-
рой части данных?
2. Как выразить степень поддержки заключения конк-
ретной посылкой?
3. Как использовать совместно две (или более) посыл-
ки, независимо влияющие на заключение?
4. Как быть в ситуации, когда нужно обсудить цепочку
вывода для подтверждения заключения в условиях неоп-
ределенности?
Прежде всего мы изучим возможности использования
понятий теории вероятностей при выводе в условиях не-
определенности. Of 4чно это бывает сделать довольно
трудно, поэтому нам придется приближаться к точной
формулировке различными путями и объяснять стратегии
решений, наиболее часто применяемые в экспертных сис-
темах. Наконец, мы продемонстрируем программу, иллю-
стрирующую практические последствия анализа.
5.1.2. УСЛОВНАЯ ВЕРОЯТНОСТЬ
Во всех рассуждениях в условиях неопределенности ис-
пользуются четыре основных правила, и наша первая за-
дача - сделать эти правила правдоподобными.
Для начала выясним, что же представляет собой услов-
ная вероятность. Проведем простой эксперимент, на кото-
рый будем впоследствии часто ссылаться, поясняя суть
различных концепций. Предположим, у нас есть большой
мешок с шариками для пинг-понга. Часть шариков поме-
чена буквой А или В либо двумя буквами А и В, а осталь-
ные меток не имеют.
105
Суть заключается в следующем. Мы можем вычислить
распределение шариков с разными метками. Представьте
себе, что из мешка непрерывно вынимают по одному ша-
рику и подсчитывают число шариков, помеченных буквой
А, вне зависимости от того, есть ли на них еще и буква В.
Шарик возвращают в мешок, содержимое которого затем
тщательно перемешивается. Вероятность обнаружения
буквы А на вынутом шарике можно получить с помощью
вычислений на основе результатов подсчета в процессе
эксперимента:
(число вынутых шариков с меткой а)
(общее число вынутых шариков)
Подобным образом вычислить и вероятность извлече-
ния шарика с меткой В.
Условная вероятность определяется по результатам не-
сколько более сложного счетного эксперимента. Допу-
стим, вы снова вынимаете шарики, подсчитывая при этом
общее число вынутых шариков, число шариков с меткой
А вне зависимости от наличия метки В и число шариков,
помеченных одновременно буквами А и В.
Вероятность извлечения шариков, имеющих обе мет-
ки, вычисляется по формуле
(число вынутых шариков с метками А и в)
Р (общее число вынутых шариков)
Теперь мы готовы дать основное определение условной
вероятности. Итак, вероятность наличия А, если есть В:
р(А1В)
(число вынутых шариков с метками А и в)
(число вынутых шариков с меткой в)
На самом деле мы ищем подмножество шариков с мет-
кой В и уже в нем подсчитываем все шарики с меткой А.
Затем находим частное от деления этих двух величин, ко-
торое и представляет собой вероятность А при условии В.
Проведя замены в указанной выше формуле, можно
записать результат по-другому:
р(А1В)-р(А и В)/р(В).
Обратите внимание на полученный результат: это - ос-
новная формула условной вероятности.
Если бы мы провели другой эксперимент, отслеживая
106
все шарики с меткой А, после чего выбрали бы среди них
имеющие также и метку В, то получили бы следующую
формулу:
р(В1А)-р(АиВ)/р(А).
Простое алгебраическое преобразование приводит нас
к следующему важному выводу. Если для каждой форму-
лы вычислить величину р(А и В) и приравнять результа-
ты, то получится
р(А) * p(BI А)-р(В) * р(А1В).
Эта формула известна как правило Байеса. Иными
словами, любые три из четырех основных счетных экспе-
риментов, которые можно провести над шариками с мет-
ками, являются достаточными для получения общей
картины, поскольку результат четвертого эксперимента
выводится из трех остальных с помощью правила Байеса.
Следующее правило, которое нам предстоит вывести, -
это правило И/ИЛИ. Оно связывает вероятность извлече-
ния шарика, помеченного обеими буквами, с вероятно-
стью извлечения шарика, помеченного только буквой А
или только буквой В. Для получения такого результата
нужно подробнее описать множество шариков в мешке.
Предположим, что, просмотрев все содержимое мешка,
мы подсчитали число шариков каждой категории:
а " общее число шариков;
nl - число шариков только с меткой А;
п2 - число шариков только с меткой В;
пЗ - число шариков с обеими метками (А и В);
п4 - число шариков без меток.
Попытаемся рассчитать вероятность извлечения шари-
ка с меткой А, с меткой В или с обеими метками, т.е.
отношение шариков с любой меткой к общему числу ша-
риков:
р(А или В) - (п 14- п2 4 пЗ)/п
Далее добавим и вычтем справа одну и ту же величину.
Равенство сохранится. Теперь перегруппируем его со-
ставляющие:
р(АилиВ) - (nl + пЗ+ п2)/п+ (пЗ)/п — (пЗ)/п;
р(АилиВ) - (nl + пЗ)/п+ (п2+ пЗ)/п—(пЗ)/п;
р(А или В) - р(А) + р(В) — р(А и В).
107
Последняя формула и является правилом И/ИЛИ.
Еще одно правило, с которым мы хотим вас познако-
мить, называется “правилом композиции”. В нем утверж-
дается, что вероятность извлечения шарика с меткой А
есть среднее взвешенное двух других вероятностей: веро-
ятности, что шарик с меткой В будет также иметь и метку
А, и вероятности, что шарик без метки В будет иметь мет-
ку А.
Ясно, что вероятность извлечения шарика А описыва-
ется формулой
р(А) - (пЗ +nl)/n-(пЗ)/п+ (п1)/п.
Заменив в правой части обычные числовые величины
на вероятностные, мы сможем записать
р(А) -р(АиВ) +р(Аи (не В)).
Теперь заменим все правила правой части на принятые
в определении условной вероятности и получим следую-
щий результат:
р(А) -р(А IB) ♦р(В) + р(А 1неВ)* р(неВ).
Это и есть правило композиции. Аналогичный резуль-
тат получается для р(В).
Все четыре правила легко запомнить, если хорошо уяс-
нить лежащий в их основе эксперимент, следствием кото-
рого они являются.
5.2. ТОЧНОЕ ВЕРОЯТНОСТНОЕ
РАССУЖДЕНИЕ
5.2.1. КАК МОЖЕТ БЫТЬ ТОЧНЫМ ТО,
ЧТО ЯВЛЯЕТСЯ НЕОПРЕДЕЛЕННЫМ?
Заголовок этого раздела может показаться на первый
взгляд странным. Но мы имеем в виду следующее. В ситу-
ации неопределенности, когда отдельным посылкам при-
сваиваются вероятностные значения, можно определить
точное значение вероятности заключения, вытекающее
из этих посылок.
Ниже мы рассмотрим несколько примеров вероятност-
ных рассуждений с использованием механизма условной
вероятности.
108
5.2.2. ПРОСТАЯ ИМПЛИКАЦИЯ
С ПОЗИЦИЙ ВЕРОЯТНОСТИ
Рассмотрим первую ситуацию, в которой используется
правило типа
если (А), то (В)
Предположим, что никакие другие правила или посыл-
ки не имеют отношения к данной ситуации. Разберемся,
когда можно сделать вывод, что В истинно.
Где возникает неопределенность? В системах вывода
она бывает двух видов. Так, неопределенность возникает
при попытке количественно оценить, насколько мы уве-
рены, что предыдущее условие истинно. Например, если
степень уверенности того, что А истинно, составляет
только 90%, то какое значение тогда примет В?
Другой вариант - неопределенность в самой имплика-
ции. Например, мы могли бы сказать, что в большинстве
случаев, но не всегда, если есть А, то есть также и В.
Должно быть числовое выражение этого факта (скажем,
мы на 95% уверены, что, имея А, имеем и В).
Как можно все эти отношения выразить в терминах
вероятности? Если бы была абсолютная гарантия, что
предшествующее событие А истинно, то мы могли бы
записать:
р(А)-1.
Когда полной определенности нет, установленное зна-
чение вероятности отражает эту информацию таким об-
разом:
р(А)-.9.
При неопределенности второго типа утверждение с ве-
роятностью в 95%, что будет В, если есть А, записывается
в форме
р(В1А)-.95.
Здесь использована условная вероятность.
Эта формулировка достаточно ясна сама по себе, но
она не дает никакой информации о том, может ли быть В,
если нет А. В ряде случаев такая возможность есть, и тог-
да нужно получить значение В при отсутствии А:
р(В I не А)-?
109
Рассмотрим теперь типичную проблему, включающую
простую импликацию. Импликация представляет собой
выражение типа
если (А), то (В)
Проблему можно выразить таким образом: мы на 90%
уверены в том, что А истинно. Мы верим в это правило
импликации на 95%. Какова вероятность, что В ис-
тинно?
Нам известно следующее:
р(А)-.9;
р(В1А)-.95;
р(В) — искомый результат.
Как вычислить р(В)? Можно применить правило ком-
позиции и с его помощью получить р (В) на основе извест-
ных вероятностей:
р(В)-р(В IA) *р(А)+ р(В 1кеА) *р(неА).
Три величины мы знаем. Обратите внимание на то,
что:
р (не А) - (1 — р(А)) - .1.
Поэтому после преобразования уже известных величин
получается равенство:
р(В)-.95*.9 + р(В 1неА)* .1 -.855+ р(В 1неА)*.1.
До этого места мы смогли продвинуться без дополни-
тельной информации. Так как не известный нам фактор
заключен между 0 и 1, то ответом на основной вопрос
будет утверждение, что
.855 < -р(В) < - .955.
Если при постановке проблемы имелось в виду (но не
сообщалось), что В никогда не присутствует без А, то
р(В I не А) -0,
и мы могли бы точно сказать, что
р(В) - .855.
110
5.2.3. ИМПЛИКАЦИЯ, В КОТОРОЙ ДВЕ ПОСЫЛКИ
ОБЪЕДИНЕНЫ С ПОМОЩЬЮ ПРАВИЛА И
В другой ситуации для получения заключения могут
присутствовать две посылки
если (А и В), то (С)
Условная вероятность снова дает нам все необходимые
сведения для рассуждения в этой ситуации. К сожалению,
мы обнаруживаем, что, как и в более простом случае, при
постановке задачи указывается недостаточное количество
данных, которое не позволяет прийти к точному ответу.
Вот типичная проблема. Например, мы уверены на
95%, что А и В влекут за собой С. При этом с вероятно-
стью в 80% известно, что А истинно, и с вероятностью в
70% - что В истинно. Какова вероятность С?
Мы знаем следующее:
р(А)-.8;
р(В)-.7;
р(С1АиВ) -.95;
р(В) - искомый результат.
Если следовать формулировкам предыдущей задачи, то
при использовании правила композиции получатся такие
выражения для С:
р(С) -р(С1 Аи В) ♦ р(С I не (А и В)) * р(не (А и В)),
р(С)-.95*р(АиВ) + р(С 1не (А и В)) * (1 — р(АиВ)).
Теперь мы имеем две неизвестные величины вместо од-
ной. Сможем ли мы продвинуться дальше?
При таких рассуждениях решающее значение приобре-
тает соотношение между р(А) и р(В). К сожалению, как
станет ясно из дальнейшего, указанное соотношение
нельзя вычислить. Невозможно получить р(А и В) на ос-
нове вероятностей компонент, хотя эксперты-нематема-
тики часто формулируют свои правила так, как будто
подобная связь существует. Чтобы понять этот важный
факт, посмотрите на рис. 5.1, где выписаны результаты
еще двух экспериментов с шариками для пинг-понга.
В каждом случае, отображенном на рисунке, при испы-
тании шариков получаются следующие вероятности:
р(А)-.8
р(В)-.7
111
СЛУЧАЙ 1 СЛУЧАЙ 2
Номер шарика Метки Метки
1 А В А
2 А В А
3 А В А
4 А В А В
5 А В А В
6 А В А В
7 А В А В
8 А А В
9 А В
10 А В
Рис. 5.1. Счетный эксперимент с шариками для пинг-понга
Здесь показано, в какой мере знание индивидуальных свойств двух
совокупностей может быть использовано для предсказания их сов-ме-
стного появления- В каждом случае вероятность извлечения шарика с
меткой А равна .8, а с меткой В-.7. Чтобы уловить разницу, об- ра-
тите внимание на число шариков с двумя метками и на число шари-
ков без меток
В случае 1 число шариков с двумя метками доведено до
максимума, и тогда:
р(А и В) - .7
В случае 2 число шариков с двумя метками сведено к
минимуму, и вероятность наличия на шариках одновре-
менно двух меток изменилась:
р(А и В) - .5
Приведенный выше пример показывает, что простые
вероятности компонентов дают мало информации о воз-
можности совместного наступления события. Однако
они указывают интервал, в который эта вероятность
обязательно попадет. Случай 1 определяет максимальную
вероятность, а случай 2 - минимальную. Рассмотрев ри-
сунок, мы увидим, что
.7>-р(АиВ) >-.5.
Этот интервал легко выразить в терминах отдельных
вероятностей, обобщив данную задачу:
Х>-р(АиВ) >-Y,
где X - наименьшее из р(А) и р(В), a Y- р(А)+р(В)-1.
112
Как же теперь можно ответить на основной вопрос? Вы,
очевидно, обратили внимание на отсутствие двух необхо-
димых параметров. Если на этой основе нужно сделать
вывод, причем нельзя получить дополнительную инфор-
мацию, тогда, вероятно, наилучшими окажутся следую-
щие предположения:
р(С I не (А и В)) - О,
и р(А и В) имеет среднее значение в допустимом интер-
вале. Однако заметьте, что мы начали рассуждать эври-
стически, отказавшись от математической точности.
5.2.4. ИМПЛИКАЦИЯ, В КОТОРЫХ ПОСЫЛКИ ОБЪЕДИНЕНЫ
С ПОМОЩЬЮ ПРАВИЛА ИЛИ
Существует еще один тип импликации, обычно встре-
чаемый в системах вывода. Это случай, когда одна по-
сылка (или обе) оказывается достаточной для вывода
умозаключения:
если (А или В), то (С)
Если параметры выражения не определены, то что
можно сказать о заключении С?
Типичную задачу можно сформулировать следующим
образом:
Если истинно только А, в 70% случаев С также будет
истинным.
Если истинно только В, в 80% случаев С также будет
истинным.
Если истинно и А, и В, в 95% случаев С также будет
истинным.
Кроме того, в данной конкретной ситуации мы на 80%
уверены, что А истинно, и на 80% уверены, что В ис-
тинно.
Какова вероятность истинности С?
Здесь мы получили много информации, и эксперт мо-
жет чувствовать себя гордым и даже уставшим, сообщив
все эти данные, но, к сожалению, эта информация недо-
статочна.
Давайте сформулируем то, что мы знаем, в терминах
теории вероятности:
р(С I А и (не В))-.7;
р(С I (не А) и В)-.8;
113
р(С I А и В))-.95;
р(А)-.8;
р(В)-.8.
Пользуясь решениями предыдущих задач, мы можем
записать выражения для р(С), перечислив все условия,
когда может произойти событие С (мы опять обращаемся
к правилу композиции):
р(С)-р(С I АиВ)*р(АиВ)
+ р(С 1Аи (неВ)) *р(Аи (неВ))
+ р(С I (не А) и В) * р((не А) и В)
+ р(С I (не А) и (не В)) ♦ р((не А) и (не В)).
О чем это говорит? Нам известно количественное выра-
жение подчеркнутых условий, хотя р(С I (не А) и (не В))
и не было определено. Все остальные условия включают
интервалы, вычисляемые с помощью лежащих в их осно-
ве конкретных вероятностей, как делалось в предыдущей
задаче, так что на самом деле мы многого здесь не знаем,
хотя эксперт, насколько смог, дал довольно полное описа-
ние импликации.
Если на основе этих формальных выкладок все-таки
необходимо сделать вывод, то нам остается лишь надеять-
ся, что следующее равенство справедливо:
р(С I (не А) и (неВ)) -0.
Есть еще четыре не известные нам вероятности, для
которых можно вычислить интервалы. Наилучшей оцен-
кой такой величины разумно считать середину допусти-
мого для нее интервала.
5.2.5. НЕПРИГОДНОСТЬ ВЕРОЯТНОСТНОГО ВЫВОДА
ДЛЯ РЕАЛЬНЫХ ЗАДАЧ
Возможно, вы уже отметили, что рассуждение строго
на основе вероятностей становится все более трудным и
неудобным. Для сложных импликаций ситуация ухудша-
ется, например:
если (А или В, или С), то (D)
Здесь значительно труднее создать цепочку рассужде-
ний, которая привела бы к успешному применению рас-
смотренных ранее импликаций. По этой причине многие
экспертные системы перестают использовать рассужде-
ния на основе условной вероятности и выполняют лишь
грубые оценки условий вероятности или вырабатывают
114
некоторые специальные схемы, отображающие то, что
мог бы сделать эксперт. Однако если рассуждение стано-
вится слишком сложным, то и эксперт терпит неудачу,
поэтому нам следует быть очень осторожными.
5.3. ПРИБЛИЖЕННЫЕ РАССУЖДЕНИЯ
5.3.1. МЕНЕЕ СТРОГАЯ, НО БОЛЕЕ ПОЛЕЗНАЯ СХЕМА
Можно создать много разных схем приближенного
рассуждения. В данной области ведутся большие иссле-
дования. Ниже мы рассмотрим одну из самых важных
схем - механизм рассуждений медицинской системы вы-
вода MYCYN, преобразованную в более общую модель
EMYCYN, которая и стала законченной формой этой про-
граммы.
Схемы приближенного рассуждения должны базиро-
ваться на тех импликациях, которые нам уже известны.
Различия, возникающие в вычислениях, отличных от ве-
роятностных, могут быть использованы для оценки силы
поддержки заключений.
5.3.2. ИМПЛИКАЦИИ С ОДНОЙ ПОСЫЛКОЙ
Рассмотрим простой тип импликации:
если (Е), то (С)
Эффективный способ решения - присвоить коэффици-
ент определенности как посылке, так и всей импликации.
Тогда мы сможем совместно использовать эти две величи-
ны для вычисления коэффициентов определенности всего
заключения.
Что такое коэффициент определенности? Его часто
применяют вместо понятия вероятности. Если обозначить
коэффициент определенности как ct, а вероятность как р,
то в простейшем случае получим:
коэффициент определенности посылки - ct (Е) ~ р(Е),
коэффициент определенности импликации - ct (С) ~ р(С/Е).
Таким образом, коэффициент определенности события
приблизительно эквивалентен вероятности того, что по-
сылка (как утверждается) является истинной. Коэффи-
циент определенности импликации сходен с условной
вероятностью заключения, полученного при истинности
посылки. Ниже будут даны более точные определения.
115
Обычное правило комбинирования, позволяющее вы-
числить коэффициент определенности заключения в
случае, когда известен коэффициент определенности по-
сылки, лежащей в его основе, и связи в импликации, за-
писывается так:
ct(заключение) -ct (посылка) ♦ ct(импликация).
Это правило, возможно в несколько измененном виде,
будет встречаться в дальнейшем неоднократно. Именно
такой механизм использован в EMYCYN. Например, мы
могли бы сказать, что верим в истинность посылки с веро-
ятностью .8. Верим и в то, что лежащая в основе импли-
кации схема выполняется в большинстве случаев, но не
всегда. Поэтому мы приписываем ей коэффициент опре-
деленности .9. Тогда коэффициент определенности за-
ключения в такой ситуации
ct(заключение) - .8 * .9 - .72.
Приведем пример с использованием правила комбини-
рования:
Если это последняя модель автомобиля,
то в нем есть каталитический преобразователь.
Предположим, вы доставили машину в гараж, где уста-
новлена экспертная система, помогающая в диагностике
неисправностей. Допустим далее, что механик в ответ на
вопрос экспертной системы: “Это последняя модель авто-
мобиля?” вводит “Да” или “Нет”, хотя, возможно, его
представления о последней модели автомобиля отличают-
ся от представлений разработчиков программы. Поэтому
при ответе на вопрос может быть допущена ошибка. Это
пример неопределенности в посылке. Второй вариант - не
исключено, что каталитический преобразователь был в
автомобиле, но владелец его снял. Это пример неопреде-
ленности в импликации. Коэффициент определенности в
выводимом заключении представляет собой число, кото-
рое должно объединить и отразить оба источника внут-
ренних ошибок.
5.3.3. ЛОГИЧЕСКИЕ КОМБИНАЦИИ ПОСЫЛОК
В ОДНОМ ПРАВИЛЕ
Основной вычислительный прием, который мы можем
использовать для нахождения коэффициента определен-
ности заключения, сводится к следующему:
t(заключение) - ct(посылка) ♦ ct(импликация).
116
Прежде всего нужно суметь оценить коэффициенты
определенности посылок. Будем называть посылкой все
логическое выражение в правиле между “если” и “то”. За
исключением случаев простой импликации, это выраже-
ние состоит из атомарных посылок, каждая из которых
имеет свой коэффициент определенности. Они могут быть
связаны между собой логическими операциями, напри-
мер:
если (el или (е2 и еЗ)), то (с)
или
если (el и е2 и ((не еЗ) или е4)), то (с)
Очевидно, нам требуется некоторый способ оценки ко-
эффициентов определенности этих сложных форм в поня-
тиях их отдельных компонент. Подход, использованный в
EMYCYN, заключается в том, чтобы отбросить все слож-
ные выражения и считать все правила простыми. Такое
ограничение тем не менее сохраняет структуры правил,
которые являются достаточно информативными для боль-
шинства целей. Есть несколько тривиальных процедур
для сведения коэффициентов определенности простых ло-
гических комбинаций в одно число. К их обсуждению мы
теперь и переходим.
Простейшей логической комбинацией является конъ-
юнкция (И) между двумя элементарными свидетельства-
ми. Импликация, с которой нам предстоит иметь дело,
выглядит так:
если (el и е2), то (с)
Согласно оценке, сделанной в EMYCYN, коэффициент
определенности посылки равен коэффициенту определен-
ности наименее надежной из посылок, т.е.
ct(el и е2)-min(ct(el), ct(e2))
Обратите внимание на то, что оценка весьма занижена,
но кажется, что будет удовлетворительной.
Другой простой формой является правило, в котором
используется дизъюнкция (ИЛИ), связывающая две час-
ти свидетельств:
если (el или е2), то (с)
Общее правило комбинирования, по которому вычис-
ляется коэффициент определенности посылки, заключа-
117
ется в том, что коэффициент определенности дизъюнкции
равен коэффициенту определенности ее сильнейшей час-
ти, т.е.
ct<el или е2) -max(ct(el), ct(e2))
Хотя правила иногда и записываются с помощью дизъ-
юнкции, если есть выбор, то принято разбивать дизъюнк-
цию на две части, например:
если (el),то (с)
если (е2), то (с)
В этом случае, несмотря на подобие логических форм,
можно определить коэффициенты определенности каж-
дой из посылок. Они могут оказаться очень разными. Мы
можем оговорить различные коэффициенты определенно-
сти для вариантов, когда задействовано только одно пра-
вило и когда включены оба. Использование двух правил
вместо дизъюнкции позволяет более отчетливо увидеть
ситуацию, но если необходимо придерживаться этого со-
ображения, то нам нужен механизм, определяющий ко-
эффициент определенности заключения при поддержке
двух правил. В дальнейшем мы рассмотрим такой пример.
Дизъюнкцию лучше представлять в виде двух правил,
что, правда, не всегда возможно. Вы можете получать ин-
формацию от эксперта, имеющего другую точку зрения
по данному вопросу. Всегда следуйте тому, что эксперт
считает важным.
5.3.4. ПОДДЕРЖКА ОДНОГО ЗАКЛЮЧЕНИЯ
МНОЖЕСТВОМ ПРАВИЛ
Рассмотрим ситуацию, когда используются два прави-
ла и оба они поддерживают одно и то же заключение, на-
пример:
Правило 1:
если (el), то (с) ct(заключение) - .9
Правило 2:
если (е2) то (с) ct(заключение) - .8
Допустим, обе посылки верны, и мы вычислили вероят-
ность заключения для каждого правила по отдельности.
Теперь подходим к основному вопросу. Если использова-
лось правило 1, то коэффициент определенности в заклю-
118
чении окажется равным .9. Ясно, что, имея еще и правило
2, мы получим больший коэффициент определенности, но
какова будет его величина?
Предположим, что переменная ctotal представляет об-
щий коэффициент определенности заключения, получен-
ный использованием всех поддерживающих его правил.
Можно предложить много различных комбинаций проце-
дур. В EMYCYN, например, действует простой и эффек-
тивный механизм:
ctotal- коэффициент определенности из правила 1
+ коэффициент определенности из правила 2
— (коэффициент определенности из правила 1)
* (коэффициент определенности из правила 2)
Это может показаться вам каким-то трюком. Однако
мы просто взяли функцию, в которой два больших ко-
эффициента определенности преобразуются в один еще
больший, но меньше единицы.
Подставив числа, заданные в примере, получим
ctotal - .9 + .8 — (.9) ♦ (.8) - .98.
Рассмотренный принцип можно распространить на
случай п правил, поддерживающих одно заключение,
где для каждого правила существует своя вероятность.
Например, у нас есть три правила со следующими коэф-
фициентами определенности:
Правило 1:
если (el), то (с) ct(заключение) " ct 1
Правило 2:
если (е2) , то (с) ct (заключение) - ct2
Правило 3:
если (еЗ), то (с) ct (заключение) " ct3
Совокупный коэффициент определенности заключе-
ния с учетом всей возможной поддержки может быть вы-
числен так:
ctotal -ctl+ct2 + ct3
— ctl * ct2 — ctl ♦ ct3 — ctl ♦ ct3
+ ctl ♦ ct2 * ct3
Суть заключается в формировании произведений из
базисных коэффициентов определенностей правил и в
сложении и вычитании этих произведений соответст-
вующим образом. Каждая двойная комбинация коэф-
119
фициентов определенностей вычитается, тройная - при-
бавляется, четвертая ~ вычитается и т.п. до тех пор, пока
все правила не будут использованы совместно.
Запомните, что коэффициент определенности - это ар-
тефакт приблизительных рассуждений. Нет иного доказа-
тельства правомерности такого способа комбинирования,
кроме того, что он прост, соответствует здравому смыслу
и следует правильному общему поведению, если не отно-
ситься к нему излишне доверчиво.
5.3.5. ДОПОЛНЕНИЕ: НЕСКОЛЬКО ПРАВИЛ,
ИСПОЛЬЗУЕМЫХ ПОСЛЕДОВАТЕЛЬНО
Механизм дополнения - это другой способ вычисле-
ния коэффициента определенности заключения, под-
держиваемого несколькими правилами импликации. Он
используется в случае, когда сведения о разрешенных к
применению правилах поступают последовательно, а не
одновременно. Например, если система задает пользо-
вателю вопросы, то задействование новых правил будет
происходить по очереди.
Рассмотрим пример. Допустим, известно, что заключе-
ние поддерживается двумя правилами со следующими ко-
эффициентами определенности:
Правило 1:
если (el), то (с) ct (заключение)"ctl.
Правило 2:
если (е2)к, то (с) ct(заключение)" ct2.
При применении двух правил совокупный коэффици-
ент определенности
ctotal - ctl + ct2 — ctl ♦ ct2
Теперь предположим, что появилось третье правило,
поддерживающее то же заключение:
Правило 3:
если (еЗ), то (с) ct(заключение) -ct3
Если все, что получено из предыдущего исследования,
входит в переменную ctotal, и если считается, что ct3
может войти в рассуждения на общих основаниях, то
можно использовать стратегию дополнения для форми-
рования измененной оценки коэффициента определен-
ности заключения:
cnewtota! - ct3 + ctotal — ct3 * ctotal.
120
Перемножив все компоненты этой формулы, мы уви-
дим, что:
cnewtotal - ct3 + (ct 1 + ct2 — ctl * ct2)
— ct3 ♦ (ct 1+ ct2 — ctl ♦ ct2)
-ctl+ct2 + ct3
— ctl * ct2 — ctl ♦ ct3 — ct2 * ct3
+ ctl *ct2*ct3.
Вы, очевидно, уже заметили, что это в точности тот же
вывод, к которому мы пришли ранее, комбинируя свиде-
тельства, полученные одновременно. Наш вывод, если его
обобщить, имеет два важных приложения:
1. В любом случае при использовании механизма до-
полнения порядок поступления правил, поддерживающих
заключение, не имеет значения.
2. Можно объединять коэффициенты определенности
из поддерживающих импликаций последовательно по ме-
ре их поступления или сохранять информацию, а затем
использовать ее всю сразу - результат от этого не меняет-
ся.
Практически сеть рассуждений меняется, как только
поступают новые сведения. Поэтому сохранять нужно
лишь совокупный коэффициент определенности для каж-
дого заключения, что обеспечивает наиболее экономный
способ поддержки информационного обеспечения ЭС.
5.3.6. БИПОЛЯРНЫЕ СХЕМЫ
ДЛЯ КОЭФФИЦИЕНТОВ ОПРЕДЕЛЕННОСТИ
Прототипом систем, основанных на приближенных
рассуждениях, являются MYCYN и ее прямой потомок
EMYCYN. Эти системы используют механизм объедине-
ния коэффициентов определенностей, который мы только
что обсудили, и еще одно дополнительное средство. Мы
рассматривали коэффициент определенности как доволь-
но грубое приближение к вероятности. В EMYCYN в лю-
бом случае, когда должна быть численно выражена
определенность, используется интервал от -1 до 0 до + 1,
так что это не может быть вероятностью. Границы интер-
вала обозначают следующее: + 1 - система в чем-то пол-
ностью определена, 0 - у системы нет знаний об
обсуждаемой величине, -1 - высказанная гипотетическая
посылка или заключение абсолютно неверно. Промежу-
точные величины отражают степень доверия или недове-
рия к указанным ситуациям.
Все описанные нами процедуры рассуждений примени-
мы и для коэффициентов определенности, задаваемых в
121
этих более широких границах. Однако учтите, что, когда
с помощью правил вы находите максимум или минимум
двух величин, нужно помнить про знаки. Например, зна-
чение .1 должно рассматриваться как более крупная вели-
чина, чем -.2. В том случае, если речь идет об абсолютных
величинах, они определяются явным образом.
Полная реализация идеи биполярных коэффициентов
определенности требует сделать два обобщения для раз-
виваемого нами вычислительного механизма. Во-первых,
мы не умеем работать с отрицанием атомарных посылок
(т.е. посылок, которым предшествует частица “не”), на-
пример:
если (el и (не е2)), то (с)
Действовать в такой ситуации легко. Нужно только
считать (не е2) атомарным утверждением. Можно дать
ему новое имя, например еЗ, но какой коэффициент опре-
деленности следует приписать этому новому свидетельст-
ву? Обычно коэффициент определенности задан для е2.
Для вычисления же коэффициента определенности (не
е2) достаточно просто поменять знак:
сЦне е) - — ct(e)
Противопоставим этот вариант другому, но столь же
примитивному способу, который нам потребовался бы, ес-
ли бы мы имели дело с вероятностями:
р(нее) - — р(е)
То, что вы видите, является следствием применения
биполярной меры определенности. В любом случае коэф-
фициент определенности для отрицания посылки всегда
может быть легко найден, а потом использован в различ-
ных манипуляциях.
Другое средство, которое мы должны включить в рас-
смотренные ранее механизмы, - процедура получения
композиции коэффициентов определенностей в условиях
поддержки двумя правилами одного и того же заключе-
ния.
Необходимо сделать следующее:
если оба коэффициента определенности положитель-
ны:
ctotal - ctl + ct2 — ctl ♦ ct2,
122
если оба коэффициента определенности отрицательны:
ctotal - ctl + ct2 + ctl ♦ ct2,
Коцца отрицателен один коэффициент, то
ctotal - (ctl + ct2)/(l — min(abs(ctl),abs(ct2))>
Обратите внимание на то, что доминирующим здесь
является один минус, относящийся к меньшему абсолют-
ному значению из двух коэффициентов определенно-
стей.
В том случае, когда одна определенность равна +1, а
другая-1,
ctotal-0.
На рис. 5.2 представлена таблица, в которой отражены
все возможные способы комбинирования двух коэффици-
ентов определенности в соответствии с указанными выше
правилами. Значения и знаки на этом рисунке соответст-
вуют здравому смыслу.
С1
-1 -.8 -.6 -.4 -.2 0 .2 .4 .6 .8 1
1.0 0 1 1 1 1 1 1 1 1 1 1
.8 -1 0 .50 .67 .75 .80 .84 .88 .92 .96 1
.6 -1 -.50 0 .33 .50 .60 .68 .76 .84 .92 1
.4 -1 -.67 0.33 0 .25 .40 .52 .64 .76 .88 1
.2 -1 -.75 -.50 -.25 0 .20 .36 .52 .68 .84 1
С2 0 -1 -.80 -.60 -.40 -.20 0 .20 .40 .60 .80 1
-.2 -1 -.84 0.68 -.52 -.36 -.20 0 .25 .50 .75 1
-.4 -1 -.88. -.76 -.64 -.52 -.40 -.25 0 .33 .67 1
-.6 -1 -.92 -.84 -.76 -.68 -.60 -.50 -.33 0 .50 1
-.8 -1 -.96 -.92 -.88 -.84 -.80 -.75 -.67 -.50 0 1
-1. -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0
Рис. 5.2. Результат композиции коэффициентов определенности
в случае, когда несколько правил поддерживают
одно и то же заключение
В таблице показано, как может быть обеспечено числовое согласование
для двух взаимодействующих правил, имеющих разную относительную
силу. Значения коэффициентов определенности для правила 1 отложе-
ны по горизонтальной оси, а для правила 2 - по вертикальной. Числа от-
ражают результаты конкретных комбинаций. Здесь происходит следу-
ющее: когда два правила с небольшими коэффициентами определенно-
сти поддерживают одно заключение, коэффициент определенности за-
ключения возрастает. Если же знаки не совпадают, то результат опреде-
ляется сильнейшим, но влияние его несколько ослабляется
123
Применение биполярных коэффициентов определен-
ности может привести к нереальным результатам, если
правила сформулированы неточно. Мы рассмотрим толь-
ко одну из потенциальных проблем. Работая с одним
правилом вывода, не забывайте, что всегда используется
соотношение:
ct(заключение) - ct(посылка) *ct(импликация).
Теперь перейдем к конкретным примерам.
Правило 1:
Если это последняя модель автомобиля,
то в ней есть каталитический преобразователь.
Общий коэффициент определенности импликации
должен быть равным .9. Новые модели машин положе-
но оснащать каталитическими преобразователями, но не-
которые владельцы снимают их для достижения лучшего
пробега автомобиля. Попытаемся применить это правило
к старому автомобилю, где коэффициент определенности
посылки мог бы быть равным -.8. Рассуждение с исполь-
зованием правила дает -.72 для заключения, т.е. мы в
достаточной степени уверены, что на автомобиле нет ка-
талитического преобразователя. Такое заключение при-
менительно к старым моделям является правильным.
Правило 2:
Если это последняя модель автомобиля,
то в ней есть радиоприемник.
Предположим, что у нас имеются те же коэффициенты
определенности, что и ранее. Рассуждая, как в предыду-
щем случае, мы должны были бы прийти к выводу,
что если автомобиль старый, то в нем не должно быть
радиоприемника. Это заключение было бы абсолютно
неверным - радиоприемники устанавливались и в старых
моделях. Данное правило относится только к последним
моделям автомобилей, но “простодушная” система выво-
да могла бы создать нам неприятности, пытаясь приме-
нить его при других обстоятельствах.
В чем же разница между этими двумя правилами?
Первое правило сохраняет свое значение, когда и посыл-
ка, и заключение отрицательны, например:
Если это не последняя модель автомобиля,
то в ней нет каталитического двигателя.
Второе же правило теряет смысл при отрицании посыл-
ки и заключения.
124
Если это не последняя модель автомобиля,
то на ней нет радио.
Все правила попадают в одну из этих двух очень важ-
ных категорий. Правила первой категории будем назы-
вать обратимыми.Одной из характеристик такого правила
является его применимость к любому вероятностному
значению, которое может быть связано с посылкой. Пра-
вила второй категории считаются необратимыми. Эти
правила “работают” только при положительных значени-
ях посылки. Если же ее значение отрицательно, правило
применять нельзя.
При создании правил вы всегда должны проверять их
на обратимость, имитируя отрицание посылки и заключе-
ния показанным выше способом и проверяя, сохраняет ли
правило смысл. Когда правила включают в автоматиче-
скую рассуждающую систему, их нужно определить раз-
личными способами, чтобы система могла по-разному
работать с ними (см. разд. 5.4.2).
5.4. ЦЕПОЧКИ РАССУЖДЕНИЙ:
МНОГОСТУПЕНЧАТЫЕ РАССУЖДЕНИЯ
5.4.1. ВОЗМОЖНОСТИ СЕТЕЙ ВЫВОДА
До сих пор мы имели дело с простыми ситуациями, ког-
да окончательное заключение отделялось от посылки од-
ним шагом рассуждений. Более типичной является другая
ситуация - сеть, в которой окончательные рассуждения
отделены от базы посылок большим числом промежуточ-
ных шагов. Такие рассуждения называются многоступен-
чатыми.
Чтобы представить себе, что же такое многоступенча-
тое рассуждение, допустим, что вы заболели. У вас про-
студа, вирусная инфекция или грипп, и вы хотели бы
знать, что следует предпринять.
Приведем несколько правил, которыми можно руко-
водствоваться в подобных случаях. Число в правой части
каждого правила указывает коэффициент определенно-
сти для конкретной импликации.
Если у вас грипп и вы находитесь в уязвимом возрасте,
то вызовите врача ct (импликация) - .9
Если у вас острый фарингит,
то вызовите врача ct (импликация) "1.0
Если у вас простуда,
то ложитесь в постель и
примите аспирин ct (импликация) - .4
Если у вас грипп и вы не находитесь в уязвимом возрасте,
то ложитесь в постель и
125
примите аспирин ct (импликация) - .4
Если у вас лихорадка и болят мышцы,
то это грипп ct(импликация) - .7
Если у вас насморк, мышечные боли и нет лихорадки,
то это простуда ct(импликация) - .7
Если у вас в горле нарывы и есть лихорадка,
то это острый фарингит ct (импликация) - .8
Если вам меньше 8 или больше 60 лет,
то вы находитесь
в уязвимом возрасте ct (импликация) - .7
Теперь вы можете просмотреть правила и в зависи-
мости от конкретных симптомов заболевания решить,
обратиться ли к врачу или достаточно лечь в постель и
принять аспирин. Вы даже можете использовать комбина-
цию изученных правил для определения коэффициента
определенности, соответствующей каждому из возмож-
ных результатов, а потом выбрать тот, который имеет на-
ибольший коэффициент определенности. Однако данная
форма представления правил удобна для компьютера, но
не для человека.
Для обсуждения многоступенчатого рассуждения пра-
вила удобно преобразовывать в другую форму, позволяю-
щую более отчетливо представить соответствующие
вероятности. Любая система стыкующихся правил, на-
пример та, которую мы используем, может быть отобра-
жена графически. Она называется сетью вывода и имеет
вид графика с указанными связями между правилами.
На графике также отчетливо видны все возможные под-
держивающие структуры промежуточных рассуждений,
находящиеся ниже любого более высокого уровня заклю-
чения. Такая сеть вывода существует только в нашем
воображении. Ее цель - придать правилам конкретную
форму (рис. 5.3).
В диаграммах такого типа используются некоторые
стандартные приемы, которые надо знать, чтобы уметь их
прочесть (рис. 5.4). Запомните, что сеть вывода и множе-
ство взаимосвязанных импликаций - это одно и то же.
Обе формы содержат одинаковый объем информации.
В правилах, составляющих сеть вывода, могут быть и
позитивные, и негативные утверждения. Так, в рассмот-
ренном выше медицинском примере нам встретились две
фразы:
есть лихорадка
нет лихорадки
Поскольку здесь речь идет об одном и том же, эти фра-
зы удобно зафиксировать в одном узле сети вывода. Для
правила, где фраза появляется в негативной форме, связь
126
отмечается перечеркивающей полосой, проходящей через
узел, отображающий лихорадку. Там, где она появляется
в позитивной форме, связь имеет обычный вид (см. рис.
5.3 и 5.4).
Коэффициент определенности, указанный рядом с уз-
лом, относится к позитивной форме утверждения. Такие
биполярные графики удобны тем, что для получения ко-
эффициента определенности негативной формы достаточ-
но просто поменять знак на противоположный.
Рассуждения с применением сети могут показаться
для вас сложными, но на самом деле это не так. Мы рас-
Рис. 5.3. Медицинские правила в виде сети вывода
Сеть показывает возможности многоступенчатых рассуждений в за-
даче в более удобном виде, чем просто список утверждений. Здесь сде-
лана попытка представить явным образом все шаги рассуждений для
некоторой гипотетической ситуации, когда пациент имеет какое-то
заболевание, родственное гриппу, и хочет получить рекомендации
127
В виде сети вывода
В логическом виде
а. Простая импликация
if (е) then (с)
ct (implication) =.8
Ь. Импликация AND
if (е1 and e2) then (c)
ct (implication) =.9
if (e1 or e2) then (c)
ct (implication) =.85
d. Импликация с отрицанием NOT
if ((notel)or e2) then (c)
ct (implication) = .7
е. Несколько правил в поддержку
одного заключения
if (e1 and e2) then (c)
ct (implication) = .7
if (e3) then (c)
ct (implication) = .75
f. Одно свидетельство, используемое
в двух правилах
if 4note1)then (c1)
ct (implication) = .9
if (e1 and e2) then (c2)
ct (implication) = .8
Рис. 5.4. Эквивалентные виды записей -
сети вывода и правила
128
смотрели процедуры приписывания коэффициентов опре-
деленности заключениям, имеющим под собой какие-то
основания. Теперь нужно просто с помощью правил ком-
бинаций, двигаться по сети вверх от базовых узлов, рас-
считывая коэффициенты определенности.
5.4.2. ПРОЦЕСС РАСПРОСТРАНЕНИЯ В СЕТИ ВЫВОДА
Рассмотрим несложный пример, иллюстрирующий рас-
пространение коэффициентов определенности в сети. В
связи с тем, что некоторые промежуточные заключения в
медицинской сети зависят более чем от одной имплика-
ции, обратимся к более простому варианту (рис. 5.5а).
Рис. 5.5а. Пример сети вывода для проведения рассуждений
с заданными начальными условиями
Это простая сеть для иллюстрации различных аспектов многосту-
пенчатого рассуждения. Узлы в основании дерева представляют по-
сылки (условия) из внешнего мира, о которых система должна зада-
вать вопросы. Внутренние узлы отображают заключения. Коэффици-
енты определенности внутренних узлов полностью зависят от про-
цесса рассуждения, правил импликации и свидетельств, полученных из
внешнего мира путем запросов. Число справа от каждого узла соот-
ветствует коэффициенту определенности. До начала рассуждений ни-
чего не известно о внутренних узлах, поэтому они все имеют коэф-
фициенты определенности, равные нулю
На рисунке показана сеть до и после того, как из соответ-
ствующих посылок были выведены заключения. В каж-
дом ее узле вы видите число, указывающее, какое из
рассуждений подходит в данном случае. Коэффициент
5—751
129
определенности отмечен справа от каждого узла. Отдель-
ные первоначальные посылки, расположенные в нижней
части дерева, показывают коэффициенты определенно-
стей, которые были получены при задании необходимых
вопросов и при получении данных из внешнего мира. Все
внутренние узлы на рис. 5.5а имеют коэффициенты опре-
деленности, равные нулю, так как рассуждения пока не
проводились.
Под каждым внутренним узлом стоит число, отра-
жающее коэффициент определенности структуры имп-
ликации и поддерживающее конкретный узел. Рядом с
коэффициентом определенности импликации запишем
rev (обр.) или nrev (необр.), что обозначает, будет ли им-
пликация использоваться как обратимое или как необра-
тимое правило. Вспомните - обратимое правило можно
применять всегда, а необратимое нужно удалить из сети,
если коэффициент определенности посылки для этого
правила становится отрицательным. Вычисления коэф-
фициента определенности посылки может потребовать
выполнения нескольких шагов: могут добавляться “И”,
“ИЛИ”, “НЕ”. В каждом конкретном случае, пока не бу-
дет закончена вся эта предварительная работа, нельзя с
уверенностью сказать, применимо ли правило.
Иногда правило включает отрицание некоторой посыл-
ки или заключения. На диаграммах сети вывода опреде-
ленности всегда показаны для посылок или заключений
до применения отрицания. Разберем это на конкретном
примере.
В разд. 5.4.1 мы показали, как множество правил под-
разумевает одну сеть вывода. Ту же связь можно пока-
зать, двигаясь в противоположном направлении. Сеть
вывода на рис. 5.5 предполагает следующие правила:
Если (el), то (cl)
Если (е2), то (с2)
Если (еЗ), то (с2)
Если (е4), то (сЗ)
Если (не е5), то (сЗ)
ct (импликация) - .8 (nrev)
ct (импликация) - .9 (rev)
ct(импликация) - .7 (rev)
ct (импликация) - .6 (nrev)
ct (импликация) - .5 (nrev)
Если (c2 и сЗ), то (cl) ct(импликация) - .9 (rev)
Если (cl илиc4), то (c5) ct(импликация) - .8 (nrev)
На рис. 5.56 показан результат всех рассуждений, про-
водимых в сети, использующей подходящее свидетельст-
во. Мы должны начать с основания и идти вверх по
дереву, чтобы оценить, что же произошло.
130
с5 1 .58
c1 ) 72
.8
(nrev)
с4
.13
.8 (nrev)
.9
с2 ) .74
.9
(rev)
сЗ
>15
f .9 .7 '
(rev) (rev)
/ .6
(nrev)
e4 J -.4
.5(nrev)
е5 ) -.3
е2
.9
еЗ ) -.3
Рис. 5.56. Пример сети вывода с вычисленными
определенностями после проведения рассуждения
В сети содержатся все элементы, с которыми нам пришлось рабо-
тать, т.е. импликации разных типов: простые. И, ИЛИ, импликации
с отрицаниями, а также обратимые и необратимые правила. Однако
мы договорились иметь только одну импликацию для конкретного за-
ключения. Рассуждения начинаются с основания дерева, где все изве-
стно, а затем с помощью правил импликации находятся коэффици-
енты определенности для узлоь, поддерживающих нижний информаци-
онный уровень. Этот процесс продолжается последовательно до тех
пор, пока не будет найден коэффициент определенности для каждого
заключения
Коэффициент определенности cl может быть вычислен
следующим образом:
ct(заключение с!) - .8 * .9в .72.
Это простая необратимая импликация, но поскольку
коэффициент определенности посылки позитивен, прави-
ло можно применять.
Для вычисления коэффициента определенности с2 мы
должны сначала заметить, что здесь задействованы два
правила и оба используются без ограничений, так как они
обратимы. Правило слева даст оценку коэффициента оп-
ределенности с2:
ct (заключение с2) - .9 * .9 - .81.
Правило справа даст иную оценку:
сЦзаключение с2) - -.3 ♦ .7 - -.21.
131
Здесь вы видите два поддерживающих правила, даю-
щих оценку коэффициента определенности с противопо-
ложными знаками, поэтому для окончательного ответа
мы объединим эти оценки:
ct(заключение С2) - (.81+ (-21.))/(1 — .21) - .74.
Для сЗ мы опять имеем два правила. Правило, связан-
ное с левым поддеревом, не применяется, так как оно
необратимо, и коэффициент определенности посылки
отрицателен. Правило, связанное с правым поддеревом,
есть простая импликация. Она необратима и содержит от-
рицательную посылку. Что нужно сделать? Правило ут-
верждает:
Если (не е5), то (сЗ) ct (импликация) - .5 (nrev)
Коэффициент определенности е5 равен -.3. Так как он
негативен, то коэффициент определенности посылки в
правиле равен .3. Нас интересует коэффициент опреде-
ленности всего предложения, поддерживающего посылку,
а не отдельные компоненты. Правило необратимо, но
посылка находится в допустимом интервале. Используя
процедуру, предназначенную для простой импликации,
мы найдем для сЗ:
сЦзаключение СЗ) - .3 * .5 - .15:
Импликация, поддерживающая С4, включает конъюн-
кцию посылок. Коэффициент определенности посылки
равен:
ct(свидетельства) -min(.15, .74) - .15.
Поскольку правило обратимо, можно использовать по-
сылку в любом интервале определенности. Используя
этот результат, вычислим коэффициент определенности
для с4:
сЦзаключение с4) - .15 * .9 - .13.
Теперь мы прошли вверх по дереву до того места, где
можно судить об узле верхнего уровня. Здесь задействова-
но одно правило, в котором посылки разделены с по-
мощью ИЛИ, поэтому
ct(свидетельства) - шах(.72, .13) - .72.
132
Правило необратимо, но коэффициент определенности
посылки позитивен, так что мы можем двигаться дальше.
Последнее звено в нашей цепи рассуждений - коэффи-
циент определенности для узла высшего уровня - вычис-
ляется по 4юрмуле
с ((заключение с5) - .72 ♦ .8 - .58.
Далее мы рассмотрим, как включить эти механизмы в
очень полезную программу FUZZYNET, которая способ-
на осуществлять многоступенчатые рассуждения.
5.5. ПРОГРАММА
ПРИБЛИЖЕННЫХ РАССУЖДЕНИЙ
В СТИЛЕ ЕМУCIN
5.5.1. FUZZYNET ВЫБИРАЕТ
МЕЖДУ КОНКУРИРУЮЩИМИ ГИПОТЕЗАМИ
Обычно сети вывода требуются в ситуации, коща при
наличии нескольких конкурирующих гипотез экспертная
система пытается сделать выбор и породить информацию.
Например, в медицинских системах сеть выбора может
использоваться при установлении причин болей у паци-
ента: аппендицит ли это, рак, какая-нибудь инфекция,
вызвавшая воспаление лимфатических узлов, или, воз-
можно, просто расстройство желудка.
Первоначально возможно лишь предположение о наи-
более вероятной гипотезе. По мере поступления новых
порций информации ее можно использовать для измене-
ния наилучшей оценки программы в отношении степени
определенности для каждой гипотезы. Рассуждения будут
продолжаться до тех пор, пока система не исчерпает сво-
их возможностей или пока одна из гипотез не окажется
четко установленной.
Программа FUZZYNET иллюстрирует хороший способ
представления связей и импликаций в типичной сети
вывода. Кроме того, для всех узлов, названных здесь
конкурирующими гипотезами, программа может полу-
чать информацию целесообразным образом и рассуждать,
чтобы сделать выбор между гипотезами верхнего уровня
на основе вычисленных определенностей.
5.5.2. СТРУКТУРА FUZZYNET
Первая версия программы FUZZYNET включает неко-
торое число ограничений, что делает ее структуру более
понятной.
133
Ограничение 1
Правила могут иметь одну из трех форм:
Форма 1:
Если (е), то (с)
Если (не е), то (с)
Форма 2:
Если (el или е2), то (с)
Если ((не el) или е2), то (с)
Если (el или (не е2)), то (с)
Если ((неel) или (нее2)),то (с)
Форма 3:
Если (el ие2), то (с)
Если ((не el) и е2), то (с)
Если (el и (нее2)),то (с)
Если ((неel) и (нее2)),то (с)
Ограничение 2
На одно заключение могут указывать не более двух
правил.
Ограничение 3:
Все правила обратимы. Они могут быть использованы
для всех возможных значений коэффициента определен-
ности посылки.
Теперь мы внесем в программу некоторые изменения,
сняв ограничения 2 и 3. Ограничение 1 позволяет избе-
жать работы со слишком сложными правилами, поэтому
его можно оставить.
Обратимся к рис. 5.6. Эта небольшая сеть демонстриру-
ет структуру, которую можно использовать для соверше-
ния выбора между конкурирующими гипотезами с7 и с8.
Связи между узлами представляют основные шаги рас-
суждений. Мы включаем их в программу с помощью фак-
тов импликации. Например, в cl расположен узел И. Его
структура в форме правила выглядит так:
Если ((не el) и е2), то (cl) ct(импликация) - .9 (rev)
Мы можем собрать всю информацию, содержащуюся в
этом правиле, определив отношение между импликация-
ми в Prolog и присоединив их к каждому правилу, которое
мы хотим определить. Например, в рассматриваемом слу-
чае мы имеем:
imp(a,r,cl,neg,el ,pos,e2,0.9).
134
Рис. 5.6. Сеть вывода для рассуждений
при наличии конкурирующих гипотез
Здесь показана ситуация, когда задачей системы рассуждений являет-
ся выбор между двумя альтернативами (верхние узлы). Сеть похожа
на ту, что мы уже рассмотрели ранее, но она несколько усложнена:
ряд узлов поддерживается более чем одной импликацией, и на верхнем
уровне находятся два узла вместо одного
Такая запись означает импликацию. Первый аргумент
указывает, что ее тип И (And). Второй аргумент обозна-
чает обратимость правила. Если в этой позиции стоит п,
то правило необратимо. Рассмотренный выше узел септ
cl. Перед каждым узлом стоит слово neg или pos. Оно
указывает шаблон отрицания в правиле, если таковой
имеется^ Коэффициент определенности данной конкрет-
ной импликации равен .9.
Все остальные понятные программе импликации мож-
но представить с помощью тех же восьми аргументов фак-
тов импликации. Простая импликация представляется
так:
imp (s,г,сЗ,pos,е5,dummy,dummy,0.6).
Здесь записано, что узел сЗ поддерживается указан-
ной импликацией, а е5 - посылка. Посылка не отри-
цается, поэтому правило обратимо. Аргументы 6 и 7
(dummy,dummy) будут всегда присутствовать в простых
импликациях, так что мы можем использовать одну и ту
же форму для представления всех импликаций, о которых
известно программе. В противном случае нам потребова-
135
лась бы более короткая форма правила для простых имп-
ликаций. Эта форма правила является эквивалентом пра-
вила на Прологе:
Если (е5), то (сЗ) ct(импликация) - .6 (rev)
Правило, в котором посылки объединяются с помощью
ИЛИ, как, например, в узле сб, будет выглядеть так:
imp(o,r,c6,pos,cl ,pos,c2,0.6).
Нам также потребуется способ представления узлов,
поддерживаемых несколькими правилами. Скажем, для
узла с8 мы имеем:
Если (сб), то (с8) ct(импликация) - .8 (rev)
Если (е4 и сЗ), то (сЗ) ct(импликация) - .7 (rev)
В подобных ситуациях должны быть отдельные импли-
кации фактов для каждого правила, которое может участ-
вовать в рассуждениях:
imp (s, г, c8,pos,c6, dummy, dummy ,0.8).
imp(a,r,c8,pos,e4,pos,c3,0.7).
В сети вывода самые нижние и самые верхние узлы яв-
ляются специальными. Поэтому необходимо обеспечить
программе возможность сообщить нам, что она работает
именно с этими узлами. Узлы в вершине дерева, от кото-
рых зависит весь вывод, должны быть определены факта-
ми узлов гипотезы:
hypothesis-node (с7)
hypothesis-node (с8)
Нижние узлы, в отношении которых нельзя сделать
никакого вывода, должны определяться конечными фак-
тами.
terminal-node (el)
terminal-node (е2)
Вот и все, что требуется для представления обычной
сети вывода. Осталось лишь уточнить, какие правила
нужны программе для составления заключений о самых
верхних узлах.
Мы воспользуемся тремя правилами, в которых счита-
ется, что способ рассуждений исходит из простого вывода,
вывода с помощью И между двумя свидетельствами и вы-
вода с одним ИЛИ между двумя свидетельствами.
136
/* Простая импликация */
infer (Nodel,Ct) if
imp(s,Use,Nodel,Sign,Node2,-,-,Cl),
allinfer (Node2,C2),
find-multiplier(Sign,Mult,dummy ,0),
Ct-Mult*Cl *C2.
/* Импликация с И в посылке */
infer(Nodel.Ct) if
imp (a,Use,Node 1 ,SignL,Node2,SignR,Node3,Cl),
allinfer (Node2,C2),
allinfer (Node3,C3),
find-multiplier(SignL,MultL,SignR.MultR),
C2S - MultL • C2, C2S - MultL ♦ C2,
min(C2S,C3S,CX), Ct - CX • Cl.
/* Импликация с ИЛИ в посылке */
infer(Nodel,Ct) if
imp(a,Use,Nodel,SignL,Node2,SignR,Node3,Cl),
allinfer (Node2,C2),
allinfer (Node3,C3),
find-multiplier(SignL, MultL, SignR,MultR),
C2S - MultL • C2, C2S - MultL • C2,
max(C2S,C3S,CX), Ct - CX • Cl.
Все правила утверждают, что в узле можно сделать вы-
вод, если в нем есть связь-импликация с одним или двумя
узлами более низкого уровня и если нам известны коэф-
фициенты определенности в этих узлах. Значение этого
коэффициента определенности мы получили из другого
правила, называемого allinfer. Такие узлы более низкого
уровня образуют посылку вывода. Коэффициенты опре-
деленности, возвращаемые allinfer для узлов посылки,
впоследствии могут изменить знак, если включено отри-
цание. В конце концов коэффициенты определенности
будут скомбинированы в соответствии с механизмами,
которые мы обсудили при вычислении определенностей
вывода.
Правило find-multiplier используется для получения
результата отрицаний свидетельств и возвращает коэф-
фициенты Mult, MultL и MultR, которые равны -1 или 1.
Они используются для изменения знака соответствующих
коэффициентов определенностей, когда этого требует от-
рицание. Посмотрите, как определяется правило find-
multiplier:
/• Это используется для простой импликации •/
find-multiplier (pos, 1,dummy ,0).
find-multiplier(neg,-l,dummy ,0).
/* Это используется для И и ИЛИ */
find-multiplier (pos, 1 ,pos, 1).
find-multiplier (pos, 1 ,neg,-l).
find-multiplier (neg,-1 ,pos, 1).
find-multiplier (neg,-1 ,neg,-l).
137
Позднее мы обсудим правило allinfer, а пока вернемся
к правилу infer, которое позволяет вычислить коэффици-
ент определенности конкретного узла, поэтому мы можем
использовать его в конечных узлах. Почему вообще мо-
жет потребоваться вывод в конечном узле? Причина
заключается в том, что рекурсивному правилу верхнего
уровня может потребоваться образование связей с основа-
нием дерева. Когда мы пытаемся сделать вывод, касаю-
щийся основания дерева, программа может лишь
запросить коэффициент Определенности в интересующем
нас узле. Больше она ни; на что не способна, не считая
предварительной проверки базы данных на случай, что
ответ уже может быть известен из предыдущих вопросов.
Если пользователь вводит дополнительную информацию,
то последняя принимается так, чтобы ее не надо было
уточнять.
infer(Nodel,Ct) if
terminal-node (Node 1) .evidence (Node 1 ,Ct),!.
infer (Node 1, Ct) if
terminal-node (Node 1),
write ("Каков коэффициент определенности узла “.Nodel),
nl.readreal(Ct),
asserta (evi dence (Node 1, Ct)), 1.
Итак, что же представляет собой правило allinfer, яв-
ляющееся составной частью всех простых правил infer?
Правило allinfer предназначено для обработки ситуации,
когда несколько отдельных правил вывода могут быть
применены в конкретном узле. Например, два правила
применяются и в С7, и в С8. Allinfer отыскивает отдель-
ные правила вывода, которые могут повлиять на ситуа-
цию. Оно использует каждое найденное правило и
получает для него оценку коэффициента определенности.
Оценки накапливаются, и создается одно число, отража-
ющее всю информацию по данному узлу.
allinfer(Node.Ct) if
findall (Cl .infer (Node,Cl) .Ctlist),
combine (Ctlist,Ct).
Включение правила allinfer в конкретный узел застав-
ляет систему проводить все возможные рассуждения для
поиска коэффициента определенности в этом узле. Если
узел поддерживается только одним правилом, то действие
allinfer сводится к единичному использованию простого
правила infer.
Самая трудная операция, выполняемая программой, -
комбинирование коэффициентов определенностей в один
138
с помощью отдельных правил, каждое из которых поддер-
живает данный узел. Это сделано в соответствии с алго-
ритмами, описанными в разд. 5.3.6. Предикат combine
берет своим первым аргументом список определенностей
и вычисляет своим вторым аргументом единую комбини-
рованную определенность.
Combine ([Ct],Ct).
Combine ([-1,1],0).
Combine([l,-l],0).
Combine([Cl ,C2] ,Ct) if Cl > - 0, C2 > - 0,
Ct-Cl +C2____C1*C2.
Combine([Cl ,C2] ,Ct) if Cl < 0, C2 > 0,
Ct-Cl +C2+ C1*C2
Combine([Cl ,C2] ,Ct) if Cl < 0, C2 > - 0,
absvalue (Cl ,Z1), absvalue (C2,Z2) ,min (Z1 ,Z2,Z3).
Ct-(C1+ C2)/(l — Z3).
Combine ([Cl, C2] ,Ct) ifC2>0, Cl >-0,
absvalue (Cl ,Z1), absvalue (C2,Z2) ,min (Z1 ,Z2,Z3).
Ct-(C1+ C2)/(l — Z3).
Для предиката combine требуется абсолютное значение
определенной пользователем функции, что здесь и пока-
зано. При решении некоторых задач возникают за-
труднения в работе со встроенной функцией абсолютных
значений (фирмы Borland), поэтому мы избегаем ее ис-
пользования.
absvalue(X,Y) if X - 0, Y - 0,!.
absvalue(X,Y) if X > 0, Y - X,!.
absvalue(X,Y) if X > 0, Y - -X,!.
Нам осталось рассмотреть несколько вопросов. В об-
суждаемой архитектуре было принято несколько огра-
ничений, облегчающих восприятие структуры, но
снижающих ее полезность. Так, FUZZYNET будет более
эффективной программой, если мы позволим ей делать
заключение на основе неограниченного числа поддержи-
вающих правил вывода. Речь идет о правиле combine. Для
создания композиции коэффициентов определенностей
оно может получать их от одного, максимум двух поддер-
живающих правил.
Как можно снять такое ограничение? Возможно, нам
потребуются некоторые определения правил типа следу-
ющих:
combine( [Cl ,С2,СЗ] ,Ct) if ?
или
combine( [Cl ,C2,C3,C4] ,Ct) if ?
139
Нам тогда придется использовать пошаговую страте-
гию, что не является лучшим вариантом, так как резуль-
тирующие правила становятся слишком громоздкими.
Однако мы уже видели реальный ответ. Нужно использо-
вать подход изменений и дополнений, который обсуждал-
ся в разд. 5.3.5. Суть его сводится к получению списка
коэффициентов определенностей, каждый из которых
вносит свой вклад в конечный вывод, и их попарное объе-
динение вплоть до получения одного коэффициента
определенности, отражающего все повлиявшие на нее
компоненты.
При использовании подхода изменений и дополнений
правило combine остается прежним. Оно определяет ре-
зультаты совместного применения двух правил. Однако
нам требуется правило более высокого уровня, позволяю-
щее применять правило combine более интеллектуаль-
ным образом, чем это делалось до сих пор. Назовем его
supercombine и покажем, как оно выглядит:
supercombine ([Ct] ,Ct) if!.
supercombine([Cl ,C2] ,Ct) if combine([Cl ,C2] ,Ct),!.
supercombine([Cl ,C21T] ,Ct) if combine([Cl ,C2] ,C3) ,
append ([C3] ,T,TL),supercombine (TL,Ct),!.
Если в выводе участвуют одно или два правила, то
supercombine действует так же, как combine. При боль-
шом же числе правил supercombine с помощью combine
объединяет два первых коэффициента определенности,
затем преобразует (укорачивает) список коэффициентов
определенностей, с которыми оно имеет дело, вызывая се-
бя рекурсивно для последующей работы со списком. Это
продолжается до тех пор, пока в списке не останется один
пункт.
Последнее, что нам потребуется для включения неог-
раниченного числа поддерживающих правил, - это запи-
сать правило allinfer таким образом, чтобы оно могло
использовать supercombine, а не combine.
allinfer(Node,Ct) if
findall (Cl,infer (Node, C1),Ctlist),
supercombine (Ctlist,Ct).
При первом знакомстве c FUZZYNET у нас было еще
одно ограничение, уменьшающее полезность программы:
мы предполагали, что все правила обратимы. На практи-
ке большинство правил являются необратимыми, что дол-
жен учитывать механизм вывода.
Рассуждения в такой системе строятся с помощью
140
правил infer, которые нам уже известны. Эти правила
действуют в любом интервале определенности посылок,
поэтому они, безусловно, пригодны для работы с обрати-
мыми правилами. Мы можем сделать небольшое дополне-
ние к внутренней структуре любого правила infer, так что
оно будет сочетаться и с необратимым типом имплика-
ции. Поместим в каждое правило infer предложение, ко-
торое позволит определить, используется ли правило в
своем основном интервале или нет. При положительном
ответе это определяющее предложение его же и выведет,
а при отрицательном результатом окажется 0. Получен-
ное число будет использовано для умножения тех коэф-
фициентов определенностей, которые выдаст правило
infer, как если бы мы его не задействовали. Если правило
применено верно, то мы умножим на единицу его выводы,
и ничего не изменится. В противном случае мы умножим
его выходные величины на 0 и получим коэффициент оп-
ределенности, равный 0, что эквивалентно использова-
нию правила не в первую очередь.
Предложение, которое мы собираемся добавить в пра-
вила вывода, имеет вид:
qualifier(Use.C.Qmult) if Use - “r”,Qmult-1,1.
qualifierCUse.C.Qmult) if Use - “n",C > - O.Qmult -1,!.
qualifierCUse.C.Qmult) if Use - “n",C < O.Qmult - 0,!.
У него три аргумента: первый хранит информацию о
типе используемой импликации (обратима она или нет),
второй содержит коэффициент определенности посылки
для этого вывода. Третий является выходной переменной,
значения которой 1 или 0 используются для умножения.
Напомним, как выглядит правило И до тех пор, пока
его не использовали для дифференциации между обрати-
мыми и необратимыми правилами:
/* Импликация с И в посылке */
infer(Nodel.Ct) if
imp(a,Use,Nodel ,SignL,Node2,SignR,Node3,Cl),
allinfer (Node2,C2).
allinfer (Node3.C3),
find-multiplier(SignL,MultL,SignR,MultR),
C2S - MultL • C2, C2S - MuItL • C2,
min(C2S,C3S,CX), Ct-CX • Cl.
А теперь покажем его co всеми внесенными нами изме-
нениями.
/* Импликация с И в посылке */
infer (Node 1, Ct) if
imp (a.Use,Node 1 ,SignL,Node2,SignR,Node3,Cl).
allinfer (Node2,C2),
141
allinfer(Node3,C3),
flnd-multiplier(SignL,MultL,SitnR,MultR),
C2S - MultL * C2, C2S - MultL • C2,
min(C2S,C3S,CX),
qualifier(Use,CX,Qmult)
Ct-CX*Cl ‘Qinult
Таким же образом следует поступать с правилом ИЛИ
и простым правилом вывода.
Итак, у нас есть надежная система для рассуждений в
условиях неопределенности в традиционной системе
EMYCIN. Однако для создания законченной экспертной
системы требуются еще два правила. Одно из них - уп-
равляющее (driver) правило, которое действует на самом
высоком уровне и использует allinfer для выявления и
сравнения узлов гипотез. Оно выглядит очень просто, на-
пример:
driver if hypothesls-node(X),
allinfer (X,Ct),
write ("Коэффициент определенности “,X, "равен “,Ct),nl,
fail.
где fail используется для выявления всех возможностей
посредством механизма возврата. Обычно обеспечение
системы ввода-вывода и общий интерфейс, использую-
щий окна и меню, предлагаются на самом высоком уров-
не, и правило driver будет в этом случае значительно
более сложным. В гл. 7 мы рассмотрим один из способов
объединения всех его частей.
Второе правило jump, применяемое к конкретной за-
даче, которую должна решить система. В разд. 7.3 мы
покажем установку правил jump для экспертной систе-
мы, выдающей рекомендации по капиталовложениям,
так что, если хотите, вы уже сейчас можете посмотреть
весь пример целиком.
Упражнения
1. Рассмотрим набор шариков для пинг-понга, помеченных, как показа-
но на рисунке. Вычислите следующие вероятности:
р(В1А);
р(А1В);
р(В1не А);
р(С1Аили В);
р(В1СинеВ).
142
Номер мяча Метка
1 А С
2 С
3 В
4 ВС
5 В
6 АВ
7 А
8 АВС
9 С
10 ВС
2. Набор шариков для пинг-понга помечен буквами А и В. Причем
р(А)-.6,
р(В)-.9
Что можно сказать о р(А и В), о р(А или В)?
3. Допустим, в задаче изучения потребительского спроса на все вопросы
получены ответы ДА или НЕТ. Сосредоточим внимание на двух кон-
кретных вопросах, которые назовем “вопрос А” и “вопрос В”. Потре-
бители имеют тенденцию отвечать на эти вопросы одинаково, т.е. те,
кто ответил ДА на вопрос А, вероятно, так же ответят и на вопрос В, а
те, кто ответил НЕТ на вопрос А, вероятно, так же ответят и на воп-
рос В.
Пусть р(А) - вероятность ответа ДА на вопрос А. Нам известно, что
р(А)-.б
и ответы на оба вопроса значительно коррелируют друг с другом, поэто-
му:
р(В1А)-.9;р(А1В)-.8;
р(не В I не А) - .85.
Вычислите следующие вероятности:
р(В);
р(не А I не В);
р(АиВ).
Какова вероятность того, что в любом испытании ответы на вопросы А и
В будут одинаковы?
4. Укажите, будет ли обратимым каждое из следующих правил.
Если команда делает хорошие броски,
то она хорошо играет.
Если сейчас 1988 г.,
то будут выборы президента.
Если в районе много детей,
то плата в школах высока.
Если человек жив,
то в нем течет кровь.
Если были ранние заморозки,
то урожай персиков будет плохим.
5. Здесь речь идет об использовании биполярных коэффициентов опре-
деленности.
(а) Предположим, вы получили следующую информацию:
143
Если (А или В), то С; ct(импликации) - .8 (nrev)
и
ct(A)-.8;
ct(В) - .8.
Каков коэффициент определенности посылки для этого правила? Ка-
ков коэффициент определенности заключения?
(б) Предположим, вы получили следующую информацию:
Если (R и не S), то С; ct(импликации) - .95 (rev)
и
ct(R) - .8;
ct(S)-.6.
Каков коэффициент определенности посылки для этого правила? Ка-
ков коэффициент определенности заключения?
(в) Предположим, вы получили следующую информацию:
Если (не X), то С; ct (импликация) - .7 (nrev)
и
ct(X)-.8.
Каков коэффициент определенности посылки для этого правила? Ка-
кова определенность заключения?
6. Если все правила, указанные в упражнении 5, были бы частью одной
рассуждающей системы, а посылки соответствовали бы данным в оп-
росе, каким бы оказался коэффициент определенности заключения
С?
7. Выпишите все правила, подразумеваемые в сети вывода, изображен-
ной на рисунке. Каковы коэффициенты определенности Cl, С2, СЗ,
С4, С5иС6?
8. Найдите середину таблицы, представленной на рис. 5.2. Почему при
горизонтальном или вертикальном движении от этой точки встре-
чаются одни и те же последовательности? Почему таблица симмет-
рична относительно правой диагонали, но не относительно левой
диагонали? Почему в верхнем левом и правом нижних углах таблицы
находятся нули?
9. Напишите новое правило combine, обеспечивающее получение бипо-
лярных коэффициентов определенности из двух правил и объединя-
ющее их в соответствии со случайными значениями, хранимыми в
таблице, а не в соответствии с использованным нами алгоритмом.
Обратите внимание на то, что на рис. 5.2, по существу, и показана
такая таблица, но она создавалась в соответствии с алгоритмом. В
действительности все правила combine всегда случайны.
6. СИСТЕМЫ, ОБЪЯСНЯЮЩИЕ
СВОЕ ПОВЕДЕНИЕ
6.1. МЕХАНИЗМ ОБЪЯСНЕНИЯ
Система вывода, способная объяснить свое поведение,
будет внушать большее доверие своим пользователям и
казаться более разумной. Обычно есть два вопроса, кото-
рые пользователь хотел бы для себя прояснить во время
работы с системой. Когда система запрашивает какое-
либо свидетельство, пользователь может поинтересо-
ваться:
“Почему ты об этом спрашиваешь?"
Когда же система приходит к некоторому заключению,
пользователю, как правило, хочется спросить:
“Как ты пришла к такому заключению?"
В этой главе исследуются простые механизмы, предла-
гающие реализацию вопросов обоих типов.
Демонстрируемые здесь техника и программы исполь-
зуют сеть вывода, приведенную в качестве примера на
рис. 6.1. В этой сети есть несколько слоев импликаций,
включая узлы И и ИЛИ. Она проще, чем те деревья
вывода, которые мы уже изучили. Каждое заключение
поддерживается только одним правилом вывода, и пред-
полагается, что все правила обратимы. Эти ограничения
наложены для того, чтобы дать нам простой, легко пони-
маемый пример. Однако механизм объяснений, который
мы собираемся обсудить, применим и для более сложных
комбинаций правил, которые были рассмотрены выше.
Напомним, как представляется пример из рис. 6.1 в
форме правил:
imp(o,r,c4,pos,cl ,pos,c2,0.8).
imp(a,r,cl ,pos,el ,pos,e2,0.7).
imp(o,r,c2,neg,e3,pos,c3,0.9).
Imp(a,r,c3,pos,e4,pos,e5,0.8).
Определим для этой рассуждающей системы конечные
узлы дерева:
terminal-no de (el)
terminal-node (е2)
terminal-node (еЗ)
terminal-node (е4)
terminal-node (е5)
146
Рис. 6.1. Простая сеть вывода
Сеть служит для иллюстрации механизмов объяснений. Ответ на
вопрос "почем?* включает перечисление правил, с которыми работа-
ла система, в обратном порядке, т.е. от самого последнего и до пра-
вила, расположенного в вершине дерева. Ответ на вопрос “как” начи-
нается с правила, поддерживающего тот узел, о котором мы хотим
спросить. Чтобы это правило можно было использовать, его посылка
должна считаться истинной. Данный ответ и объясняет, как это бы-
ло сделано
Вопросы как и почему имеют некоторые отличительные
особенности, влияющие на их использование в автомати-
ческих рассуждающих программах. В дереве рассуждений
они могут располагаться в нескольких местах на его про-
тивоположных концах. Разумно обеспечить пользовате-
лю возможность задавать вопросы почему, когда система
работает с импликациями, находящимися в основании де-
рева, т.е. когда пользователя нужно просить о введении
данных.
При работе с узлами верхних уровней дерева системе
никогда не требуется запрашивать дополнительную ин-
формацию. Эти узлы являются заключениями, скорее
самостоятельно выведенными системой, а не свидетельст-
вами, о которых она должна спросить, поэтому вопрос
почему в таком случае будет неуместным.
Однако цель проводимого рассуждения сводится к вы-
работке заключений на верхнем уровне дерева. Система
старается проследить за всей информацией, относящейся
к заключениям, и поэтому когда она выдает результаты
147
рассуждений применительно к этим узлам, есть смысл за-
давать ей вопрос как.
Есть различие и во времени задания вопросов. Вопрос
почему задается вначале, а затем в непредсказуемых мес-
тах в процессе рассуждения. Система запрашивает ин-
формацию, когда обнаруживает, что она ей нужна.
Вопросы как обычно задаются в конце, когда рассуждение
закончено, и система сообщает о результатах.
Обратите внимание на то, что обсуждаемый в этой гла-
ве материал является уточнением описания программного
кода сети вывода, представленной в гл. 5. Поэтому если
вы плохо помните содержание этой главы, просмотрите ее
еще раз.
6.2. ОТВЕТЫ НА ВОПРОСЫ “ПОЧЕМУ”
Давайте теперь точно сформулируем, какой тип по-
ведения мы ожидаем от системы объяснения, и это не-
посредственно приведет нас к механизму, который
необходимо спроектировать.
Безусловно, работая с основанием дерева, система дол-
жна запрашивать свидетельства. Когда она имеет дело с
конечными узлами, только пользователь может подска-
зать ей коэффициент определенности для каждого блока
информации. Однако если системе нужна дополнитель-
ная информация, то вместо ввода коэффициента опреде-
ленности пользователь может набрать на клавиатуре
слово “почему” для получения объяснений относительно
хода рассуждений. Обратившись к рис. 6.1, предположим,
что система запросила свидетельства el, е2 и еЗ, а затем
ей потребовалось и е4. Приведем образец типичного диа-
лога:
С: Введите п (почему) или коэффициент определенности для узла е4.
П:п
С: Пытаюсь установить сЗ с помощью импликации е4 and е5 сЗ
Введите п (почему) или коэффициент определенности для узла е4.
П:п
С: Пытаюсь установить с2 с помощью импликации not еЗ ог еЗ “^с2
Введите п (почему) или коэффициент определенности для узла е4.
П:п
С: Пытаюсь установить с4 с помощью импликации cl or с2 ~»с4
Введите п (почему) или коэффициент определенности для узла е4.
П: .85
Вот и все объяснение, которое система может предло-
жить, отвечая в приведенном примере на вопросы почему.
148
Она просто последовательно перечисляет свои все услож-
няющиеся цели. Эти цели полностью зависят от вывода,
получаемого в основании дерева. Когда в конце концов
пользователь вводит коэффициент уверенности для е4,
рассуждение продолжается с того места, где оно было пре-
рвано задаваемыми вопросами.
Итак, вам стало понятным, что требуется для ответа на
вопросы почему. Если система задействует какое-либо
правило вывода и собирает подтверждающие свидетельст-
ва, это правило в удобном виде должно быть помещено в
специальный стек, используемый для объяснений. В тот
момент, когда система собирается прекратить работу с
правилом вывода в определенном узле, последним шагом
должно быть извлечение правила из стека. В результате в
стеке будут сохраняться следы, по которым в любой мо-
мент можно увидеть, над чем сейчас работает система.
Назовем эту структуру данных “стек ПОЧЕМУ”.
В качестве примера рассмотрим дерево, изображенное
на рис. 6.1. Будем наблюдать за стеком ПОЧЕМУ, в то
время как система путем обратного рассуждения собирает
свидетельства о верхнем узле с4. Первое, что она делает,
- это помещает запись об использовании правила, для ко-
торого с4 является заключением, в стек ПОЧЕМУ. Фор-
мат элементов стека почти совпадает с формой записи
импликаций в системе. Но здесь имеется одно отличие.
Правила imp удобно переименовать в dbimp, чтобы напо-
минать нам, что эта форма является формой трассировки
стека ПОЧЕМУ, а не базисным правилом, связанным с
сетью вывода:
Стек ПОЧЕМУ: dbimp(o,r,c4,pos,cl,poe,c2,0.8)
Для работы с узлом с4 система должна использовать
вывод, связанный с cl. Применяя правило, основанное на
cl, она помещает запись об этом в стек. Теперь стек вы-
глядит так:
Стек ПОЧЕМУ: dbimp(a,r,cl,pos,el,pos,e2,0.7)
dbimp (o,r,c4,pos,cl ,ро$,с2,0.8)
Затем пользователь получает запрос о el и е2, и вычис-
ляется коэффициент определенности для cl. Закончив ра-
боту с cl, система обработает стек и удалит из него
верхнюю запись.
Далее работа продолжается над тем первичным выво-
дом, где нужно установить с4. Здесь применяется правило
с2 и делается запись в стек ПОЧЕМУ:
Стек ПОЧЕМУ: dbimp(o,r,c2,neg,e3,pos,c3,0.9)
149
dbimp(o,r,c4,pos,cl ,pos,c2,0.8)
Затем система запросит пользователя о еЗ. Предполо-
жим, он указал коэффициент определенности. Тогда сис-
тема попытается сделать вывод, поддерживающий сЗ. В
стек ПОЧЕМУ будет помещена соответствующая запись:
Стек ПОЧЕМУ: dbimp(a,r,c3,pos,e4,pos,e5,0.8)
dbimp(o,r,c2,neg,e3,pos,c3,0.9)
dbimp(o,r,c4,pos,cl ,pos,c2,0.8)
Для вычисления коэффициента определенности сЗ
система спрашивает пользователя о е4. Допустим, в
этом месте пользователь спрашивает систему “почему?”.
Посмотрите на стек. В нем содержится трассировка
всего пути в обратном направлении до самого высшего
вывода. Для ответа на первый вопрос почему система
должна только извлечь данные из стека и сконструиро-
вать ответ из
dbimp(a,r,c3,pos,e4,pos,e5,0.8)
Конструирование ответа означает распаковку инфор-
мации в более удобную для чтения форму, и, конечно,
для этой цели очень подходит Пролог. Ответ пользовате-
лю будет выглядеть как-нибудь так:
“Пытаюсь вывести сЗ, пользуясь импликацией: е4 and е5 “*03"
потому что здесь показано именно то, над чем сейчас ра-
ботает система.
На каждый последующий вопрос почему система отве-
чает, извлекая следующий элемент из стека ПОЧЕМУ и
строя из него ответ. Фактически тот диалог между систе-
мой и пользователем, который мы рассмотрели ранее,
точно отражает ситуацию работы со стеком.
Когда пользователь перестает задавать вопрос почему
и, наконец, сообщает численное значение коэффициента
определенности е4, стек ПОЧЕМУ необходимо возвра-
тить к тому состоянию, которое он имел в момент
приостановки рассуждений, чтобы его можно было ис-
пользовать при поступлении очередной серии вопросов
почему.
Подведем итоги изложенному выше. Ответы на вопро-
сы почему даются посредством указания пути от некото-
рого свидетельства, расположенного в основании дерева,
до самой вершины. Стек ПОЧЕМУ имеет тенденцию к
150
уменьшению, так как в нем хранится только путь от верх-
него вывода до того свидетельства, которое в данный мо-
мент представляет интерес. Все остальные области дерева
не имеют к этому отношения. Средний размер стека ПО-
ЧЕМУ отражает среднюю глубину дерева. Максимальный
же размер его будет определяться самым длинным путем
от верхнего узла до основания дерева.
6.3. ОТВЕТЫ НА ВОПРОСЫ “КАК”
Понятно, что вопрос как может требовать перечисле-
ния всех свидетельств, лежащих в основе сделанного сис-
темой заключения. Все свидетельства означают ту часть
дерева, которая расположена ниже данного узла, потому
что она влияет на информацию, выдаваемую системой об
этом узле.
При определении количества информации, которую
нужно сообщить пользователю в ответ на его вопрос как
возникают некоторые трудности. Действительно ли поль-
зователь хочет увидеть все дерево, и если это так, то в
каком порядке он желает получать имеющиеся выводы?
Мы попытаемся наметить путь решения этой пробле-
мы, причем самым простым образом. Нужно создать ме-
ханизм, позволяющий открыть систему в некоторых
стратегических точках для вопросов как. Тогда пользова-
тель сможет задавать вопросы о любом узле, с которым
система закончила работу. Спрашивая об узле и называя
его имя,пользователь получит сообщение только о выводе
(выводах), непосредственно поддерживающих данный
узел. Например, вопросы как должны быть обязательно
разрешены по завершении рассуждения на верхних узлах
дерева вывода. По желанию пользователя такие вопросы
должны быть разрешены и в других местах. Приведем не-
сколько диалогов, которые могли бы состояться в нашем
примере:
С: Введите к (как) имя узла, или п (продолжить)
П: кс4
С: с4 присвоен коэффициент определенности .68 на основе:
cl огс2 “>с4
Правило обратимо
Коэффициент определенности с 1 равен 0.6
Коэффициент определенности с2 равен 0.85
Коэффициент определенности импликации равен .8
Правило, использованное в одиночку, предполагает коэффициент
определенности .68
Введите к (как) имя узла или п (продолжить)
151
Это определенно дает полную информацию о выводе,
поддерживающем 9просы о заключениях более низкого
уровня (возможно, о cl или с2).
Механизм вывода здесь очень простой. Необходимо
лишь всякий раз, когда вывод для данного узла заканчи-
вается, помещать в базу данных предложение, содержа-
щее информацию о том, какое правило (правила)
применялось и какой коэффициент определенности был
предложен для этого узла. При вводе пользователем воп-
роса как типа
к с4
система должна только вычленить имя узла и далее ис-
пользовать его при просмотре базы данных для поиска
предложения (или предложений), подводящего итоги вы-
воду, поддерживающему этот узел. Затем должен быть
сгенерирован хороший ответ.
В нашем примере каждый узел поддерживался только
одним правилом. Однако обобщение на случай использо-
вания нескольких правил очевидно. Если несколько пра-
вил использовалось совместно для совершения вывода, то
объяснение как будет содержать вычисленную компози-
цию коэффициентов определенности и описывать резуль-
таты, вытекающие из применения каждого правила, как
если бы они были независимы друг от друга. В этом слу-
чае был бы возможен подобный диалог:
С: Введите к (как) имя узла или п (продолжить)
П: к с8
С: с8 присвоен коэффициент определенности .724 на основе:
с5 andc7 "^св
Правило обратимо
Коэффициент определенности с5 равен 0.75
Коэффициент определенности с7 равен 0.5
Коэффициент определенности импликации равен .8
Правило, использованное в одиночку, предполагает коэффициент
определенности .4
not сб “*с8
Правило необратимо
Коэффициент определенности сб равен -0.6
Коэффициент определенности импликации равен .9
Правило, использованное в одиночку, предполагает коэффициент
определенности .5
Введите к (как) имя узла или п (продолжить)
152
6.4. СЕТЬ ВЫВОДА
С ВОЗМОЖНОСТЯМИ ОБЪЯСНЕНИЯ
Наши новые возможности объяснения требуют измене-
ния использовавшихся ранее базисных правил вывода, а
именно включения в них предикатов, записывающих ин-
формацию для целей трассировки. Мы также должны раз-
работать модули, позволяющие ставить вопросы как и
почему и отвечать на них. Начнем с рассмотрения изме-
нений, которые необходимо внести в правила вывода.
В гл. 5 вы видели, что правило И, включающее в себя
все уже известные вам свойства, приняло такую форму:
Infer (Node, Ct) if
imp(a, Use, Node, SignL,Nodel ,SignR,Node2,Cl),
allinfer (Nodel ,C2), allinfer (Node2,C3),
find-multiplier (SignL,MultL,SignR,MultR),
C2S - MultL * C2.C3S - MultR * C3,min(C2S,C3S,CE),
qualifier (Use,CE,Qmult),Ct- CE * Cl * Qmult.
Согласно этому правилу мы сможем сделать вывод, что
узел имеет коэффициент определенности Ct, если устано-
вим некоторые другие факты. Во-первых, должен быть
механизм, определяющий наличие импликации И в дан-
ном месте сети. Мы также должны найти коэффициенты
определенности двух других узлов, входящих в операции
И (используя правило allinfer). Далее, если включено
отрицание, то нужно привести в порядок знаки коэф-
фициентов определенности. Суммарный коэффициент
определенности свидетельства для такого правила равен
минимуму коэффициентов определенности двух узлов,
участвующих в операции И. Затем предикат qualifier про-
веряет, используется ли правило внутри допустимого ин-
тервала. На последнем шаге в результате перемножения
коэффициентов определенности свидетельства и импли-
кации и умножения результата на проверочное число,
выведенное предикатом allinfer, получается ответ. Это ба-
зис правила И.
Правило, разрабатываемое с целью трассировки объяс-
нения, выглядит так:
infer(Node,Ct) if
imp(a,Use,Node,SignL,Nodel,SignR,Node2,Cl),
asserta(dbimp((a,Use,Node,SignL,Nodel,SignR,Node2,CD),
asserta(tdbimp( (a,Use,Node,SignL,Nodel ,SignR,Node2,Cl)),
allinfer(Nodel ,C2), allinfer(Node2,C3),
find-multiplier(SignL,MultL,SignR, MultR),
C2S - MultL • C2.C3S - MultR • C3,min(C2S,C3S,CE),
qualifier (Use,CE, Qmult),Ct - CE ♦ Cl ♦ Qmult,
assertz (infer-summary (
153
imp (a,Use,Node,SignL,Nodel ,SignR,Node2,Cl) ,Ct)),
retract (dbimp ((a,Use,Node,SignL,Nodel ,SignR,Node2,Cl)),
retract (tdbimp ((a,Use,Node,SignL,Nodel ,SignR,Node2,Cl)).
Размер правила почти удвоился за счет дополнений,
необходимых для поддержания объяснений. Исследуем
эту структуру. В начале правила сразу после определения
возможной импликации И в базу данных помещаются два
факта. Здесь применяется команда asserta, а это означа-
ет, что база данных будет действовать как стек. Включен-
ные предложения являются точными копиями
используемых в данный момент фактов импликации, не
считая изменения имени. В этом месте создается стек ПО-
ЧЕМУ. Команда asserta применена дважды, потому что
желательно создать две копии стека ПОЧЕМУ. Механизм
ответов на вопросы почему изменяет стек ПОЧЕМУ, и
вторая копия служит для его восстановления после окон-
чания процесса объяснения.
В конце правила И, где использована команда retract,
трассировка вывода удаляется из стека ПОЧЕМУ, так как
возможность задать вопрос почему исключается, когда
контроль доходит до этого места. Каждый новый вопрос
почему пойдет по другому пути в сети.
В конце правила И находится предложение asserta,
имеющее иную цель. Оно поддерживает объяснение как.
Когда управление достигает этой точки, вывод, описывае-
мый правилом И, получает коэффициент определенно-
сти, и система заканчивает работу с ним. Теперь мы
можем объединить все сделанные шаги и записать их в
базу данных с помощью сложного факта, называемого
infer-summary.
Итак, где находятся объяснения почему и как? Объяс-
нения как более доступны, поэтому мы сначала опишем
их. Чтобы решить, куда нужно включать объяснения как,
мы должны рассмотреть, как выглядят управляющие пра-
вила (драйверы), продвигающие систему. Существует
много способов создания такого драйвера, один из кото-
рых мы здесь покажем. Предположим, драйвер содержит
правило, генерирующее все ответы одновременно, и пото-
му за ним следует предложение, показывающее результа-
ты:
exsys-driver if getallans, showresults,!.
Предположим также, что мы определили как гипотети-
ческий каждый узел, для которого собираемся вычислить
коэффициент определенности, например:
hypothesis-node (с4).
154
В системе есть предикат answer, задачей которого яв-
ляется выполнение всех рассуждений, связанных с любым
гипотетическим узлом. С помощью факта danswer он за-
писывает имя узла и полученный коэффициент опреде-
ленности в базу данных. Приведем фрагменты драйвера,
связанные с получением ответа:
getallans if not (pre pare-answer).
prepare-answer if answer (X,Y), fail.
answer (X,Y) if
hypothesis-node (X),allinfer(X,Y), assert(danswer(X,Y)) •
Предикат prepare-answer оканчивается fail, чтобы за-
ставить систему использовать answer всеми возможными
способами при возвращении назад. Предикат getallans со-
держит оператор not, потому что prepare-answer переста-
нет действовать после успешного завершения работы.
После генерации всех ответов начинают действовать
предложения драйвера, выводящие ответы на экран:
showresults if not (displayall).
displayall if display-one-answer,fail.
display-one-answer, if danswer (X,Y), clearwindow,
write ("Для этой гипотезы: “),nl,
writer “,X),nl,
write ("коэффициент определенности равен: M,Y),nl,nl,
not(how-describer (X)).
Правило display-one-answer показывает все, относяще-
еся к одному заключению. Оно выводит один ответ и за-
тем передаст управление механизму объяснения как. Оно
называется how-describer и выглядит так:
how-describer(Node) if
repeat.nl,
write ("Введите к (КАК) имя узла или п (продолжить)."),
nl,readin (Reply) ,nl,how-explain(Reply),!.
При выполнении how-describer на экран выводится
подсказка:
Введите к (КАК) имя узла или п (продолжить)
В how-describer входит правило более низкого уровня
how-explain, которое обрабатывает ответы пользователя:
how-explain (Reply) if Reply - “п".
how-explain (Reply) if
fronttoken (Reply,-,X1),fronttoken (XI ,X,-),
infer-summary(imp(-,-,X,-,-),-) ,c!earwindow,!,
write ("Правила, которые участвуют в выводе этого заключения-
ния:"),п!,п1,
155
infer-summary (imp (A, Al ,X,R,S,C,D,E) ,F),
write ("Выведено:",X) ,nl,gettype (A,Z),
write ("из “,Z),nl,
write ("посылкой 1 была “,S),nl,
write ("посылкой 2 была “,D),nl,
write ("Правило, использованное в одиночку, дало коэффициент оп-
ределенности: M,F),nl,nl,fail.
how-explain (Reply) if
fronttoken (Reply,-,XI),fronttoken(XI ,X,-),
terminal-node (X) .evidence (X,C),
write ("Сообщено, что для “ ),nl, write (*",X),nl, write ("коэффициент
определенности равен:",C) ,nl,fail.
Если пользователь печатает “п”, то how-describer за-
канчивает работу, так как пользователь удовлетворен от-
ветом. Если пользователь печатает “к имя-узла”, то
начинает действовать одно из двух других предложений
how-explain, перечисляющее результаты вывода, влияю-
щего на узел, о котором сделан запрос. Эти сложные
версии how-explain всегда заканчивают свою работу неу-
дачей, потому что необходимо произвести возврат. Таким
образом выявляются все возможные выводы, если для
поддержки текущего узла использовалось более одного
правила. Возврат на более высокий уровень заставит сис-
тему вывести на экран запрос:
Введите к (КАК) имя узла или п (продолжить)
В конечном счете пользователь введет V, система пе-
рейдет к другому пункту работы. Это все, и мы завершим
обсуждение механизма объяснения как.
Читатель, вероятно, заметил, что объяснения, данные
в этой части программы, менее разработаны, чем предла-
гавшиеся в разд. 6.2. Причина состоит в том, что мы хоте-
ли сохранить простоту программы.
Теперь рассмотрим механизм объяснения почему. Об-
ратите внимание на то, что в правилах вывода высокого
уровня нет места для объяснений почему. Такие вопросы
встречаются только на низких уровнях системы, где до-
стигается основание сети вывода, и где система должна
обращаться за объяснениями. Это система вывода с обрат-
ной цепочкой рассуждений. Мы достигаем основания се-
ти, используя несколько раз правило infer. В основании
сети в правиле infer должны быть дойолнительные пред-
ложения, которые управляют накоплением информации:
infer(Node.Ct) if
terminal-node (Node) evidence (Node,Ct) ,1.
infer (Node,Ct) if
terminal-node (Node),repeat,nl,
156
write ("Введите п (почему) или укажите коэффициент определенно-
сти",Node),
nl,readin (Reply),reply-to-input (Node, Reply, Ct),!.
Здесь два предложения, которые взаимодействуют с
конечными узлами. Первое предложение используется в
ситуации, когда коэффициент определенности конечного
узла был установлен с помощью предыдущих вопросов и
уже находится в базе данных. Второе предложение пре-
дусмотрено на случай, когда ничего не известно об узле и
нужно спросить о значении коэффициента определенно-
сти у пользователя. Это предложение выводит на экран
следующую подсказку:
Введите п (почему) или укажите коэффициент определенности для
узла е4
Получив ответ, оно передает управление правилу
reply-to-input,которое может как запрашивать информа-
цию, так и обслуживать объяснения почему. Вот как оно
выглядит:
reply-to-input (Node,Reply,Ct) if
not (isname (Reply),adjuststack,str-real (Reply,Ct),
asserts (evidence (Node, Ct),!.
reply-to-input(-,Reply,-) if
isname (Reply ,Reply-"w",nl,
dbimp(U,V,R,S,Sl ,X,Y,Y1),
why-describer (U, V,R,S,S 1 ,X, Y, Y1),
retract(dbimp(U,V,R,S,Sl,X,Y,Yl)),
putadjuststack,
pauser,!,fail.
Если пользователь ввел коэффициент определенности
для запрашиваемого узла, то выполняется первое предло-
жение reply-to-input,которое переводит введенные дан-
ные из строкового выражения в числовое и помещает его
как свидетельство в базу данных для последующих при-
менений. Оно также активирует правило adjuststack,
которое инициализирует стек ПОЧЕМУ, если он был из-
менен вопросом почему.
Вторая часть правила reply-to-input находится в сердце
объяснений почему. В начале работы, когда пользователь
задает вопрос почему, из стека ПОЧЕМУ извлекается за-
пись , в которой хранится только один шаг вывода. С по-
мощью подчиненной подпрограммы why-describer эта
запись используется для приготовления объяснения поль-
зователю. Затем запись удаляется из стека ПОЧЕМУ на
случай, если потребуются дальнейшие объяснения. Нако-
нец, устанавливается флаг, указывающий системе, что из
157
стека ПОЧЕМУ удалялись записи и после окончания объ-
яснений его надо будет восстановить.
Приведем правила, создающие ответ на вопрос ПОЧЕ-
МУ:
why-describer(U,Ul ,V,R,S,X,Y,Z) if clearwindow.nl,
U < > “s",gettype(U,UU),
write ("Пытаюсь использовать правило вывода типа “ ),
nl,write(UU),
write ("для проверки заключения: м),п1,
writer “,V),nl,write ("Посылка 1: “),
nl,getmode(R,RR),
write (" Эта посылка будет использована b",RR) ,nl
write ("Посылка 2: M),nl,getmode(X,XX),
write (" Эта посылка будет использована b",RR) ,nl
Write ("Коэффициент определенности импликации
равен: “) ,nl,l.
why-describer("s",Vl,V,R,S,X,Y,Z) if clearwindow,nl,
write ("Пытаюсь использовать правило вывода типа “ ),
nl,write ("простая импликация в поддержку
заключения:") ,nl„
write ("для проверки заключения: м) ,тд
write(" “,V),nl,write("nocbuiKa 1: “,S),
nl,getmode(R,RR),
write (" Эта посылка будет использована B",RR),nl
Write ("Коэффициент определенности импликации
равен: м),п1,1.
get-type ("а","импликация типа И"),
get-type ("о","импликация типа ИЛИ"),
get-type ("s", "простая импликация")
get-mode("pos","как ее видите")
get-mode ("pos","с отрицанием")
После получения ответа на вопрос почему система сно-
ва выведет запрос пользователю:
Введите п (почему) или укажите
коэффициент определенности для узла е4
Если пользователь продолжает вводить “п”, то с по-
мощью записей, хранящихся в стеке ПОЧЕМУ, ему бу-
дут даны более общие объяснения. В конце концов запас
объяснений исчерпается. Если после этого пользователь
введет коэффициент определенности как ответ на перво-
начальный вопрос, то система продолжит рассуждения.
Подсказка будет выводиться до тех пор, пока пользова-
тель не введет значение коэффициента определенности,
потому что второе предложение reply-to-input заканчи-
вается fail. Это вызывает возврат назад в правило infer,
которое снова запросит у пользователя данные или даль-
нейшие объяснения. Таков основной механизм объясне-
ний почему.
158
Упражнения
1. Изобразите сеть вывода, в основе которой лежат следующие факты,
выраженные с помощью импликации:
imp(a,r,c4,pos,c2,pos,e6,0.7).
imp (s,r,c4,neg,c2,dummy,dummy ,0.9).
imp(s, n,c3, neg, e7, dummy, dummy ,0.8).
imp(s,n,c3,pos,e8,dummy,dummy ,0.85).
imp (s,r,c2,pos,el,dummy, dummy ,0.7).
imp(o,n,c2,neg,e2,pos,e3,0.7).
imp(s,r,c2,pos,el,dummy,dummy ,0.5).
imp(a,r,cl ,pos,e4,pos,e5,0.75).
2. Используя сеть вывода из предыдущего упражнения, протрассируйте
операции с помощью стека ПОЧЕМУ в каждом узле, заканчиваю-
щем вывод. Какое объяснение как даст в узле с4 разобранная в книге
программа? А в узле cl ?
3. Используя пример из медицинской диагностики с деревом рассужде-
ний, показанным на рис. 5.3, объясните, что будет содержаться в сте-
ке, когда система спрашивает:
(а) У пациента в горле есть нарывы?
(б) Пациенту меньше 8 лет?
(в) У пациента есть лихорадка?
4. Укажите, какие изменения нужно сделать, чтобы результаты трасси-
ровок почему и как могли использоваться в качестве аргументов, пе-
редаваемых с правилами вывода, а не в качестве утверждений базы
данных.
7. НАПИСАНИЕ И ИСПОЛЬЗОВАНИЕ
ОБОЛОЧЕК НА ПРОЛОГЕ
7.1. УСКОРЕНИЕ ПРОЦЕССА
РАЗРАБОТКИ ЭКСПЕРТНЫХ СИСТЕМ
С ПОМОЩЬЮ ОБОЛОЧЕК
Для коммерческих экспертных систем, о которых ра-
нее шла речь, как правило, время разработки занимало от
нескольких единиц до десятков человеко-лет. Поскольку
цикл разработки столь длителен, вполне естественно при
проектировании новых систем использовать частично уже
существующие. Оболочка есть отражение важной про-
граммистской концепции, которая заключается в поддер-
жке вновь используемых систем.
Каков же наилучший способ обеспечить возможность
повторного использования систем? Для этого желательно
организовать знания в ЭС так, чтобы они были макси-
мально независимыми от механизма вывода. В таком слу-
чае реально создать новую ЭС путем частичной замены
знаний. Механизмы же вывода могут использоваться по-
вторно. Часть, которая остается неизменной, называется
оболочкой ЭС. Поэтому программа, подобная MYCIN,
используемая при диагностике и лечении заболеваний
крови, породила EMYCIN, которая представляет собой
оболочку для MYCIN. Несколько медицинских систем
были построены с помощью этой оболочки, например
PUFF, предназначенная для диагностики легочных забо-
леваний.
Оболочки становятся наиболее популярными продук-
тами, которые вызывают коммерческий интерес на рынке
программных продуктов ИИ. Достаточно уяснить идею
оболочки, чтобы путем простых добавлений создать но-
вую систему. Ядром оболочки является механизм вывода
для определенного типа ЭС. В нее могут входить и пере-
численные ниже средства:
• поясняющие средства;
• редактор для построения правил;
• развитые средства трассировки для отлаживания по-
тенциальных множеств правил;
• библиотеки проверенных ранее программ, которые
легко могут быть включены в новую ЭС в качестве
дополнительных функций, таких, как меню, графика
или коммуникации;
160
• различные утилиты, используемые для оптимизации
времени выполнения множеств правил;
• механизмы, помогающие в конструировании полез-
ных правил удобным для эксперта способом.
В каких случаях следует использовать оболочку? Ответ
на данный вопрос однозначен: всегда, когда это возмож-
но, хотя, конечно, такая возможность представляется не
так часто, как хотелось бы. Оболочка встраивает конкрет-
ную стратегию вывода для конкретного вида ЭС. Су-
ществуют два больших класса оболочек - с прямым и
обратным выводами, а также множество их вариаций.
Вопрос об использовании оболочки решается установле-
нием пригодности ее стратегии вывода, иначе можно по-
пасть в “Прокрустово ложе” и не добиться результата.
Сам Турбо Пролог - тоже оболочка, но весьма гибкая.
Он предлагает свой механизм вывода и очень элегантное
и продуманное окружение разработчика. Знания отделе-
ны от механизма вывода. Все, что требуется от вас, это
ввести знания в систему. Все знания представляются в ви-
де фактов или правил типа IF-THEN, так что они могут
быть легко изменены и удалены. Вы можете не видеть ме-
ханизма вывода, поскольку метод обратного связывания
операций встроен в Пролог.
Пролог отличается от большинства других коммерче-
ских оболочек по крайней мере тремя свойствами:
1 . Он использует точные рассуждения, и это неудиви-
тельно. Кроме всего прочего, Пролог основан на тради-
циях логического программирования и автоматического
доказательства теорем. В такой среде знание определен-
ных фактов абсолютно, а из них уже выводятся другие
абсолютные факты. Если вы желаете использовать веро-
ятностное оценивание, то необходимо встроить соот-
ветствующие средства. Именно для этого и предназначен
разработанный в гл. 5 механизм. Заметим также, что,
модифицируя стратегии вывода Пролога в прикладной
программе, мы отходим от парадигмы жесткого отделения
знаний от механизма ввода.
2 . Пролог чрезвычайно гибок. Это обусловлено тем, что
в правилах допускается использование переменных. Ко-
нечно, существует множество систем программирования,
которые приближаются к Пролог-программам по указан-
ным возможностям; но здесь имеются свои отличитель-
ные особенности. В терминах, которые хорошо известны
знающим логику, это можно объяснить так: в то время
как большинство оболочек работает на уровне пропози-
6—751
161
циональной логики, Пролог работает на уровне логики
предикатов, которая значительно мощнее. Поэтому воз-
можно даже встроить другие стратегии вывода в режим
естественного обратного вывода Пролога. Вспомните, что
в гл. 4 было показано, как реализовать прямой вывод в
программе классификации.
3 . Наконец, Пролог имеет встроенные средства для со-
здания структуры данных произвольной сложности в
процессе работы над задачей,что возможно с помощью ис-
пользования списков и сложных объектов. Придать такую
функциональную возможность оболочке очень трудно, а
Пролог обладает этим в большей степени, чем другие обо-
лочки, которые известны автору.
Несмотря на формальную аналогию с иными оболочка-
ми, большинство пользователей относятся к Прологу как
к языку программирования, а не как к оболочке.
Цель настоящей главы - исследовать процесс построе-
ния оболочек традиционного типа, которые могут быть
реализованы на языке Турбо Пролог. Мы рассмотрим
построение конкретной оболочки на базе концепций, из-
ложенных в предыдущих главах. Это будет оболочка с
обратным выводом, обладающая возможностью рассужде-
ния в условиях неопределенности, с пояснениями почему
и как. Мы постараемся широко использовать преиму-
щества, обеспечиваемые окружением разработчика Турбо
Пролога. Одно из свойств - архитектуру прямого связыва-
ния - мы явно опустим, поскольку его обсуждение выхо-
дит за рамки тематики книги.
7.2. ОБОЛОЧКА IMP:
АРХИТЕКТУРА И ПРОЕКТИРОВАНИЕ
7.2.1. СБОРКА
Программные фрагменты из гл. 5 и 6, которые имели
дело с вероятностными рассуждениями в сетях вывода и
давали пояснения, по существу, являются каркасом обо-
лочки с обратным выводом. Здесь мы обсудим программы,
составляющие базис оболочки, а затем сделаем несколько
стратегических добавлений к ним, чтобы приблизиться к
функционально полной оболочке.
Напомним концепции, которые были изложены ранее.
В частности, обратимся к программе для нечеткого выво-
да, состоящей из некоторого числа описывающих импли-
кации фактов типа
162
imp(s,r,b,pos,dummy,dummy,0.8)
imp(a,n,d,pos,c,0.85)
Эти факты логически эквивалентны следующему ут-
верждению
если (а), то (b) ct - .8 (rev)
если (а И с), то (d) ct - .85 (nrev)
Так как большая часть программы вывода состоит из
фактов типа “импликация”, представляется целесообраз-
ным назвать программный продукт, который мы намере-
ны разрабатывать, оболочкой IMP. В ней имеется также
множество правил, состоящих из нескольких предложе-
ний, с именами, подобными приведенным ниже:
Inger
allinfer
combine
supercombine
Они будут использованы с целью придать системе воз-
можность нечеткого вывода. В системе есть и несколько
правил с такими именами:
why-describer
how-describer
Они служат для поддержки объяснений почему и как.
Факты импликации, с одной стороны, и группа правил - с
другой, имеют явно различающиеся типы. Факты-импли-
кации всегда принадлежат конкретной проблемной обла-
сти, в то время как другие правила задают направления
вывода для системы. Мы можем все правила, исключая
факты-импликации, собрать в модуль и использовать их
как расширение механизма точного вывода Пролога. По-
добные расширяющие правила вместе с встроенным меха-
низмом Пролога составляют новый механизм вывода.
Пользователь такой оболочки может даже не знать пра-
вила или не понимать их. Самое большее, что он должен
знать для того, чтобы использовать оболочку IMP, - это
протокол составления импликаций, которые описывают
конкретную задачу. Итак, теперь от пользователя требу-
ется лишь написать набор фактов-импликаций, загрузить
систему расширения - и можно пользоваться данной ЭС.
Мы сейчас имеем дело с правилами типа
если (а), то (Ь)
163
Однако пользователи всегда хотят писать свои правила
таким образом
если (пациент болен пневмонией),
то (у него будет лихорадка)
Поэтому нам необходимо внести указанную возмож-
ность в систему. На первый взгляд достаточно всего лишь
заменить текстовые строки, подобные приведенным вы-
ше, для имен узлов дерева вывода, а все остальные
оставить прежними. Это выглядит многообещающе. В ка-
честве примера приведем два множества правил. Первое
множество использует абстрактные имена узлов:
если (а), то (Ь)
если (Ь И с), то (d)
Второе множество имеет такую же логическую струк-
туру, как и первое. Оно является параллельной конструк-
цией с текстовыми строками, подобными встречающимся
в реальных ЭС и заменяющими имена узлов:
если (пациент болен пневмонией) ,
то (у него будет лихорадка)
если (у пациента лихорадка)
и (он очень стар),
то (за ним необходимо внимательно наблюдать)
Языкообразные формы, которые можно увидеть во вто-
ром множестве правил, не могут быть механически
вставлены в факты-импликации: результирующие имп-
ликации будут работать некорректно. Поясним это на на-
шем примере. Вы видите здесь две немного отличающиеся
подчеркнутые строки с одинаковым смыслом, но система
не знает, что они обозначают одно и то же. Необходимо
также использовать артикль мужского рода. Несомненно,
вам не хотелось бы писать полный дубликат множества
правил для лиц женского пола.
Решение проблем такого рода требует определенной
дисциплины при написании правил. Вы должны написать
простое предложение для каждого условия, которое вас
интересует, но опустить в нем артикли и имена собствен-
ные. Предложению следует придать общую форму, что-
бы оно служило в качестве посылок и заключений всех
правил, используемых для рассуждений. Составленные
таким образом правила позволяют отслеживать все тон-
кости:
if (the patient has pneumonia),
then (the patient will have a fever)
164
if (the patient has a fever)
and (the patient is very old),
then (the patient needs carefull monitoring)
Если эксперт будет давать импликации в подобной
форме с необходимыми коэффициентами определенно-
сти, то правила могут переходить непосредственно в фак-
ты-импликации, например:
imp(a,n,"the patient needs carefull monitoring",
pos,"the patient has a fever", pos,
“the patient is very old", 0.9).
imp (a,n,"за пациентом требуется тщательное наблюдение",
pos,"у пациента лихорадка", рое,"пациент очень стар", 0.9).
Изменив форму фактов-импликаций, нужно ввести
необходимые изменения и в обрабатывающие программ-
ные коды. Прежде всего измените способ объявления
фактов-импликаций. Большинство объявляемых аргу-
ментов ~ простые символы. Их необходимо объявить как
строки. Соответствующие изменения должны быть сдела-
ны в правилах вывода. Их придется модифицировать так,
чтобы в каждом месте имя узла, принимаемое ранее,
теперь считалось строкой. Строка действительно должна
представлять данный узел.
Есть еще изменения, которые имеет смысл здесь обсу-
дить. Когда система (в нашем нынешнем представлении)
выдает пользователю запрос на ввод информации, при-
глашение выглядит подобно приведенному ниже:
Напечатайте п (почему) или задайте
коэффициент определенности для узла е4
Модификация должна осуществляться с учетом того
факта, что е4 может быть теперь строкой, описывающей
некоторые условия во внешнем мире. Можно для удобства
обеспечить пользователю возможность отвечать “д” или
“н” на определенные вопросы, а не задавать значения ко-
эффициента определенности при полной определенности
(1.0) или полной неопределенности (-1.0). Наилучшей
подсказкой может оказаться следующая:
Для этого условия:
у пациента лихорадка
Напечатайте д(да), н(нет) или п (почему) или задайте коэффициент
определенности в интервале (-1.0 до +1.0)
Наша система вывода будет работать, таким образом,
165
после изменения узлов дерева вывода на текстовые стро-
ки.
7.2.2. ДОБАВЛЕНИЕ ФОРМУЛ В ПРАВИЛА
Рассмотрим важное функциональное добавление к
структуре оболочки, которое значительно увеличивает
производительность системы. Когда проектировщик при-
ступает к задаче сбора фактов-импликаций для описания
прикладной системы, допускаемая в настоящий момент
форма правил иногда кажется ограничительной. Напом-
ним, что посылки и заключения в правилах в основном
суть упорядоченные буквенные строки, которые не могут
быть изменены во время исполнения, например:
if “Процентные ставки достаточно высоки.*1
then “Реальная стоимость объектов недвижимости занижена**
Иногда проектировщику приходится работать с импли-
кациями типа
if (стоимость-строения > .28 * месячный-заработок)
then “Клиент не может купить строение”
Посылка во втором правиле называется реляционным
выражением и является булевской формулой, принимаю-
щей истинное или ложное значение в зависимости от
значений “стоимость-строения” и “месячный-заработок”.
Эти элементы - обычные переменные, которые допускают
ввод значений посредством запроса во время работы с экс-
пертной системой.
Прежде чем продолжать обсуждение нашей темы, дого-
воримся о терминологии. Булевское выражение - это вы-
ражение, которое принимает значение истина или ложь
в отличие от алгебраического, принимающего числовое
значение. Реляционное выражение объединяет обе эти
концепции. Оно содержит алгебраические выражения
справа и слева от реляционного оператора (т.е.
или «). Например, следующее выражение является реля-
ционным:
2 *а>Ь
Отметим, что реляционное отношение представляет
собой разновидность булевского.
Для того чтобы оболочка могла использовать новый
тип правил, необходимо спроектировать модуль, который
воспринимает формулу в посылке и определяет, истинна
J 66
она или ложна. Формула и реляционное выражение - си-
нонимы. Правило, в котором присутствует формула, есте-
ственным образом входит в структуру импликации. Это
может показаться вам странным, но от вас требуется
лишь другим способом вычислять коэффициент опреде-
ленности для посылки правила, т. е. формулы. Возможны
только два исхода: истина или ложь. Можно считать,
что значению “ложь” соответствует коэффициент опре-
деленности, равный -1, а значению “истина” - 1. При
получении коэффициента определенности посылки коэф-
фициент определенности заключения может быть выве-
ден обычным способом:
ct (заключения) - ct (посылки) * ct (импликации)
Кроме всего прочего, заключение импликации - стро-
ка. Только посылка является формулой. Заключение
поэтому может быть выведено посредством ранее рас-
смотренных процедур.
Реляционные выражения в этих правилах будут восп-
риниматься оболочкой, по существу, как данные, по-
скольку факты-импликации и есть данные. Для оценки
реляционного выражения произвольной формы, пред-
ставленного в качестве данных, требуется провести зна-
чительную работу. Необходимо понять, что сложность
состоит не в написании на Прологе программы для оценки
конкретного выражения, а в том, что при ее создании не
известно, какое выражение будет использовано в даль-
нейшем. Назовем эту задачу задачей динамической оцен-
ки выражений. В некоторых диалектах Пролога имеются
средства, облегчающие ее решение. Турбо Пролог, к со-
жалению, отстает в этом отношении.
Оценке выражений посвящен специальный раздел в
курсе по компиляторам. Мы приведем здесь некоторые
результаты из нескольких работ, чтобы вы могли полу-
чить представление о конструкции оболочки.
Оценка реляционных выражений (установление ис-
тинности или ложности) всегда включает две операции.
Предположим, нужно оценить выражение, подобное сле-
дующему:
(a + b) > ((с —d)/a)
Выражения по обе стороны от центрального оператора
суть обычные алгебраические выражения, которые оце-
ниваются числами. Сначала мы должны оценить каждое
алгебраическое выражение и преобразовать их в число-
167
вые эквиваленты, а затем сравнить полученные результа-
ты в соответствии с центральным оператором. Это две
раздельные операции.
Наиболее сложным при оценке реляционных выраже-
ний является случай, когда алгебраические выражения
находятся по обе стороны центрального оператора. Наи-
лучший способ, который используется в стандартном
Прологе, разительно отличается от методов Турбо Проло-
га. В стандартном Прологе нам необходимо представить
алгебраическое выражение в виде дерева выражений
списковой формы и с его помощью создать последователь-
ность динамических целей, которые, выполнив ариф-
метические действия, преобразуют алгебраическое
выражение в число.
Что же такое динамическая цель? В стандартном Про-
логе выполняемая программа имеет возможность соби-
рать выражение из битов и фрагментов, используя
операции работы со списками Пролога. Это выражение
может быть исполнено, как будто бы оно было частью ко-
да программы. Цель, используемая подобным образом, и
называется динамической. Например, мы определили
цель под именем plus для сложения двух чисел:
plus(A,B,C) ifC-A + B.
Предположим, что А и В уже связаны значениями.
Обычный способ использования этого предиката, когда он
встречается в правой части обрабатываемого высоко-
уровневого правила. Однако есть и другой способ. В стан-
дартном Прологе приводимая ниже последовательность
кодов может быть использована для определения plus как
динамической цели и непосредственного ее выполнения:
......, Р - ’plus’, Z-... [Р,А,В,С], call(Z)..
Важно отметить, что любой предикат может быть об-
работан указанным способом. Стандартный Пролог со-
держит два элемента - и call, которые не могут быть
выполнены в Турбо Прологе.
Динамические цели позволяют одной программе сгене-
рировать другую программу и исполнить ее. Они обеспе-
чивают гибкость программирования, необходимую для
простого оценивания выражений. Этот аспект подробно
изложен в книге Клоксина и Мелиша.
Турбо Пролог не имеет средств для обработки динами-
168
ческих целей. Однако существует достаточно эффектив-
ный способ обработки алгебраических выражений и в
нем. Алгебраическое выражение приводят к форме, об-
ратной польской записи (RPN), с помощью алгоритма Ба-
уера-Самуэльсона и затем оценивается с использованием
обычных стековых алгоритмов для RPN. Чтобы приме-
нить этот подход, необходимо написать вложенный ин-
терпретатор для выражений, который будет исполняться
как часть программы на Турбо Прологе. Еще раз напом-
ним, что эти вопросы относятся к теории компиляторов, и
для их уяснения вы можете обратиться к другим источни-
кам.
Как вам уже известно, самая трудная часть оценива-
ния реляционного выражения - преобразование компо-
нент алгебраического выражения в число. Следующая же
часть программы с операторами отношения достаточно
проста.
Для этой оболочки на Турбо Прологе был написан мо-
дуль, который оценивает реляционные выражения мето-
дом RPN. Его полный текст приведен в приложении Б.
Главный предикат имеет имя expr-eval и два аргумен-
та, первый из которых - строка - служит для передачи
реляционного выражения. В нем допускается произволь-
ная глубина вложенности скобок, но можно использовать
только операторы +, -, * и /. Второй аргумент возвращает
результат. Его значения: 1 - истина, -1 - ложь.
Приведем пример чспользования expr-eval. Предполо-
жим, что предикат устанавливает следующую цель:
expr-eval ("стоимость-строения > .28 * месячный-заработок",Ans)
Во время исполнения предикат прежде всего опраши-
вает значения для каждой из переменной формулы. Он
может сделать это тремя различными способами, которые
обсуждаются ниже. После определения всех переменных
expr-eval оценивает правую и левую стороны рассматри-
ваемого выражения, определит, истинно или нет все вы-
ражение, и связывает результат с Ans.
Теперь исследуем, каким образом переменные могут
быть опрошены для получения значений. Если в памяти
нет информации о переменной, то ее значение запраши-
вается у пользователя. Это и есть первый способ получе-
ния информации.
Когда значение переменной запрашивается у пользова-
теля, оно сохраняется в базе данных, так что если пере-
169
менная встретится в другой формуле, нет необходимости
запрашивать ее значение снова. Иными словами, второй
способ сводится к проверке базы данных, поскольку зна-
чение уже может быть известно.
Третий способ требует пояснения. Иногда полезно
допускать использование в реляционном выражении
переменной, которая определена в терминах других, бо-
лее фундаментальных переменных, внутренне связанных
с проблемой. Исследуем этот механизм. Если предикат
expr-eval устанавливает, что переменная определяется
формулой ( в другом месте системы), то он находит это
определение и работает в терминах новых переменных, а
не исходных.
Далее рассматривается пример, подтверждающий эту
идею. Предположим, что мы работаем над выражением
вида
if ("стоимость-строения > .28 * месячный-заработок")
then “Клиент не может купить дом.”
Можно спросить у пользователя о переменной “сто-
имость-строения” или представлять себе ее как сложный
объект, который определяется с помощью других единиц
низкого уровня. Допустим, в переменной “стоимость-
строения” мы учитываем сумму закладных, страховые
отчисления и пропорциональный месячный налог. Мож-
но, конечно, все это вставить в исходное правило. Однако
если переменную “стоимость-строения” мы намерены ис-
пользовать более чем в одном месте, то удобнее опреде-
лить ее один раз и возложить на систему установление
связи с этим определением. Таким образом, мы должны
предоставить системе доступ, скажем, подобного вида:
define (стоимость-строения,"закладная + налог + страхование")
Этот факт Пролога действует аналогично алгебраиче-
ской формуле
стоимость-строения “ закладная + налог + страхование
Определение, используемое expr-eval, имеет точно та-
кую же форму.
Теперь несложно включить поиск определений в состав
работ, которые должны быть выполнены предикатом
expr-eval. Перед оценкой компоненты алгебраического
выражения сканируются на предмет установления при-
170
сутствия в них переменных, которые могут быть опреде-
лены с помощью фактов типа define. Если они имеются,
то выполняются замены с целью записи алгебраических
выражений с помощью базисных величин, значения кото-
рых запрашиваются непосредственно у пользователя. В
вышеприведенном примере пользователя нужно спросить
о величинах закладной, налога и страхования. Относи-
тельно переменной “стоимость-сгроения” пользователю
вопрос задаваться не будет. В этом состоит третий способ,
которым система может узнать о значениях переменных.
Приведем программный код, используемый для таких
замен. Предикат expander имеет два строковых аргу-
мента, которые служат для передачи алгебраических
выражений - выражение перед заменой, и выражение с
максимально возможной заменой посредством определен-
ных ранее формул. Заметим, что правило использует ре-
курсию и работает в каждый момент времени над одним
токеном (элементарной единицей).
/* Приведение токена, определенного в другом месте. */
expander(S,R) if
fronttoken (S,S 1 ,S2),define (SI ,Y),
expander (S2,S3), concat("(",Y,Yl),
concat(Yl ,")",Y2), concat(Y2,S3,R)
/* Проход через токен, который не требует приведения. */
expander(S,R) if
fronttoken (S ,S 1 ,S 2),
expander (S2,S3) ,concat(Sl ,S3,R) J.
/* Используется в конце для прекращения рекурсии. */
expander ("","") if !.
Предикат expr-eval собирает воедино все механизмы,
необходимые для применения правил с реляционными
выражениями в посылке. Теперь отвлечемся от деталей
expr-eval и рассмотрим, каким образом правила, исполь-
зующие реляционные выражения, включаются в осталь-
ную часть. Прежде всего факты-импликации для этих
новых правил будут выглядеть так:
imp(f,n,"Клиент не может купить дом.", pos,
“стоимость-строения > .28 * месячный-заработок",
dummy,dummy,0.85).
Мы задействовали стандартный факт-импликацию с
восемью аргументами. Тип импликации указан первым
аргументом, f - формула. Сама же формула (реляционное
выражение) представлена пятым аргументом в виде стро-
ки. Предикат expr-eval преобразует структуру формулы и
171
при необходимости использует различные поддерживаю-
щие переменные и операторы.
Правило с формулой в посылке присоединяется к ос-
тальной части оболочки добавлением одного предложения
с помощью правила infer.
infer(Nodel,Ct) If
imp (f,Use,Node 1 ,Csign,Cond,dummy,dummy,C),
asserta (dbimp (f,Use,Nodel ,Ctign,Cond,dummy,dummy,C)),
asserta (tdbimp (f, Use, Nodel,Cslgn,Cond,dummy,dummy ,C)),
clearwindow,
write ("Требуется задавать вопросы для оценки формулы."),
nl,nl,cleanerz, expr-eval (Cond.TF),
cond-multiplier (Csign,Cmult),
XXX-TF * Cmult,qualifler(Use,XXX,Qmult) ,Ct - XXX * C * Qmult,
assertz (infer-summary (
imp (f,Use,Nodel ,Csign,Cond, dummy, dummy, C) ,Ct)),
form-describer(Nodel ,Ct),
retract (dbimp (f,Use,Node 1,Csign.Cond,dummy .dummy ,C)),
re tract (tdbimp (f,Use,Node l.Cslgn, Con d, dummy, dummy, O).
Это правило на первый взгляд подобно использовавше-
муся ранее. Однако между ними есть принципиальное
различие: здесь необходим специальный поиск значений
переменных. Ни одно из правил, отличных от infer, не
делает этого. В последнем имеется модифицированный
механизм для объяснения почему. Вы можете исследовать
все добавления в рассмотренном фрагменте программы
или полном варианте, приведенном в приложении Б.
Обратите внимание на активации предиката expr-feval и
ответы, которые он получает для пересылки, классифика-
ции и использования их при вычислении коэффициента
определенности.
Предикат cond-multiplier предназначен для измене-
ния знака коэффициента определенности посылки в том
случае, если она отрицается NOT. Предикат с именем
qualifier служит для установления правомерности приме-
нения необратимого правила в рассматриваемых услови-
ях. Предикат же form-describer управляет объяснениями
почему для правил, включающих реляционные выраже-
ния.
7.2.3. СРЕДА РАЗРАБОТЧИКА
Одним из свойств современных оболочек является на-
личие среды разработчика, которая предлагает много до-
полнительных функций, кроме механизма вывода. Турбо
Пролог позволяет относительно просто встроить их в обо-
172
дочку IMP. Ниже мы рассмотрим, как это может быть ре-
ализовано.
Чтобы создать себе предмет для обсуждения, приведем
главное меню полной оболочки IMP, а затем опишем его
отдельные опции в тех случаях, когда их реализация в
Турбо Прологе имеет специфические особенности или
представляет интерес. Главное меню оболочки выглядит
так:
IMP —Оболочка для построения ЭС
1. Справочная информация
2. Ввод правил новой экспертной системы
3. Проверка загруженного множества правил
4. Сохранение загруженного множества правил
5. Загрузка одного из наборов правил
6. Прогон загруженной экспертной системы
7. Редактирование одного из наборов правил
8. Печать одного из наборов правил
9. Выход в DOS
10. Окончание работы с программой
Для дружественных программ (включая и оболочки)
требуется наличие определенной системы помощи. В
Турбо Прологе имеется специальный предикат, который
может легко ее обеспечить. Для того чтобы включить
систему помощи в программу, сначала нужно создать
текстовый файл с описанием этой системы посредством
текстового процессора или редактора текстов. Текстовый
файл состоит из символьных кодов ASCII для печатных
документов, где между последовательными строками
находятся символы возврата каретки, и заканчивается
маркером конца файла CNTR-Z. В самом же тексте не
должно быть других управляющих символов.
С целью использования такого файла помощи необхо-
димо включить в определенном месте программы фраг-
мент, подобный следующему:
......File-str CTMPSHELL.HLP",Z),display (Z) ,.
Предикат display использует обычно в качестве аргу-
мента длинную текстовую строку. Он отображает текст в
окне, активизируя при этом определенные клавиши на
клавиатуре, с помощью которых пользователь может
просматривать различные части документа, если его
длина превышает длину страницы. Клавиши со стрелками
“вверх” и “вниз” перемещают вверх и вниз по докумен-
ту, а клавиша ESC прерывает выполнение предиката.
Предикат file-str принимает имя файла и связывает со-
173
держимое последнего со строковой переменной, которая
передается предикату display.
Возможность доступа к операционной системе DOS
также реализуется с помощью встроенного предиката.
При выборе соответствующей опции меню Пролог за-
пускает вторую копию операционной системы. Для
пользователя это представляется так, как будто програм-
ма закончила работу, управление вернулось к DOS и
можно выполнить любые ее команды, введя их с кла-
виатуры. Часто такая возможность используется для
файловых операций ( создания копий, уничтожения и
распечатки файлов). Проделав необходимую работу,
пользователь должен ввести команду exit для прекраще-
ния управления этой копией и возвращения управления
программе в ту ее точку, откуда производился вызов DOS.
Соответствующие функциональные средства могут быть
легко добавлены в любое место программы на Турбо
Прологе посредством выполнения следующего предиката:
system ("")
Он имеет и другое важное свойство. С его помощью
можно выполнить команду DOS “изнутри” программы на
Прологе. Например, для вывода на экран содержимого те-
кущего каталога на диске достаточно ввести следующее:
system ("dir")
Операция распечатки файла использует также преди-
кат system. Рассмотрим, как это делается. Аргументом
system должна быть текстовая строка, содержащая только
те символы, которые вы набирали бы на клавиатуре, если
бы выполняли команду в DOS. Печать файла требует по-
следовательного использования нескольких предикатов,
так как командная строка, подлежащая передаче в DOS,
содержит переменную. Мы должны составить эту строку
до того, как ее можно будет использовать:
.....pick-exsys(Rulerile),concat("copy “.Rulcfiie.Z),
concat(Z," prn:",ZZ),system(ZZ) ....
Предикат pick-exsys выводит меню всех отдельных на-
боров правил экспертных систем и позволяет выбрать
один из них посредством установки светового маркера на
нужное имя. Он возвращает в качестве строкового аргу-
мента имя файла набора правил:
174
pick-exsys (Rulefile) if
makewindow(10,7,7,"ВЫБЕРИТЕ НАБОР ПРАВИЛ", 10,10,10,60),
dir("//","*.rul", Rulefile), removewindow.
Бблыпая часть работы здесь осуществляется встроен-
ным предикатом dir, который выводит на экран меню оп-
ций и позволяет выбрать одну из них.
функция редактирования меню очень мощная. Вы мо-
жете подумать, что она сложна, запутана и вызывает
функцию для редактирования набора правил экспертной
системы. Однако это не так. Вновь встроенный в Турбо
Пролог предикат позволяет с легкостью подключать к
программе редактор. Основная часть работы выполняется
предикатом, который выглядит следующим образом:
edit (Входная-строка,Выходная-строка)
Файл, который должен редактироваться, преобразует-
ся в строковую переменную с помощью предиката file-str
и затем используется в качестве входной строки команды
edit. Она, в свою очередь, выводит входную строку в окно
и позволяет производить над ней все операции редактиро-
вания. По окончании редактирования возвращается изме-
ненный текст и связывается с выходной строкой. Во время
выполнения edit система ведет себя подобно одному из по-
пулярных редакторов - WORDSTAR. Команды этого
редактора фактически являются стандартными для тек-
стовых процессоров. Они довольно популярны и потому
фирмой Borland используются в ее встроенных редакто-
рах.
При редактировании правила представляются в виде
длинной текстовой строки. Для перезаписи правил в файл
на диске нужно выполнить некоторые действия, что обес-
печивается в Турбо Прологе несколькими предикатами.
Фрагмент программы, представляющий полный мо-
дуль редактирования, выглядит так:
edit-rs if
pick-exsys (Filename),file-str (Filename,Inputstring),
edit (Inputstring,Outputstring),clearwindow,
write ("Сохранить набор правил? (введите д/н) “),
readchar (Ans) ,record-it (Ans,Outputstring,Filename).
record-it(’д’,Data,Filename) if
openwrite (descriptor,Filename),writedevice (descriptor),
write (Data),closefile (descriptor),
clearall,consult (Filename).
record-it(H,-,-).
Итак, мы рассмотрели все функции, доступные из
главного меню оболочки. Метод создания меню и отноше-
175
ние последнего к управлению системой, несомненно, важ-
ны и представляют интерес. Меню в программах на Турбо
Прологе с помощью программ, поставляемых фирмой
Borland, создаются просто. Приведем пример. Типовая
работа с предикатом menu такова:
menu(5,10, ["Да","Нет"] ,Ans)
Предикат создает окно на экране с верхним левым уг-
лом в строке 5 и столбце 10, которое выглядит как рамка с
двумя строками внутри.* В первой строке находится слово
“Да”, а во второй - “Нет”. Клавиши со стрелками позво-
ляют перемещать световой маркер, так что пользователь
может выбрать одну из опций в меню. Если пользователь
выбирает “Да”, то с переменной Ans будет связано число
1, если “Нет” - то число 2 и т.д. Третий аргумент преди-
ката является списком с необходимым количеством строк.
Каждая из них представляет опцию в получаемом меню.
Четвертый аргумент возвращает номер выбранной опции
меню для использования на верхнем уровне.
Для больших программ на Турбо Прологе удобно иметь
ведущий драйвер, организованный в виде цикла. Драй-
вер, проходя через меню, позволяет выбрать опцию и
активизировать соответствующий предикат, из которого
после его завершения управление возвращается обратно в
меню для следующего выбора. Непосредственно в на-
чале предиката вывода меню находится оператор repeat,
благодаря которому возможен только один способ избе-
жать возврата назад и успешно прийти к цели, - выбор
опции меню, предназначенной для выхода из программы.
Приведем полностью ведущий драйвер оболочки IMP.
Тщательно его проанализируйте - это весьма полезно.
shell-driver if
makewindow( 1,112,7,"IMP —
Оболочка для построения ЭС “,0,0,25,80>,
repeat,shiftwindow(l), clearwindow,
menu (6,15,
[“Справочная информация*1,
“Ввод правил новой экспертной системы**,
“Проверка загруженного множества правил",
“Сохранение загруженного множества правил",
“Загрузка одного из наборов правил",
“Прогон загруженной экспертной системы",
“Редактирование одного из наборов правил",
“Печать одного из наборов правил",
“Выход в DOS",
“Окончание работы с программой"] .CHOICE),
process (CHOICE),CHOICE-10,!.
176
/♦ Определение меню верхнего уровня. */
process(l) if file-str(”lmpshell.hlp".ZZ).display(ZZ),!.
process(2) if dearall,make-rules,!.
process(3) if see rules,!.
process (4) if get-name (Rulefile) ,save (Rulefile),!.
process(5) if clearall.plck-exsys(Rulefile),
consult (Rulefile),!.
process(6) if cleanerx.cleanerz.exsys-driver,!.
process(7) if clearall,edit-rs,!.
process (8) if pick-exsys(Rulefile),3
concat ("copy M .Rulefile.Z),
concat(Z," prn:",ZZ),system (ZZ),!.
process (9) if system(""),!.
process (10) if!.
Несколько процессов из меню не обсуждалось здесь,
поскольку они очевидны как программы на Прологе или
были рассмотрены ранее. К этой категории относятся
предикаты make-rules, see-rules и exsys-driver. Предикат
make-rules запрашивает у пользователя начальное мно-
жество правил, see-rules отображает их на экране, а
exsys-driver применяет allinfer для выполнения вывода
для всех строк, которые определяются как интересующие
нас заключения верхнего уровня (гипотезы).
Теперь мы в состоянии проанализировать все свойства
функционально полной оболочки, использующей обрат-
ное связывание. Работая в ней, пользователь должен ду-
мать о правилах, а не о Прологе. Оболочка обладает такой
же дружественной средой разработчика, как и Турбо
Пролог, и может использовать все его вспомогательные
средства, поскольку построена на его верхнем уровне.
Она проста и имеет преимущество по сравнению со мно-
гими коммерческими оболочками, предназначенными для
класса персональных компьютеров.
В приложении А приведен полный текст программы
оболочки IMP.
7.3. СОЗДАНИЕ “КОНСУЛЬТАНТА
ПО ИНВЕСТИЦИЯМ”
Здесь уместно предложить вам пример простой экспер-
тной системы, реализованной с помощью оболочки IMP.
С этой целью и был сконструирован “Консультант по ин-
вестициям”, приведенный в этом разделе.
Программа написана в предположении, что управле-
ние процессом инвестиционных вложений не составляет
труда, если вы обладаете начальным капиталом, намере-
ны взять на себя долговременные обязательства и избега-
ете постоянного занятия торговлей. Динамика, лежащая в
177
основе принятия решений в программе, основана на со-
глашении, согласно которому в деловом мире имеются
два доминирующих цикла. Первый из них, так называе-
мый деловой цикл, - последовательность подъемов и спа-
дов деловой активности. Со времен второй мировой войны
он уже повторялся 10 раз. Второй цикл - предсказуемые
изменения процентных ставок, которые федеральное пра-
вительство обычно предпринимает в соответствии с дело-
вым циклом. Инвестиционная стратегия предполагает,
что колебания конъюнктуры рынка почти всегда адекват-
но соответствуют точке траектории делового цикла, из-за
чего трудно ответить на вопрос, в какой фазе цикла мы
сейчас находимся.
Другой заложенный в программу принцип заключает-
ся в том, чтобы купить дешево, а продать дорого и попы-
таться поступить наоборот, когда все остальные игроки в
этой игре достигли полного согласия в вопросе о том, ка-
кие стороны экономики следует развивать. Если согласие
довольно устойчиво, то это самозащита. Идея игры осно-
вана на концепции противоречия. Когда каждый кричит
“купи, купи, купи”, вы должны “продавать, продавать,
продавать”.
Конкретные стратегии, встроенные в программу, заим-
ствованы из популярной книги Ричарда Янга (Richard С.
Young’s Financial Armadillo Strategy, William Morrow, New
York, 1987). Мы ни коим образом не утверждаем, что
здесь учтены все принципы “стратегии Армадило”, - мы
лишь пытались взять оттуда самое существенное и час-
тично его внутреннюю логику.
Ниже приведены правила, с помощью которых опреде-
ляется “Консультант по инвестициям”:
Imp("s","n","Предсказывается подъем.","pos",
“Краткосрочные процентные ставки недавно возросли.",
“dummy "."dummy",0.4)
imp ("а","г","Предсказывается подъем.","pos",
“Цены возрастают уже несколько месяцев.","pos",
“Общественное мнение в основном положительно.",0.6)
imp ("а","п","Предсказывается подъем.","pos",
“Значение коэффициента IPI больше единицы.","pos",
“Значение коэффициента IPI падает уже три месяца.",0.4)
imp ("s","г","Предсказывается кризис.","pos",
“Значение коэффициента GNP уменьшается уже два квартала.**,
“dummy","dummy" ,0.5)
imp("a","r","Предсказывается кризис.","pos",
“Деловая активность снизилась.","рое",
“Общественное мнение в основном отрицательно.",0.6)
imp("s","n","Предсказывается фаза подъема.","pos",
“Процентные ставки падают уже несколько месяцев.",
“dummy”,"dummy",0.7)
178
1шрС8","п"»"Предсказывается фаза подъема.","pos",
“Уменьшение спроса на ссуду.*1, “dummy”,"dummy",0.6)
^pCs","11","Предсказывается фаза подъема.","рое",
“Вероятно снижение процентных ставок.”,
“dummy”,"dummy",0.6)
imp(V,"п","Предсказывается фаза подъема.","рое",
“Это год перед выборами президента.”,
“dummy”,"dummy",0.3)
imp("s","n","Предсказывается фаза подьема.","ров",
“Это год президентских выборов.”, “dummy”,"dummy",0.45)
imp("s","n","Предсказывается фаза подъема.", “рое”,
“Благоприятны краткосрочные вложения.”,
“dummy”,"dummy",0.6)
imp ("а","п","Предсказывается фаза подъема.","pos",
“Значение коэффициента IPI больше единицы”,"рое",
“Значение коэффициента IPI возрастает. ”,0.6)
imp("е","п","Предсказывается фаза падения.","pos",
“Краткосрочные процентные ставки недавно возросли.”,
“dummy”,"dummy",0.4)
imp("s","n", "Предсказывается фаза падения.","ров",
“Краткосрочные процентные ставки выше долгосрочных.”,
“dummy”,"dummy",0.7)
imp("s","n","Предсказывается фаза падения.","pos",
“Повышение спроса на ссуду.”, “dummy”,"dummy",0.4)
1шр("8","п","Предсказывается фаза падения.","pos",
“Неэффективность краткосрочных вложений.”,
“dummy”,"dummy" ,0.6)
imp ("в","п","Предсказывается фаза падения.","pos",
“Вероятно возрастание процентных ставок.”,
“dummy”,"dummy",0.6)
imp ("а","п","Предсказывается фаза падения.","pos",
“Предсказывается подъем.”,"pos",
“Стабилизация процентных ставок после колебаний.”,0.4)
imp("f","n","Благоприятны краткосрочные вложения.",
“pos”,"Yeariy-growth-in-M2 — Yearly-growth-in-CPI > 4",
“dummy”,"dummy",0.5)
imp ("Г,;"n","Неэффективность краткосрочных вложений.",
“pos”, "Yearly-growth-in-CPI — Yearly-growth-in-M2 > 4",
“dummy”,"dummy" ,0.6)
imp("Г,"п","Вероятно снижение процентных ставок.",
“рое”,"Prime-rate — Short-term-CD-rate > 2.25",
“dummy”,"dummy",0.5)
imp ("Г,"n","Вероятно повышение процентных ставок.",
“рое”,"Prime-rate — Short-term-CD-rate < 1.75",
“dummy”,"dummy" ,0.6)
imp ("s","n","Покупайте акции.","pos",
“Предсказывается подъем.”,"dummy","dummy" ,0.9)
imp("s","r","Покупайте ценные бумаги.",
“pos”, “Предсказывается подъем.”,"dummy","dummy",0.9)
lmp(T,"n","Покупайте ценные бумаги.","pos",
“Price-of-silver-per-ounce < 6.50",
“dummy”,"dummy",0.75)
imp ("a","и","Покупайте различные акции.",
“pos”,"Куpc доллара сильно упал по отношению к другим валютам.",
“pos”,"Падение курса доллара продолжится.",0.5)
179
imp ("а","г”,"Покупайте различные акции.","pos",
“Предсказывается кризис.”,"pos",
“Знаете ли вы акции, которые идут вверх.”,0.8)
imp ("а","п","Покупайте землю.","pos",
“В районе значительный прирост населения.”,"pos",
“Предсказывается кризис. ”,0.8)
imp Со","г","Придержите акции на землю и разные акции.","pos",
“Предсказывается фаза подъема.”,"pos",
“Предсказывается кризис.”,0.8)
imp ("о","г","Придержите векселя и ценные бумаги.",
“pos”,"Предсказывается фаза спада.",
“pos”, “Предсказывается подъем.”,0.8)
hypothesis-node ("Покупайте ценные бумаги.")
hypothesis-node ("Покупайте акции на землю.")
hypothesis-node ("Покупайте векселя.")
hypothesis-nodeCTIoKynaftTe различные акции.")
hypothesis-node ("Придержите векселя и ценные бумаги.")
hypothesis-node ("Придержите акции на землю и разные акции.")
В этих импликациях имеется большое число техниче-
ских деталей, которые не важны в экспертных системах,
но помогают понять, как “работает” это множество дан-
ных. В большинстве правил речь идет о предсказании фа-
зы делового цикла на ближайшее будущее. Различные
финансовые показатели, используемые системой, доступ-
ны из газет и официальных источников (отдела коммер-
ции США или федеральной резервной системы).
Здесь коэффициент IPI есть отношение индекса про-
мышленного производства в текущем году к индексу про-
шлого года:
GNP - совокупный национальный продукт, получен-
ный оцениванием всех произведенных товаров и услуг в
США за год,
М2 - количество денег в обращении, которое является
мерой материальных затрат в экономике,
CPI - индекс потребительских цен, совокупный пока-
затель инфляции,
краткосрочный процент CD - процент по ссуде, кото-
рую дают корпорации банкам на срок три месяца,
учетная ставка - процентная ставка банков для ссуды
первоклассным заемщикам.
В приведенных выше правилах факты terminal-node
опущены в силу их очевидности. Они содержат все, чего
нет в формулах и что программа запрашивает у пользова-
теля. Факты hypothesis-nodes устанавливают объект для
рассуждений системы. Иногда может оказаться желатель-
ным изменить hypothesis-nodes, но оставить основное
множество фактов imp. Например, предположим, что сис-
тема должна сделать обзор текущего делового цикла, а не
давать советы относительно инвестиций. В этом случае
180
вместо гипотетических фактов, приведенных выше, име-
ет смысл использовать следующие:
hypothesis-node ("Предсказывается подъем")
hypothesis-node ("Предсказывается кризис")
hypothesis-node ("Предсказывается фаза подъема")
hypothesis-node ("Предсказывается фаза спада")
То, что вы видели здесь, - типовое множество правил
гипотетической экспертной системы. Вам придется по
крайней мере в три раза увеличить число правил для того,
чтобы получить систему, сравнимую по возможностям с
компетентным консультантом по инвестициям. Кроме то-
го, необходимо настроить правила оптимальным образом
и рассмотреть множество реальных случаев для удаления
из системы несерьезной информации.
Несколько маленьких экспертных систем, имеющих
порядка 100 правил, уже находятся в эксплуатации.
7.4. ИСПОЛЬЗОВАНИЕ ОБОЛОЧКИ
В БОЛЬШИХ ПРОЛОГ-ПРОГРАММАХ
При разработке экспертной системы всегда возникает
вопрос о том, какую оболочку использовать. Отметим,
что на базе чистого Пролога легко спроектировать обо-
лочку, поэтому представляется оптимальным с помощью
хорошей версии Пролога модифицировать ее механизм
вывода с целью включения средств языка программирова-
ния оболочки и дополнительного пакета для правил выво-
да. Это открывает широкие возможности для
программирования. Начинающие программисты могут
использовать лишь средства самой оболочки, а опытные
могут создавать высокоуровневые правила, имеющие до-
ступ ко всем функциям оболочки, которые им необходи-
мы. Однако они могут обратиться и к Прологу, если его
гибкость обеспечивает преимущества. Допустимо даже
иметь две оболочки в одной программе- с прямым связы-
ванием и обратным связыванием, которые объединены в
высокоуровневой программе, использующей их в зависи-
мости от ситуации для достижения общей цели.
И наконец, оболочки можно перепродавать. Многие ( в
особенности менеджеры) полагают, что с помощью этих
средств можно легко и просто создавать экспертные систе-
мы. Они будут разочарованы. Вы наблюдали за процессом
построения оболочки и видели, что здесь нет никакого чу-
да. Труднейшая часть работы по созданию экспертной си-
стемы связана с первоначальным извлечением знаний, и
только потом производится их структуризация в рамках
181
правил Пролога или оболочки с целью эффективной эму-
ляции работы эксперта. Даже если вы смените средства,
вам предстоит кропотливая работа по анализу и планиро-
ванию.
Упражнения
1. Представьте сеть рассуждений для набора правил, предложенного в
разд. 7.3 для “Консультанта по вложениям”.
2. С помощью оболочки IMP напишите “Консультант по вложениям*1
для гипотетического отдела грузовых перевозок, который дает советы
о типах погрузочных средств, упаковке и страховании используемых
при перевозке грузов фирмы.
3. С помощью оболочки IMP напишите экспертную систему, которая
дает советы в отношении транспортных средств, т.е. пользоваться ли
вам общественным транспортом, купить ли подержанный автомо-
биль, купить ли новый автомобиль, взять ли его на прокат или посту-
пить иначе. Она должна принимать во внимание стиль вашей жизни,
сезон (подержанный автомобиль проще купить зимой), процентные
ставки, наличие денег и многое другое.
4. С помощью оболочки IMP напишите экспертную систему, которая
дает советы неопытному пользователю, вообразившему, что его ком-
пьютер (IBM PC) неисправен. Она должна исследовать ситуации и
попытаться определить на общем уровне, делает ли пользователь что-
то неверно или действительно имеется неисправность в диске, мони-
торе, принтере и т. д. Один из способов проектирования такой
системы заключается в том, чтобы найти мастера-профессионала по
ремонту PC, описать ему гипотетическую неисправную систему и
спросить его, каким образом можно определить неисправность, если
она действительно есть. Здесь подразумеваются грубые функцио-
нальные тесты, не требующие детальных знаний электроники.
5. Иногда при начальном освоении экспертных систем могут быть иден-
тифицированы в качестве концевых вершин два взаимно проти-
воречащих условия. Например, следующие два факта могут быть
фрагментом системы:
terminal-node ("Пик деловой активности").
terminal-node ("Кризис деловой активности").
Поскольку это концевые вершины, система запросит пользователя о
каждой из них, что представляется не очень разумным, так как одно
исключает другое. Как можно переписать правила, чтобы они содержа-
ли ту же информацию, но не создавали конфликта?
6. Исследуйте, какие изменения необходимо сделать в тексте программы
оболочки IMP для того, чтобы система сама открывала концевые вер-
шины, а не запрашивала их явно.
7. При работе с текстовыми строками оболочка IMP требует строгого
совпадения между строками-кандидатами, просматриваемыми для
использования в выводе или в объяснении как. Придумать способ
изменить работу системы так, чтобы можно было использовать при-
близительное совпадение между строками в соответствии с опреде-
ленным критерием сходства.
8. Можно ли с помощью простых изменений в оболочке IMP включить в
нее возможность рассуждений, использующих прямое связывание?
Что вы думаете об изменении ведущего правила?
182
8. ИНТЕРФЕЙСЫ
НА ЕСТЕСТВЕННОМ ЯЗЫКЕ:
НЕФОРМАЛЬНЫЕ МЕТОДЫ
8. 1. ВВЕДЕНИЕ В НЕФОРМАЛЬНЫЕ
МЕТОДЫ ОБЩЕНИЯ
Одним из основных требований к интеллектуальной
программе является ее способность вести с пользователем
диалог на естественном языке, а не на искусственном ма-
шинном. Однако научить ЭВМ понимать естественный
язык очень трудно: предложения в человеческой речи ча-
сто бывают неоднозначными, и они скорее подразумевают
какие-то факты, чем непосредственно констатируют их.
Вне зависимости от того, какой механизм програм-
мирования используется для выполнения работы, обес-
печить компьютеру возможность взаимодействия на
естественном языке непросто. Однако из всех современ-
ных языков программирования именно Пролог наиболее
подходит для создания интерфейсов на естественном язы-
ке. Пролог позволяет обнаруживать и переоформлять об-
разцы внутри строк символов. Это еще одна причина,
по которой ЭС, написанная на Прологе, считается лучше
программы, написанной, к примеру, на языке Си, или
Паскаль, или Модула-2. Создать механизм вывода на
этих языках вполне возможно, но они не пригодны для
получения хороших интерфейсов на естественном языке.
Во всех ЭС с такими интерфейсами используется язык,
особым образом адаптированный для машинной обработ-
ки. Большинство систем воспринимают одновременно не
более одного вводимого пользователем предложения, ко-
торое должно содержать либо полный запрос, либо пол-
ную единицу декларативных знаний. Оно должно быть
понятно само по себе, без ссылок на другие последующие
или предыдущие единицы информации. Чем проще
структура предложения, тем легче машине обрабатывать
его. Кроме того, существуют предложения, которые могут
вызвать сбой в системе.
В данной главе мы рассмотрим две неформальные стра-
тегии создания интерфейсов на естественном языке. Эти
стратегии не вытекают из общей теории внутренней
структуры предложения, а скорее мотивированы структу-
183
рой типовых строк, которые пользователь вводит, запра-
шивая у машины информацию или передавая указания
выполнить то или иное действие. Большинство таких за-
просов можно разделить на классы, чтобы впоследствии
было удобно распознавать их по каким-либо ключам. Та-
кая информация может быть затем использована для за-
пуска установленных образцов работы, которую
компьютеру предстоит выполнить.
Первая стратегия состоит в нахождении ключевого
слова в тех ограниченных случаях, когда мы можем га-
рантировать,что это слово в предложении несет всю важ-
ную информацию.
Вторая стратегия более сложна. Она позволяет зада-
вать вопросы отвечающим системам, которые ассоцииру-
ются с базами данных. Анализ типичного вопроса выявил
несколько интересных особенностей. Одна из них состоит
в том, что вопрос обычно касается простой связи (отноше-
ния) типа
руководитель-отдела (X.Y)
длина-реки(Х,У)
стоимость-запчасти (X,Y)
где X и Y могут представлять конкретную реализацию
(конкретизацию) данного отношения.
Вторая особенность заключается в том, что если систе-
ма по запросу выдает все возможные реализации любой
связи, то имеется довольно простой способ отвечать на
вопросы. Устанавливается критерий, по которому осуще-
ствляется выбор определенного поднабора всех представ-
ляющих интерес реализаций, и выполняется операция
фильтрации. Все реализации генерируются в последова-
тельности, но только отвечающие установленному кри-
терию могут пройти через фильтр. Например, если мы
хотим получить список рек длиной более 1000 миль, до-
статочно сгенерировать наименования всех рек в базе
данных и отбросить те из них, длина которых составляет
менее 1000 миль. Это весьма мощный метод, но он может
и не сработать, если ответов будет слишком много.
Система, отвечающая на вопросы по изложенному вы-
ше принципу, использует ключевые слова для извле-
чения из запросов характерных образцов. Каждый запрос
ассоциируется с одним и только одним образцом. Эти
образцы содержат информацию о типе вопроса и об
отношении, которого касается вопрос. Образец, ассоции-
рованный с конкретным запросом, может быть использо-
ван для запуска соответствующих операций поиска в базе
данных.
184
8. 2. ИЗВЛЕЧЕНИЕ ЗНАЧЕНИЯ
ИЗ КЛЮЧЕВЫХ СЛОВ
8.2.1. ОПЕРАЦИЯ ПРОСМОТРА КЛЮЧЕВЫХ СЛОВ
Простейший вид интерфейса на естественном языке
предусматривает просмотр ключевых слов в качестве ос-
новы для выполнения операций. В небольших фрагментах
естественного языка, таких, как вопрос или команда, в
большинстве случаев имеется одно слово или же слово с
несколькими модификаторами, которое является ключе-
вым. Механизм просмотра ключевых слов основан на по-
иске частей предложения, содержащих нужное слово, и
отбрасывании всего остального. При этом происходит вы-
борка данных или табличное преобразование либо возвра-
щение выработанного заранее ответа.
Программы такого типа при правильном использова-
нии чрезвычайно просты.
Механизмы просмотра ключевых слов имеются в при-
кладных программах, где пользователю необходимо зада-
вать вопросы или давать команды, число форм которых
ограничено. Пользователь может “разговаривать” с сис-
темой на языке, напоминающем естественный, однако
этот диалог будет иметь упрощенный синтаксис, доступ-
ный для понимания компьютером.
8.2.2. ИНФОРМАЦИОННАЯ СИСТЕМА ДОКУМЕНТАЦИИ
Программа, использующая механизм просмотра клю-
чевых слов, располагает некоторыми функциями, кото-
рые поддерживаются естественным языком. Эти функции
могут быть разнообразными (см., например программу
MIONDGAMES в гл. 2). Мы хотели бы остановиться на
еще одном примере программы просмотра ключевых слов,
которая к тому же формирует элементарную ЭС.
Речь идет об информационной системе документации.
Многие крупные компании издают руководства по своим
продуктам, объем которых измеряется в тоннах. Эта про-
блема особенно остра в программировании и информати-
ке, где каждый программный продукт должен иметь свою
документацию, и соответствующие руководства подвер-
жены частым изменениям. Служащий, изучающий новую
для себя область и вынужденный читать документацию
по различным используемым в ней средствам программи-
рования, просто запутается во всех этих руководствах. К
примеру, создатели программ, работающие на большой
185
ЭВМ типа IBM, за год пролистывают около 100 тыс. стра-
ниц руководств.
Идея, лежащая в основе информационной системы до-
кументации (DOCSYS), проста. Программе известны все
индексные указатели из всех представляющих интерес
руководств. Каждый индекс становится элементом дан-
ных для системы. Пользователь может задавать системе
вопросы типа
“Расскажи мне об EDLIN”
или
“У тебя есть какая-нибудь информация об EDLIN?”
ИЛИ
“Пожалуйста, помоги мне. Где мне найти ссылку, касающуюся
EDLIN?”
Система определит, что вопрос был задан о строковом
редакторе PC-DOS EDLIN, просмотрит индексы, найдет
все ссылки на него и выдаст сообщение о том, где можно
обнаружить эти ссылки. Сообщение системы может иметь
вид
EDLIN можно найти в СПРАВОЧНИКЕ 1 на страницах [41-46, 57]
EDLIN можно найти в СПРАВОЧНИКЕ 2 на страницах [100-102]
EDLIN можно найти в СПРАВОЧНИКЕ 7 на страницах [100,110]
8.2.3. ДЕТАЛЬНОЕ ОПИСАНИЕ СИСТЕМЫ DOCSYS
8.2.3.1. Структуры данных для системы
Давайте посмотрим, как такая система выглядит на
Прологе. Так как основная проблема заключается в по-
иске (выборке) данных, начнем с изучения формы дан-
ных.
Основной тип данных - индексы. В рассматриваемой
программе они состоят из имени предиката, ind и аргу-
мента, несущего информацию. Первый элемент представ-
ляет собой название публикации (издания), второй -
название темы, а третий - список страниц, где находятся
ссылки на эту тему. Первые два аргумента в ind являются
строками, третий - списком строк. Заметьте, что если те-
ма присутствует в нескольких публикациях, она будет
иметь несколько индексов. Ниже приводится пример, ил-
люстрирующий изложенное:
186
ind ("ВООКГ,"LOGOFF", ["99"]).
ind("BOOKl","EDUN", ("41-46","57"])
]nd("BOOK2","EDUN", ("100-102"]).
ind("BOOK7","EDLIN", ("100","l 10"]).
ind ("BOOK1 ","EXE", ("14-18"]).
ind ("BOOK1 "."ECHO", ("35","146"]).
ind("BOOK7","BNF", ["51 ","55-56"]).
ind ("BOOK7","BNF, ["30-31"]).
ind ("BOOK8","BNF", [" 109","130-148"]).
ind ("BOOK4","RECURSION", ["56-78"]).
ind ("BOOK7","RECURSION", ["119-125"]).
Обычно, когда пользователь задает вопрос об опреде-
ленном термине, он получает ответ на свой вопрос в фор-
ме, отличной от точной формы индекса. По возможности
полезно иметь запас синонимов, которые система могла
бы распознавать. Так, существует только один экземпляр
индекса для LOGOFF, но поскольку пользователь мо-
жет попытаться найти эту информацию под названием
LOGOUT, что может быть достигнуто заданием соответ-
ствующего синонима, например:
dsyn ("LOGOUT","LOGOFF").
dsyn ("LOGIN","LOGON").
Известны и другие способы задания синонимов, кото-
рые мы здесь кратко рассмотрим.
Последний элемент данных, использованный системой,
образован группой слов, обычно присутствующих в воп-
росах, но никакого отношения к стратегии просмотра
ключевых слов они не имеют. При интерпретации запро-
са будет удобным считать их “посторонними” и полно-
стью игнорировать. Ниже приводятся некоторые из этих
слов.
reject ("HOW"),
reject ("GO"),
reject ("WOULD")
reject ("COULD"
reject ("SHOW"),
reject ("ALL"),
reject ("FINDING"),
reject ("LISTING").
reJectCIS").
reject ("ARE").
reject ("ANYTHING"),
reject ("ANY").
reJectCOUT")
reject ("KNOW"),
reject ("THE").
reject ("A").
reject ("SOME").
reject ("INFORMFTION")
reject ("ON").
reject ("OFF").
reject ("REFERENCE”).
reject ("REFERENCES"),
reject ("LISTING").
reject ("INDEX")
reject ("YOUR"),
reject ("INFO"),
reject ("I"),
reject ("FIND"),
reject ("YOU"),
reject ("DO"),
reject ("HAVE"),
reject ("CAN"),
reject ("WHY"),
reject ("ABOUT").
187
reject ("ME").
reject ("TO"),
reject ("WHERE"),
reject ("WANT"),
reject ("DO").
reject ("CAN"),
reject ("PLEASE"),
reject ("LISTINGS").
reject ("GET").
reject ("HELP").
reject ("UP").
reject ("LOOK").
reject ("EVERYTHING").
eject (",").
reject ("?").
reject (".").
8.2.3.2. Стратегии программирования
Рассмотрим основные свойства кода для данной про-
граммы. В этом разделе дается предикат самого высокого
уровня. С него начинается работа системы:
docdriver if repeat,nl,getquery(X),findref(X,Y).
produceans(Y),fail.
Одно из замечательных средств, имеющихся в Про-
логе, - управление окнами. Информационная система
документации может предоставить окно для запроса и от-
дельное окно для ответа. Сделать это довольно просто, но,
чтобы не запутывать вопрос об обработке ключевых слов,
мы не будем касаться данной темы.
Вся работа системы происходит в промежутке между
предикатами repeat и fail. Это стандартная операция Про-
лога, которая организует в программе бесконечный цикл.
Предикат getquery подсказывает пользователю его воп-
рос и возвращает последний обратно в виде списка симво-
лов, связанных с аргументом предиката:
getquery (Z) if write ("Пожалуйста, задайте ваш вопрос."),
nl,readin (Y),upper-lower (Y1 ,Y),
changeform(Yl.Y).
Здесь readln представляет собой встроенную функцию,
которая собирает первичную вводимую пользователем
информацию в виде строки, upper-lower - другой встроен-
ный предикат, изменяющий буквы строки на заглавные,
что позволяет программе внутренне поддерживать все
факты в заглавной форме. Нам необходимо поменять за-
прос на список символов, потому что в Прологе предпоч-
тительны нечисловые данные, имеющие внутреннюю
структуру именно в такой форме. На этой стадии введен-
ная информация все еще находится в форме строки сим-
волов. Ее замена на список символов будет произведена с
помощью другой встроенной функции, fronttoklen, кото-
188
рая может удалять имена символов из строк символов.
Вся операция “упакована” в предикат, который называ-
ется changeform:
changeform (S,[H\T]) if fronttoken(S,H,SI),!,
changeform (S1,T).
changeform (-[ ]).
Первый аргумент предиката changeform является стро-
кой, второй - эквивалентным списком символов. Напри-
мер, если мы попытаемся использовать это правило, то
получим:
changeform ("TELL ME ABOUT EDLIN", [TELL,ME, ABOUT,EDLIN]).
Когда getquery выполнит свою работу, с помощью пре-
диката findref будет выделено ключевое слово в запросе.
Он найдет первый символ в запросе, который не помечен
как вспомогательное слово:
findref (X,Y) if memberof (X,Y),not (reject (Y)),!.
Например, используя findref таким образом:
findref ([TELL,ME,ABOUT.EDLIN] ,Y),
мы в результате свяжем Y со значением EDLIN.
После того как ключевое слово выделено, в дело
вступает довольно-таки сложный предикат, состоящий из
четырех предложений, - produceans. Он “несет ответст-
венность” за составление ответа и доведение его до поль-
зователя.
produceans (X) if ind (XI ,X,Y) ,putflag,
write (X," может быть найдено в справочнике “,
XI," на страницах “,Y,"."),nl.
produceans(X) if syn(X,Z),ind(Xl,Z,Y),putfiag,
write(X," может быть найдено в справочнике “,
XI," на страницах “,Y,"."),nl.
produceans (-) if not (flag),
write ("Информации об этом нет.") ,nl.
produceans (-) if remflag.
Остановимся на некоторых особенностях этого преди-
ката. Во-первых, правило состоит из четырех предложе-
ний и вложено в цикл repeat-fail.
repeat,nl,getquery (X),findref (X,Y) «produceans (Y) Jail.
Это подразумевает перебор с возвратами. Каждый раз,
когда в цикле управление передается produceans, такой
189
способ поиска (перебор с возвратом) гарантирует иссле-
дование всех возможных вариантов для первого предло-
жения, затем для второго, для третьего и, наконец, для
четвертого.
Если вы изучите структуру правил, то обнаружите, что
первые два предложения устанавливают ответы на запро-
сы, а третье записывает сообщение о том, что ответа не
существует. В том случае, когда перебор с возвратом осу-
ществляется через все эти предложения, нам необходимо
удостовериться в том, что ответы правильны и выдаются
своевременно. Мы воспользуемся механизмом, записыва-
ющим элемент данных, который служит для получения
истории запроса, в базу данных. Такой элемент данных
называется флагом. Он заносится в базу данных при вы-
полнении одного из двух первых правил. Смысл этого
действия состоит в подтверждении того, что ответ найден.
Третье предложение может затем проверить флаг, чтобы
решить, следует ли выдать сообщение о том, что ничего
не найдено. Последнее предложение всегда удаляет флаг
из базы данных, так как он может мешать действию сле-
дующего запроса.
Для управления этой процедурой предусмотрены две
низкоуровневые функции доступа. При использовании
предиката putflag в базе данных появится только один
флаг, а при использовании предиката remflag флаг будет
удален из базы данных, если он там находится. Ниже
приводятся определения правил:
putflag if not (flag) .assert (flag),!.
putflag.
remflag if flag,retract(flag),!.
remflag.
И последнее, что хотелось бы обсудить, - это вопрос о
синонимах. Существуют некоторые общие правила опре-
деления синонима. Одно из них заключается в том, что
если А является синонимом В, то В является синонимом
А. Имеются также правила, позволяющие системе рас-
познавать предсказуемые формы единственного и множе-
ственного числа слов как синонимичные:
syn(Y,X) if dsyn(X.Y).
syn(Y.X) ifdsyn(Y.X).
dsyn(Y.X)- if concat(X,"S",Y).
dsyn(Y,X)~ if concat(X,"ES",Y).
dsyn(Y,X)- if concat(X,"S",Y).
190
8. 3. ИЗВЛЕЧЕНИЕ ЗНАЧЕНИЙ
ИЗ ОТНОШЕНИЙ СУЩНОСТЕЙ
8.3.1. ОТ КЛЮЧЕВЫХ СЛОВ К ШАБЛОНАМ:
ПРОГРАММА GEOBASE
Компания Borland разработала программу GEOBASE,
особенность которой заключается в том, что она принима-
ет запросы, сделанные на естественном языке, если поль-
зователь спрашивает о географии Соединенных Штатов.
Эта программа является базой данных, ведущей диалог
на естественном языке, и одним из первых примеров
широкомасштабного применения технологии естествен-
ного языка.
Мы рассмотрим структуру GEOBASE, потому что она
основана на идее просмотра ключевых слов. Фактически
вместо ключевых слов программа ищет некие образцы бо-
лее высокого уровня, которые содержат информацию о
специфике вопроса (т.е. о том, что именно спрашивается)
и о его форме. Эти образцы находятся посредством пе-
редачи запросу шаблонов. Каждый интересующий нас
образец имеет свою структуру, встроенную в один из
шаблонов. Когда шаблон совпадает с образцом, произво-
дится анализ структуры вопроса.
Шаблон подобен вырезанной перфокарте с ячейками.
Если он налагается на соответствующую ему форму,
ячейки заполняются полезной информацией. Если же та-
кого соответствия нет, ячейки либо заполняются “мусо-
ром”, либо остаются пустыми.
В GEOBASE ячейки созданы кодом Пролога, что дела-
ет их весьма гибкими. Каждый шаблон является прави-
лом Пролога, и процесс отождествления на этом языке
соответствует физическому наложению реального шабло-
на на печатную форму. Если правило не сработает, зна-
чит, шаблон не был использован с той формой (типом
вопроса), для которой он был создан. Срабатывание пра-
вила свидетельствует о том, что форма вопроса понятна,
так как каждое правило соответствует только одному ти-
пу вопроса. Аргументы, экземпляры которых создаются в
этих правилах, эквивалентны ячейкам, заполняемым в
настоящем шаблоне, и точно определяют смысл вопроса.
Вся операция в GEOBASE может быть разбита на три
части:
1. Синтаксический анализ - программа выясняет, что
именно пользователь хочет узнать посредством нахожде-
191
ния и заполнения шаблона, который соответствует вопро-
су.
2. Создание подходящего запроса с использованием
свойства Пролога комбинировать образцы.
3. Выбор данных по этому запросу с помощью средств
Пролога как обработчика базы данных.
GEOBASE не является экспертной системой. Однако
вам полезно знать, как она работает с естественным
языком. Программа использует, там где это возможно,
неформальные методы, которые представляют собой от-
личный “мостик” между механизмом просмотра ключе-
вых слов и формальными, основанными на грамматике,
методами, о которых речь пойдет в следующей главе. К
GEOBASE можно обращаться посредством любой рабочей
версии Турбо Пролога. Это важно, поскольку в данной
области нелегко найти хорошие системы для обучения:
большинство из них громоздки и дорогостоящи.
8.3.2. ВОЗМОЖНОСТИ GEOBASE
Система содержит следующую информацию:
Данные о штатах:
Общая площадь
Численность населения
Столица
Штаты, граничащие с данным
Реки
Города
Самая высокая и низкая географические точки
Данные о реках:
Длина реки
Данные о городах:
Численность населения
Пользователь может осуществлять выборку всей ин-
формации или ее части путем постановки правильно
сформулированных вопросов на естественном языке.
Приведем несколько примеров запросов, которые система
GEOBASE может обработать:
Штаты.
Дай мне города в Калифорнии.
Какой самый большой город в Калифорнии?
Какова самая длинная река в США?
Какие реки имеют длину более 1000 миль?
Каково название штата с наивысшей географической точкой?
С какими штатами граничит Алабама?
Какие реки не протекают через Техас?
Какие реки протекают через штаты, граничащие со штатом, столи-
цей которого является Остин?
192
8.3.3. ОСНОВНАЯ ОРГАНИЗАЦИЯ
БАЗЫ ДАННЫХ
В основу организации базы данных, где хранится гео-
графическая информация, положены семь типов главных
фактов. Любой факт или любое отношение обычно имеет
множество аргументов, и существует множество экземп-
ляров каждого факта. Ниже даются имена главных фак-
тов:
штат
город
река
граница
высокая низкая
гора
дорога
озеро
Пример одного из фактов о штатах::
state ("washington"",""wa","olympia",41.132e6,68.139e33,42,
“seattie”,"spokane","tacoma","bellevue"").
Вся информация, относящаяся к штату, компонуется в
этот один факт со многими аргументами. Города, указан-
ные в конце, являются крупнейшими по численности на-
селения.
Факт по городу выглядит следующим образом:
city ("massachusets","ma","Cambridge",95322).
Другие географически значимые факты - реки, озера и
горы:
river("columbia",453, ["washington", "oregon"]).
lake ("superior",82362, ["michigan","Wisconsin","minnesota"]).
mountain ("califomia","ca","shasta", 4317).
В этих фактах используются списки, если имеется пе-
ременное число вхождений сущностей, присоединяющих-
ся к объекту, который описывает факт, например штаты,
границы которых проходят по реке или озеру. Учтите, что
список городов не использовался в факте о штатах, пото-
му что для четырех самых больших городов были от-
дельно установлены специальные аргументы (причем их
число всегда равно четырем).
Имеется и факт, используемый для установления са-
7—751 193
мых высоких и самых низких географических точек в
каждом штате.
highlow("newyork","ny","mount marcy",1629,"atlantic ocean" ,0.)
Граница является предикатом, который задает для
каждого штата список граничащих с ним штатов:
border("oregon","or", ["Washington", "idaho","nevada", "California"].)
Наконец, имеются факты о важнейших дорогах. Благо-
даря этому отношению номер маршрута ассоциируется со
списком штатов, через которые проходит данная дорога.
road ("90", ["massachusetts","new york","Pennsylvania",
“ohio","Indiana","illinois","Wisconsin",
“minnesota","south dakota","Wyoming","montana",
“idaho","washington"].)
8.3.4. ФУНКЦИИ ВЫСОКОГО УРОВНЯ
Механизм ответа на вопросы, используемый системой
GEOBASE, заключается в определении отношения, кото-
рое составляет сущность любого вопроса: получить способ
генерирования всех экземпляров этого отношения и затем
отбросить неподходящие экземпляры. Программа органи-
зована в несколько функциональных частей, которые рас-
сматриваются ниже.
Пользователь делает запрос, который программа пре-
образует в список символов. Первый большой модуль осу-
ществляет операцию фильтрования, устраняя из этого
списка посторонние (лишние) для данного вопроса лексе-
мы. Система использует предикат filter для удаления всех
слов, относящихся к списку подобных ненужных (лиш-
них) слов. Он также удаляет лишние грамматические
элементы, такие, как запятые, точки и кавычки.
Отфильтрованный список слов обрабатывается про-
граммой, которая называется синтаксическим анализато-
ром. Именно она выполняет просмотр и поиск шаблонов.
Программа синтаксического анализа должна установить
основные связи, составляющие сущность вопроса. Она
должна также определить другие виды структурной ин-
формации в вопросе, которые позволяют использовать ос-
новные связи для сбора данных с целью получения ответа
на вопрос. Синтаксический анализ считается наиболее
сложной частью системы GEOBASE. В результате этого
194
процесса получается шаблон с реализованными (конкре-
тизированными) аргументами. Шаблон представляет
собой единичный сложный объект данных, который пе-
редается на следующую стадию обработки.
Фактически шаблон является нормализированной фор-
мой первоначального запроса. Структура была воспри-
нята правильно, а лишняя или случайная информация
игнорировалась. После преобразования вопроса в эту
форму синтаксическим анализатором система использует
функцию под названием eval для получения доступа к ба-
зе данных и выдаче ответов.
С чем же работает eval? Для каждой связи, которая
представляется важной для получения ответа на вопрос,
существует низкоуровневая функция доступа, которая
заново комбинирует информацию в базе данных, чтобы
программа могла быть написана так, как будто эта связь
присутствует в явной форме. Например, если нам нужно
узнать названия рек длиной более 1000 миль, в базе дан-
ных необходимо иметь подобные факты:
length-of-river (Columbia,453).
length-of-river(hudson,257).
Для экономии низкоуровневые функции доступа напи-
саны так, что для программы данные как будто существу-
ют в такой форме в момент, когда программа фактически
обращается к ним, хранимым в другой, более компактной
форме. Единственные явные данные по рекам, которыми
располагает GEOBASE, хранятся в форме
river("columbia",453, ["washington", "oregon"]).
Такая перекомпоновка фактов типична для Пролога.
Всякий раз при вызове eval она генерирует один воз-
можный ответ. Шаблон, ассоциированный с начальным
запросом, используется для управления процессом. Эта
функция применяется в предложении findall для того,
чтобы все ответы могли быть собраны вместе в случае,
если вопрос допускает несколько вариантов ответов. Ос-
тальные части предиката удаляют избыточные данные на
выходе, затем компонуют его и распечатывают выходные
данные.
На рис. 8.1 показана блок-схема с основными инфор-
мационными потоками в системе.
195
связи
Рис. 8.1. Информационные потоки в программе GEOBASE
GEOBASE является компьютерной программой, которая отвечает
на вопросы, задаваемые на естественном языке. Проблемная область
- факты по географии. Программа исключает несущественные слова
из запроса и затем заново формулирует запрос в форме одного из ряда
стандартизированных внутренних форматов. Для каждого из этих
форматов устанавливаются соответствующие механизмы, кото-
рые извлекают информацию из базы данных и компонуют ответ для
вывода пользователю
В схематической форме код для высокоуровневого фун-
кционирования программы будет выглядеть следующим
образом:
geodriver if
write ("Какой у вас вопрос? “),
readin (Query),
convert (Query,List),
filter (List,Purelist),
parse (Purelist,E,Q),
Tindall (Ans,eval (Q, Ans), Anslist),
makeanswer (Anslist,E).
Ядро программы содержится в подпрограммах parse и
196
eval. Структура базы данных достаточно проста, в чем вы
уже убедились. Итак, в механизмах этих подпрограмм
вопросы таинственно меняют привычную для нас форму и
превращаются в последовательность операций в базе дан-
ных, необходимых для получения правильного ответа.
8.3.5. СИНТАКСИЧЕСКИЙ АНАЛИЗ
Давайте проследим путь прохождения через систему
нескольких запросов на следующих примерах. Здесь важ-
но учесть, что parse (синтаксический анализатор) имеет
три аргумента:
parse(Data,E,Q)
Первый аргумент - вводимая переменная, которая со-
держится в отфильтрованном запросе. Заполненный шаб-
лон, получаемый в результате синтаксического анализа,
связывается с переменной вывода Q, являющейся третьим
аргументом. Второй аргумент не столь важен, и мы не
будем его касаться.
Пример 1
Запрос: Какие имеются города? (What cities do you have?)
К тому времени, когда запрос поступает на синтакси-
ческий анализ, в нем уничтожены все лишние слова, и
осталось лишь слово “cities” (города). Это первый аргу-
мент при вызове программы анализа parse. По завер-
шении выполнения программы выходным переменным
будут присвоены следующие значения:
E-“city"
Q -q-e("city").
Шаблон, который был определен, несложен. Он пока-
зывает тип вопроса, в частности вопроса, где речь идет о
сущностях (объектах) без квалификации. Аргумент озна-
чает, что задан вопрос о сущности (объекте) “city”.
Пример 2
Запрос: Какова длина Гудзона? (How long is the Hudson?)
Данные, поступающие в подпрограмму анализа
(parse), имеют форму списка важных слов, а именно:
(“longVhudson"]
197
По завершении работы программа анализа возвращает
такие значения выходных переменных:
Е - “length”
Q - “ q-eacc(”ltngth","or,"river","hudson").
Выбранный шаблон определяет вопрос как вопрос о
сущности ("length”), об ассоциации ("of’) и о другой сущ-
ности (’’river”), а также константу ("hudson”), с которой
связаны вышеуказанные сущности и ассоциация.
Заметьте, что шаблон является нормализованной,
внутренней формой данного вопроса. Мы могли бы за-
дать этот вопрос и другими способами, но в любом
случае результат, выдаваемый программой parse, был
бы тем же. Например:
Как велик Гудзон? (How big is Hudson?)
Какова длина Гудзона? (What is the length of Hudson?)
Пример 3
Запрос: Какие реки не протекают через Техас?
(What rivers do not run through Texas?)
Ввод для программы анализа parse будет несколько бо-
лее сложным. Могут быть проигнорированы только два
слова. Аргумент ввода имеет вид:
(“rivers”,"not", "run", "through", "texas"]
Вывод будет выглядеть так:
Е-“river”
Q - q-not("river",q-eaec("river","ln","state","texas")))
Шаблон, выбираемый системой, является вложенной
формой, включающей в себя более простой шаблон. Этот
простой шаблон иллюстрирует основную используемую
связь, а шаблон, в состав которого он входит, показывает,
как использовать эту связь для генерации ответов. Оче-
видно, мы получим список рек, и каждая река посредст-
вом подзапроса будет проверена на то, протекает ли она
действительно в штате Техас. Отрицательный ответ ока-
жется ответом на первоначальный запрос.
Пример 4
Запрос: Какой самый большой город в штате Вашингтон?
198
(What is the largest city in Washington?)
Аргумент ввода:
[“largest","city","in","washington"]
Программа анализа parse установит, что речь идет о
городах, но будет рассматривать форму нормализирован-
ного запроса:
E-“city”
Q - q-max ("city", q-eaec ("city", "in", "state","washington"))
Здесь также выбираются вложенные шаблоны. Внут-
ренний шаблон определяет базовую связь, а внешний вы-
ражает способ использования этой связи для генерации
ответов.
Синтаксический анализ - самая сложная часть системы
GEOBASE. Но сейчас имеет смысл отложить на время
исследование этого механизма и перейти к изучению ра-
боты оставшейся части программы. Мы вернемся к син-
таксическому анализатору в конце главы, а более
подробно методы синтаксического анализа будут рас-
смотрены в гл. 9.
8.3.6. НИЗКОУРОВНЕВЫЕ ФУНКЦИИ ДОСТУПА
К БАЗЕ ДАННЫХ
На первом уровне над базой данных существуют два
предиката, которые служат низкоуровневыми функциями
доступа. Обработка на более высоких уровнях происходит
с помощью этих функций и никогда не затрагивает базу
данных непосредственно.
Система обладает знаниями о некоторых низкоуровне-
вых сущностях (объектах): река, город, штат, дорога, озе-
ро и т.п. Функция доступа к сущности (ent) берет тип
объекта в качестве своего первого параметра и возвраща-
ет во втором параметре одно значение, которое эта сущ-
ность может принять. Например, если тип объекта город
(city), то последовательные вызовы ent дадут следующую
информацию:
ent(city,albuquerque)
ent (city ,arlington)
ent (city ,austin)
Помните, что это не факты, а правила, и именно они
позволяют программе работать таким образом, как будто
она имеет отдельные списки типов объектов, которые
199
важны для ее функционирования и прежде всего для того,
чтобы все данные имели одинаковую форму.
Правила сущностей выглядят следующим образом:
ent (city,NAME) if city(-,-,NAME,-).
ent (state,NAME) if state(NAME,-,-,-).
ent (capital,NAME) if state(-,-,NAME,
ent (river,NAME) if river (NAME,-,-).
ent (point,POINT) if highflow(-,POINT,-).
ent (point,POINT) if highflow(-,-,POINT,-,-,-).
ent (mountain,M) if mountain (-,-,M,-).
ent (lake,LAKE) if lake (LAKE,-,-).
ent (road,NUMBER) if road (NUMBER,-).
Аналогично тому, как ent может сгенерировать все эк-
земпляры определенного типа объекта, имеется еще одна
подобная ей функция, db, которая также находится на
первом уровне над базой данных и может сгенерировать
все экземпляры определенного типа связи. Связь состоит
из двух объектов, соединенных другим словом, определя-
ющим эту связь, например:
географическая точка в штате
штат с рекой
площадь штата
дорога в штате
Когда функция доступа к данным о дороге в штате при-
меняется последовательно, она возвращает такую инфор-
мацию:
db(road,in,state,17,new york)
db(road,in,state, 1 ,new york)
db (road,in,state,80,new york)
Цель применения функции db - создать иллюзию того,
что в базе данных поддерживаются отдельные списки всех
связей. На самом деле это, конечно, не так: они получа-
ются с помощью правил функций доступа, речь о которых
пойдет ниже.
Каким образом устанавливаются правила функции db?
Многие из них просто отображают изменение формы от
факта в базе данных до стандартного формата связей.
Например, именно таким способом устанавливается пра-
вило, позволяющее создать иллюзию, что система распо-
лагает списком штатов и городов:
db (state,with,city,STATE,CITY) if city (STATE,-,CITY,-).
Для каждой связи, известной системе, существует от-
200
дельное правило (подобное приведенному). Есть несколь-
ко более сложные правила, которые включают обработку
и изменение формы. Например, информация о дорогах в
определенных штатах разрабатывается следующим обра-
зом:
db(road,in,state,ROAD,STATE) if
road (RO AD,LIST) .member (STATE,LIST).
Каждый раз, когда возвращается предикат road (доро-
га), выдается номер дороги и список штатов, через ко-
торые она проходит. Предикат member (член) затем
проверяет, входит ли название штата из запроса db в
данный список. Если это так, правило выполняется.
8.3.7. МЕХАНИЗМ ОТВЕТОВ НА ВОПРОСЫ
После того как стандартная форма запроса, представ-
ленная шаблоном, установлена программой анализа
parse, вызывается подпрограмма eval. Она имеет два аргу-
мента, первый из которых является заполненным шаб-
лоном, второй - ответом. Например, предположим, что
задан вопрос:
Какова длина Гудзона? (How long is the Hudson?)
Когда синтаксический анализ будет выполнен, вступит
в действие подпрограмма evak
eval (q-eaec ("length", "of", "river", "hudson") .ANSWER)
Далее eval завершит свою работу, и второй аргумент
ANSWER будет связан следующим образом:
eval (q-eaec ("length", "of", "river", "hudson") ,257)
В некоторых ситуациях на запрос может быть выдано
несколько ответов, что обеспечивается главной програм-
мой путем вложения eval в предложение findall, которое
собирает все ответы в список:
Tindall (A,eval (Q, A) ,L)
где L - список ответов.
Эта оценочная функция должна быть определена с по-
мощью ряда правил. Для наглядности поясним их на тех
же примерах, которые использовались при демонстрации
201
высокоуровневого функционирования подпрограммы ана-
лиза (parse).
Пример 1
Запрос: Какие имеются города? (What cities do you have?)
Вспомните, что программа анализа преобразует этот
вопрос в стандартную форму, представленную заполнен-
ным шаблоном:
q-e("city")
Правило eval, запускаемое этим вводом, таково:
eval(q-e(E),ANS) if ent(E.ANS).
Иными словами, мы можем осуществлять оценку, если
найдем в базе данных что-либо подобное
ent("city",ANS)
Эту задачу выполняет правило сущности (объекта),
рассмотренное выше. При каждом его запуске из базы
данных извлекается название одного города.
Пример 2
Запрос: Какова длина Гудзона? (How long is the Hudson?)
Вы уже, очевидно, увидели форму шаблона, в которой
вопрос появляется в подпрограмме eval. Ниже приводится
правило eval, которое будет запущено:
eval(q-eaec(El,A,E2,C),ANS) if db(El,A,E2,ANS,C).
Что же это означает? Вспомните, что db является фун-
кцией доступа для получения связей, поэтому мы можем
осуществлять оценку, если в базе данных имеется что-ли-
бо подобное
db (length,of,river, ANS,С)
Пример 3
Большинство запросов требует обработки в правилах
eval. Приведем пример вложенного запроса:
Какие реки не протекают через Техас?
(What rivers do not run through Texas?)
202
Программа анализа выдает стандартизированную фор-
му запроса:
q-not ("river",q-eaec ("river", "in”, "state", "texas"))
В данном случае запускается правило eval:
eval (q-not (Е,TREE), ANS) if
findall (X,eval (TREE,X) ,L),
ent (E, ANS),
not (member (ANS ,L)).
Заметьте, что переменная TREE связывается с целым
вопросом q-eaec. Затем вопрос подвергается оценке внут-
ри предиката findall и выдается список всех рек в Техасе.
Предикат ent генерирует название реки всякий раз, когда
он вызывается. Он используется в качестве пробного от-
вета. Последнее предложение оценивает ответ, и если ре-
ка принадлежит к списку рек, протекающих через Техас,
ее название игнорируется. В противном случае оно выда-
ется как ответ на запрос.
Это пример так называемой стратегии генерации и тес-
тирования, применяемой для ответов на вопросы. Она не
сложна, но высокой скорости получения объектов при
большом количестве данных не обеспечлвает. В нашем
случае скорость вполне приемлема.
Пример 4
Имеются еще более сложные запросы, которые требу-
ют извлечения нескольких ответов из базы данных и по-
следующей выборки из них того, который удовлетворяет
определенным критериям, в частности:
Какой самый большой город в штате Вашингтон?
(What is the largest city in Washington?)
Запрос в стандартизованной форме, представленный
заполненным шаблоном, выглядит следующим образом:
q-max ("city", q-eaec ("city", "in", "state", "washington")
Запускаемое правило eval:
eval(q-max(ENT,TREE),ANS) if
findall (X,eval (TREE.X) ,L),
entitysize (ENT, ATTR),
sel-max (ENT, ATTR,-1ANS.L).
203
Переменная TREE связывается с целым вопросом q-
еаес. Предложение findall оценивает этот вопрос несколь-
ко раз и создает список городов в штате Вашингтон.
Следующее предложение определяет, какова численность
населения - интересующий нас атрибут. Последнее пред-
ложение выполняет сложную обработку, просматривая
все города в списке и выбирая из них одно с наибольшей
численностью населения.
Во всех этих примерах заполненные шаблоны управля-
ют доступом к базе данных неявно. Правила eval являют-
ся особым случаем, в них учитываются знания по
способам обработки определенных типов вопросов. Все
правила eval принимают шаблоны как аргументы. Шаб-
лоны представляют собой сложные объекты данных, име-
ющие свои собственные аргументы (на более низком
уровне). Это именно те аргументы, которые в конечном
итоге появляются в правой части правила eval, и они уп-
равляют выборкой. Глобальная архитектура правила eval
зато позволяет определить, как из разрозненных “кусоч-
ков” в конце концов получается ответ.
8.3.8. БОЛЕЕ ПОДРОБНО О СИНТАКСИЧЕСКОМ АНАЛИЗЕ
Все существующие интерфейсы на естественном языке
имеют специфические проблемные области и специфиче-
ские типы вопросов. Они разрабатываются после тща-
тельного изучения круга вопросов, которые MoiyT быть
заданы. Затем эта информация встраивается в синтакси-
ческий анализатор.
Синтаксический анализатор в системе GEOBASE име-
ет особый характер. Создается впечатление, его проек-ти-
ровщик решил занести в каталог максимально возможное
количество запросов по данной базе данных, а затем
разработал ответы на каждый вопрос. Впоследствии этот
механизм был обобщен, а система наделена дополнитель-
ными свойствами. Именно поэтому мы рассматриваем ее
при изучении неформальных методов создания интерфей-
са естественного языка.
При синтаксическом анализе мы имеем дело с норма-
лизованной формой запроса, представленного в виде за-
полненного шаблона, например:
q-eaec ("length", "оГ, "river”, "hudson").
Если запрос преобразуется в подобную форму, проце-
дура оценки становится весьма простой.
204
Чтобы понять, как функционирует синтаксический
анализатор, удобнее всего рассмотреть шаблоны, однако,
они не дают непосредственного представления о механиз-
ме программирования. Имеется другой уровень обработки
под уровнем шаблонов. Для обработки большинства за-
просов синтаксический анализатор системы GEOBASE
передает часть своей работы некоторой иерархии низко-
уровневых правил, каждое из которых выполняет опре-
деленный элемент задачи синтаксического анализа. Этот
метод носит название “синтаксический анализ” по парам
различий, и в следующей главе мы подробно обсудим его;
здесь же достаточно лишь сказать в общих чертах.
Каждая программа в иерархии получает список слов в
качестве входных данных. Этот список составляет часть
первоначального запроса. Подпрограмма высшего уровня
получает весь запрос целиком. Следующая подпрограм-
ма, расположенная на более низком уровне, анализирует
первое слово списка. Она выполняет все возможные дей-
ствия в рамках той информации, которая содержится в
данном слове, а затем передает оставшуюся строку еще
более низкоуровневой программе для дальнейшей обра-
ботки. Эта подпрограмма, в свою очередь, анализирует
только одно слово и выполняет все возможные (с учетом
накладываемых им ограничений) действия и т.д. На неко-
тором конечном низком уровне больше слов в строке не
останется, т. е. весь запрос будет проанализирован. Тогда
низкоуровневые подпрограммы начнут возвращать ин-
формацию на более высокие уровни, и мы сможем
получить полный ответ. Это и есть заполненный шаблон.
Синтаксический анализ по парам различий использу-
ется системой GEOBASE в тех ситуациях, когда более
простого пути обработки запроса нет. Каков же может
быть более простой путь? Создатели системы знали о
вопросах, которые будут задаваться наиболее часто, и
снабдили систему специальными, ориентированными на
особые случаи правилами для быстрого решения типич-
ных проблем. Прежде чем применять метод синтакси-
ческого анализа по парам различий, система всегда
проверяет, может ли быть задействован какой-либо из
простых механизмов.
Система GEOBASE использует неформальные методы
для ведения диалога на естественном языке в той степени,
в какой они допустимы. В качестве примера можно приве-
сти программу просмотра по ключевым словам. Эта про-
грамма очень сложна, поскольку занимается обработкой
205
особых случаев и поверхностных свойств. Она не исполь-
зует ни синтаксис, ни семантику в их обычном понима-
нии и исследует более глубинную структуру запроса.
Эта программа хотя и довольно велика, по крайней ме-
ре для масштабов ПЭВМ, не может обрабатывать многие
виды запросов, например:
В каком штате находится Кнохвил?
(Для подобных типов вопросов шаблонов нет)
Является ли Массачусетс штатом?
(Не предусмотрены ответы типа ДА или НЕТ)
Сколько имеется рек, превышающих по длине Гудзон?
(Нет свойств вторичного сравнения)
Каково расстояние от Нью-Йорка до Чикаго?
(В таблицы системы не включена информация о расстояниях от пун-
кта до пункта)
Через какие штаты проходит Делавар?
(Вопрос должен быть задан в другой форме, но система может отве-
тить на него)
Система GEOBASE, вероятно, достигла такого сос-
тояния, когда ее дальнейшее развитие посредством спе-
циальных расширений уже невозможно. Синтаксический
анализатор системы хотя и основан на продуманной тех-
нологии анализа по парам различий, слишком громоздок
и сложен. Читать код синтаксического анализатора труд-
но. Все это заставляет нас обратиться к формальным
методам, которые будут рассматриваться в следующей
главе.
Упражнения
1. Во многих системах с индексами объекты не организованы в виде
простых тем и номеров страниц. Индекс может быть построен как
тема, подтема и номер страницы либо как тема, подтема, под-подте-
ма и номер страницы и т.д. Измените информационную систему до-
кументации (DOCSYS) таким образом, чтобы могли быть
использованы любые из этих форматов индексов. Удостоверьтесь в
том, что DOCSYS достаточно интеллектуальна для работы на всех
возможных уровнях в базе данных, >де может находиться искомая
информация.
2. Просмотрите программу MINDGAMES, приведенную в гл. 2. Ее функ-
ционирование определяется целыми словами. Программа могла бы
распознавать ключевые слова в специальных темах лучше, если бы
она имела способность идентифицировать простые пары существи-
тельных и глаголов во входных данных. Обеспечьте программе
возможность распознавать следующие пары слов и выдавать пра-
вильные ответы на вопросы в случае, когда эти пары распознаны:
206
hate boss (ненавидеть шефа)
need money (нуждаться в деньгах)
meet girts (встретить девушек)
Сделайте этот механизм механизмом общего назначения, чтобы в
программу при необходимости могли быть добавлены другие подобные
пары.
3. Во многих естественных языках набор тем, по которым могут зада-
ваться вопросы, так же как и способ задания этих вопросов, весьма
ограничен. Для исследования этой проблемы полезно будет создать
реестр всех возможных вопросов, классифицировать их по группам,
а затем рассмотреть каждую группу как особый случай. Этот ме-
тод подразумевает, что после того, как система “поняла” смысл воп-
роса, происходит выборка данных. Для иллюстрации этого процесса
“поработайте” с информационной системой управления запасами в
универсальном магазине. Запишите столько вопросов, сколько вам
удастся придумать как пользователю такой системы. Последняя дол-
жна уметь отвечать только на ваши вопросы.
9. ИНТЕРФЕЙСЫ
НА ЕСТЕСТВЕННОМ ЯЗЫКЕ:
ФОРМАЛЬНЫЕ МЕТОДЫ
9.1. ФОРМАЛЬНЫЕ МЕТОДЫ ОБЩЕНИЯ
Крупномасштабные интерфейсы на естественном язы-
ке относятся к верхнему уровню программирования на
Турбо Прологе. Пока еще не ясно, получат ли распрост-
ранение практические программы подобного рода, но
поскольку этот вид программного обеспечения действи-
тельно существует, методы, о которых рассказывается в
настоящей главе, несомненно, будут совершенствоваться.
Мы рассмотрим два способа анализа структуры предло-
жения. Первый из них сводится к анализу синтаксиче-
ской структуры предложения в соответствии с правилами
формальной грамматики, второй - к анализу семантиче-
ской структуры. Второй метод называют также тематиче-
ским анализом.
Прежде всего выясним, что же такое синтаксис и се-
мантика. Обратимся к следующим предложениям:
Computers beer drink Компьютеры пиво пьют
Computers drink beer Компьютеры пьют пиво
Computers use data Компьютеры используют данные
С точки зрения синтаксиса и семантики первое предло-
жение неверно. Второе предложение синтаксически пра-
вильно, семантически - нет. Третье же верно с любой
точки зрения.
Синтаксис - это внешняя форма целого предложения,
включающая такие грамматические понятия, как пра-
вильный порядок слов и согласование в числе между
подлежащим (субъектом), сказуемым и дополнением
(объектом). Семантика подразумевает коммуникацион-
ное содержание предложения.
На Прологе довольно просто создать программу для
анализа синтаксиса. Ее основной алгоритм состоит в све-
дении к набору правил Пролога всех форм, которые
может принимать предложение. Далее осуществляется
сопоставление предложения с этими правилами. Если од-
но из правил запускается, то, значит, структура предло-
жения совпадает с заложенной в него структурой. Если
же ни одно из правил не будет запущено, предложение
имеет неверный синтаксис.
208
Однако здесь возникает проблема - как заставить ана-
лизатор действовать достаточно быстро во время выпол-
нения программы? Это не столь очевидно, но и не сложно,
что будет показано ниже.
Анализ семантики предложения традиционно отли-
чается от синтаксического анализа. Человек формирует
семантику предложения посредством одновременного со-
поставления ряда взаимодействующих факторов, каждый
из которых несет в себе часть необходимой информации.
Компьютерные программы могут быть основаны на подо-
бной методике, но анализ будет сложным и медленным.
На Прологе же можно использовать другой метод, в мень-
шей степени ориентированный на способ решения про-
блемы человеком. Это усовершенствованный метод
анализа посредством формальной грамматики.
Итак, в чем заключается данный способ семантичес-
кого анализа? Суть его - в регистрировании групп су-
ществительных, которые окружают главный глагол, и
последующем определении их семантической функции
в предложении. Иными словами, одна группа может
быть агентом действия, другая - реципиентом действия,
третья - выражать место совершения действия. Информа-
ция о значении глагола плюс данный список функций ок-
ружающих глагол существительных может достаточно
полно описать семантику предложения. Тот или иной ва-
риант этого метода семантического анализа заложен в ос-
нову всех современных систем распознавания текста.
Традиционно система распознавания текста строилась
как иерархия более простых систем. Ее основанием явля-
ется синтаксический анализатор, который воспринимает
исходный текст и выдает лексемы, представляющие син-
таксическую структуру. Следующим идет семантический
анализатор, использующий результаты синтаксического
анализа плюс элементы своей собственной проблемной
области экспертизы для определения семантики предло-
жения. Над всем этим может находиться другой модуль,
который занимается исследованием входных данных,
однако уже не на уровне отдельных предложений, а на
уровне целого текста. Такой анализатор очень сложен и
здесь не рассматривается. Пролог позволяет усовершенст-
вовать традиционную методику анализа первых двух
уровней, объединив их в одну программу. Объяснить вам,
что представляет собой такая программа, есть наша зада-
ча. Мы будем решать ее поэтапно, начав с описания мето-
дов анализа синтаксической структуры.
209
9.2. АНАЛИЗ СИНТАКСИЧЕСКОЙ
СТРУКТУРЫ ПРЕДЛОЖЕНИЯ
Имеется стандартный способ описания структуры
большинства предложений, который отражает их поверх-
ностную грамматическую форму. Базовой единицей
предложения является слово, и если мы не касаемся ана-
лиза речи, нет необходимости членить эти единицы да-
лее. Следующая единица предложения - группа слов или
словосочетание.
Рассмотрим словосочетания. Именное словосочетание
(пр) - это простое существительное, собственное сущест-
вительное или существительное плюс соответствующие
прилагательные либо определители этого существитель-
ного. Глагольное словосочетание (vp) представляет собой
глагол или глагол плюс соответствующее наречие либо
вспомогательное слово. Предложное словосочетание (рр)
есть с именным словосочетанием, которое следует сразу
же за предлогом; функция предложного словосочетания
в предложении определяется функцией предлога. С этой
точки зрения предложение может быть представлено как
упорядоченный набор именных, глагольных и предлож-
ных словосочетаний.
Задачей грамматики будет определение сложного це-
лого - предложения, построенного из составных частей.
Если грамматика “работает” на синтаксическом уровне,
она просто регистрирует как составляющие части все фор-
мы, которые может принимать предложение, например:
предложение пр, vp
Пример: Большой мужчина закричал (The big man cried)
предложение “"*np, vp, np
Пример: Юрист прочитал завещание (The lawyer read the will)
предложение np, vp, vp
Пример: Кот спал на важных бумагах (The cat slept on the important
papers)
Отметьте форму этих грамматических правил. Стан-
дартным способом интерпретации грамматического пра-
вила будет такой, при котором структура слева от стрелки
определяется как набор более простых структур, показы-
ваемых справа от стрелки. Согласно первому грамматиче-
скому правилу, например, одной из возможных структур
предложения является структура, состоящая из именного
210
словосочетания, за которым следует глагольное словосо-
четание.
Итак, вы знаете теперь, как определить предложение.
Грамматика обычно имеет иерархический характер, по-
тому что структуры справа от стрелок в грамматических
правилах должны определяться другими, более низко-
уровневыми грамматическими правилами. Ниже при-
водится несколько способов представления структуры
именного словосочетания.
пр“* существительное
Пример: animals (животные)
пр собственное имя существительное
Пример: John (Джон)
пр "► прилагательное, существительное
Пример: large salaries (большая зарплата)
пр определитель, существительное
Пример: the apple (яблоко, определитель — определенный артикль
the)
пр определитель, прилагательное, существительное
Пример: a spicy pizza (вкусная пицца)
пр определитель, прилагательное, прилагательное, существитель-
ное
Пример: the fat, silly salesman (толстый, глупый продавец)
Предложное словосочетание определить легко, потому
что для этого мы можем использовать уже определенные
именные словосочетания:
рр предлог, пр
Пример: In the bank (в банке)
Подструктура глагольных фраз также может быть вы-
ражена грамматикой.
vp глагол
Пример: thinks (думает)
vp глагол, наречие
Пример: schemed obsessively (круто замесить)
211
В грамматике необходимо зарегистрировать и единицы
низкого уровня - слова. Каждое слово, которое будет уз-
навать грамматика, вместе с его типом должно быть запи-
сано в программе. Предложения могут создаваться только
из имеющихся слов.
Предположим, имеется список слов:
определитель ”*а
определитель ”* the
определитель “* that
определитель “* those
глагол ”* thinks
глагол ”* cries
глагол”* drinks
глагол ”* sings
наречие ”* happily
существительное ”* money
существительное”* power
существительное ”* food
существительное ”* music
существительное ”* bank
существительное ”* person
собственное имя существительное ~* John
прилагательное “* popular
предлог ”* over
предлог ”* about
предлог “* in
Грамматика, которую мы используем, описывает рад
возможных типов предложений, но некоторые типы пред-
ложений не будут включены в описания, например:
The band played popular music.
(Оркестр играл популярную музыку)
поскольку слова band и played не включены в граммати-
ку.
Предложение
A large and juicy bank account is his goal.
(Большой и первоклассный банковский счет - его цель)
не описано грамматикой не только потому, что оно содер-
жит незнакомые слова, но и потому, что это предложе-
ние имеет некоторые структурные особенности, которые
грамматика не распознает, например прилагательные, со-
единенные союзом “large and juicy”, или притяжательное
местоимение “his”.
Мы описываем грамматику, которая называется кон-
текстно-свободной. Чтобы понять смысл этого термина,
вспомните, что общей формой грамматического правила
является следующая:
212
a “^b.c.d
Например:
предложение “*np, vp, np
Согласно данному грамматическому правилу структу-
ра типа а имеет подструктуру, состоящую из более про-
стых структур типов Ь, с и d. Грамматика располагает
списком возможных значений для Ь, подобным списком
для с и подобным же списком для d. Контекстно-свобод-
ная грамматика подразумевает, что любое значение из
списка Ь может быть использовано с любым из значений
из списка с, за которым следует любое значение списка d.
Выбор из одной части определения не налагает ограниче-
ний на возможности выбора из других частей. Если бы
грамматика была контекстно зависимой, выбор из одного
списка ограничивал бы возможности выбора из другого
списка.
Контекстно-свободная грамматика не может описать
весь естественный язык. Вопрос, как это сделать, остается
открытым. Но такая грамматика может описать большую
часть языка, хотя тогда она будет очень громоздкой. Тем
не менее эта грамматика настолько проста и описательна,
что ее обычно берут за основу анализа.
Предположим, у нас есть большая грамматика, и мы
хотим создать с ее помощью программу на Прологе. Де-
кларативный характер Пролога позволяет преобразовы-
вать правила грамматики непосредственно в код.
Например, первое грамматическое правило, описываю-
щее предложение, становится правилом Пролога:
sentence (S) if append(S1,S2,S), np(Sl), vp(S2).
Все переменные в этом правиле являются списками
символов. Правило читается так: список символов S мо-
жет быть понят как предложение, если можно разде-
лить его на две части S1 и S2 таким образом, чтобы с
помощью вспомогательных правил определить S1 как
именное словосочетание, a S2 - как глагольное словосоче-
тание. Предикат append и осуществляет такое разделение
списка S. Обычно он используется для конкатенации дан-
ных ему первых двух списков и для вывода результатов в
третий список. Есть и другой способ использования этого
предиката: ему дается третий (итоговый) список, а он на-
ходит исходные списки и создает два меньших списка Sin
S2, которые при конкатенации составили бы список S.
213
Остальные правила грамматики также преобразуются
в правила Пролога:
np(S) if append (SI »S2,S)»adjective (SI), noun (S2).
vp(S) if append(S1,S2,S), verb(Sl), adverb(S2).
Некоторые части грамматики на Прологе имеют еще
более простую структуру, например, слова могут быть
преобразованы непосредственно в факты Пролога:
determiner ([а]) определитель ([а])
verb ([thinks]) глагол ([думает])
noun ([money]) существительное ([деньги])
Учтите, что аргументы слов являются списками с од-
ним элементом. Это обязательное условие, так как слова-
факты должны взаимодействовать с предикатом append,
который может обрабатывать только списки.
Другие части грамматики сложнее, особенно те, где
структура слева от стрелки определяется тремя или более
структурами справа. Проблема состоит в том, что стан-
дартная версия append может конкатенировать только
два списка. Нам же нужно, чтобы осуществлялась конка-
тенация трех, четырех и более списков, либо мы можем
использовать этот предикат несколько раз. Чтобы преоб-
разовать правило
sentence О пр, vp, пр
необходимо сделать следующее:
sentence(S) if append(SX,SY,S),
append (S1 ,S2,SX),np (S1) ,vp (S2),
np(SY).
Это означает, что мы можем определить список симво-
лов S как предложение, если разобьем S на две части, SX
и SY, затем разобьем первую часть SX на две другие части
S1 и S2 и далее с помощью вспомогательных правил опре-
делим, что S1 и SY являются именными словосочетания-
ми, a S2 - глагольным словосочетанием.
Такая структура программы может быть расширена
для обработки больших наборов объектов, которые нахо-
дятся справа от стрелки в грамматических правилах.
Как недостаток преобразования правил в Прологе сле-
дует отметить зависимость от предиката append, который
недостаточно эффективен: перед выполнением правиль-
ной разбивки списка он проверяет слишком много проб-
ных разбивок. Грамматические правила, написанные
214
таким образом, могут работать в 5-50 раз медленнее, чем
правила, написанные методом анализа по парам разли-
чий. Однако при последнем способе правила утрачива-
ют свой декларативный характер и становятся слишком
сложными: теряется непосредственное соответствие меж-
ду правилами и способами группировки слов в предложе-
нии. Анализ по парам различий использовался в системе
GEOBASE (см. гл. 8).
Прежде чем перейти к рассмотрению этого метода, хо-
телось бы указать еще один недостаток простой граммати-
ки и способ его устранения. Грамматика не обнаруживает
ошибки в предложениях типа
The careless inspector fall down the stairs
(Неосторожный инспектор падают на лестнице)
The careless inspectors falls down the stairs
(Неосторожные инспектора падает на лестнице)
Речь идет о согласовании в числе между подлежащим и
сказуемым: если подлежащее в единственном числе, то в
единственном числе должно быть и сказуемое. То же от-
носится и к множественному числу.
Проблема согласования в числе (как и многие подо-
бные ей проблемы) имеет стандартное решение. Оно за-
ключается в создании двух наборов всех правил: одного -
для ситуаций с единственным числом, второго - для ситу-
аций с множественным. Это можно осуществить путем
ввода второго аргумента во все правила Пролога, которые
были получены из грамматики. Такой аргумент является
символом и принимает только значение singular (единст-
венное) или plural (множественное). Например, для опре-
деления предложения мы использовали правило
sentence (S) if append (S1 ,S2,S), np (S1), vp (S2)
Можно записать это правило с другим аргументом, ко-
торый содержит информацию о числе:
sentenced,X) if append(SI ,S2,S), np(Sl,X), vp(S2,X)
Переменная X может быть связана с любым символом,
но фактически это правило используется только двумя
способами:
sentence (S,singular) if append (SI,S2,S),
np (SI, singular), vp(S2, singular)
sentence(S,plural) if append (S1,S2,S),
np (SI, plural), vp(S2,plural)
215
Важно помнить, что сказуемое должно согласовываться
в числе с подлежащим, а не с другим членом предложе-
ния. Если после сказуемого идет другое именное или
предложное словосочетание, его число может быть как
единственным, так и множественным.
Данное решение должно найти отражение на всех ни-
зших уровнях, например:
vp(S,X) if append(S1.S2.S), verb(S1,X), adverb(S2,-).
Второй аргумент для наречия (adverb) является “ано-
нимной” переменной, так как единственное число наре-
чия совпадает с множественным. Это справедливо также
для прилагательных и предлогов.
Глаголы и существительные, как правило, должны ре-
гистрироваться как в единственном, так и во множествен-
ном числе, например:
глагол ([thinks], единственное)
глагол ([think] , множественное)
существительное ([doctor], единственное)
существительное ([doctors], множественное)
Определители имеют весьма специфический характер,
и в каждом случае должны рассматриваться отдельно:
определитель ([that] .единственное)
определитель ([those] .множественное)
определитель ([the],-)
определитель ([а] .единственное)'
Некоторые определители, такие, как that (этот) и those
(эти), имеют различные формы для единственного и
множественного числа. Определитель the (определенный
артикль) имеет одну форму для того и другого числа.
Определитель а (неопределенный артикль) имеет только
форму единственного числа, а во множественном числе он
не используется.
Теперь у нас есть простая грамматическая схема,
которая позволяет анализировать структуру многих пред-
ложений на английском языке. Но это уже не контекстно-
свободная грамматика, поскольку имеется согласование в
числе между подлежащим и сказуемым. Чтобы сделать
нашу грамматику еще более пригодной для программиро-
вания, необходимо отказаться от предиката append и при-
нять метод анализа по парам различий.
Как же выполняется такой анализ? Прежде всего тре-
буется добавить по одному аргументу ко всем правилам
216
Пролога, т.е. каждое правило должно иметь три аргу-
мента.
Сущность анализа по парам различий заключается в
том, что объект в левой части грамматического правила
описывается справа двумя объектами. Первый объект
анализирует только первое слово в анализируемом спи-
ске, а другой объект получает оставшуюся часть списка.
Это весьма эффективный способ, но вопросы эффектив-
ности мы обсудим позднее.
Каждый предикат, который использует анализ по па-
рам различий, имеет в качестве аргументов два списка:
первый - вводимые данные, а второй, более короткий, -
выходные. Рассмотрим простой пример. Значение
np(SO,S)
таково: для работы предиката необходимо изучить целый
список SO и в начале его найти именное словосочетание.
Оно удаляется для анализа из списка, и остается список S.
В результате получаем:
пр ([the,big,politician,talked,slowly], [talked,slowly]).
Приведем более обширный пример. Именное словосо-
четание типа
пр “►determiner, adjective, noun
определитель, прилагательное, существительное
в виде правила на Прологе выглядит так:
np(S) if append(SX,SY,S),
append (S1,S2,SX), determiner (SI),
adjective (S2), noun (SY).
Используя метод анализа по парам различий, мы по-
лучим более сложную структуру предложения:
np(SO,S) if determiner(SO,Sl), backnpl (S1,S).
backup 1 (SO,S) if adjecnive(SO,Sl), backnp2(Sl,S).
backnp2(S0,S) if noun (SO,S).
Здесь backnpl - хвостовая часть номер один именного
словосочетания, т.е. просто прилагательное и существи-
тельное; backnpl - хвостовая часть номер два именного
словосочетания, т.е. само существительное.
Обратите внимание на детализированную структуру
правил. Согласно этим правилам, начиная с первого, мы
можем быть уверены в том, что в начале списка SO имеет-
217
ся именное словосочетание, и после удаления этого слово-
сочетания из списка остается список S, если удается пока-
зать, что некоторые другие условия являются истинными.
В частности, нужно показать, что в начале исходного спи-
ска SO есть определитель, а в конце его - список S1 и что
хвостовая часть (backnpl) именного словосочетания нахо-
дится в начале списка S1; если объект backnpl удаляется,
то остается S.
Определение для backnpl подобно вышеприведенному.
Иными словами, мы можем быть уверены в том, что
в начале списка SO находится объект backnpl и после
его удаления остается список S, если удается показать
истинность некоторых условий. В частности, необходи-
мо показать, что в начале исходного списка SO есть при-
лагательное, а в конце - список S1 и что хвостовая часть
(backnpl) объекта backnpl находится в начале списка S1,
a S - в конце.
Последний предикат хвостовой части (backnpl) берет
последнее слово в именном словосочетании. Его задача,
найти существительное в начале строки, которую он об-
рабатывает, и передать дальше все, что останется от спи-
ска.
Посмотрите, как следует определять самые низкоуров-
невые объекты - слова - с помощью пар различий:
noun ([man IS],S).
verb ([reads I S],S).
Для написания грамматики с помощью метода анализа
по парам различий потребуется больше правил, чем при
использовании предиката append, поскольку каждое пра-
вило анализирует только первое слово словосочетания
или объекта, а затем передает оставшуюся часть другому
правилу. Однако эффективность анализа по парам разли-
чий выше, чем с помощью предиката append. При анали-
зе по парам различий нет необходимости в ненужных
(лишних или пробных) разбивках словосочетаний, как
это делается предикатом append. Здесь существует только
один способ разбивки - отсечение первого слова.
На высшем уровне при использовании метода анализа
по парам различий выполняется следующее правило:
sentence (SO,S) if np(SO,Sl), backsenl (S1,S).
Существует множество правил, определяющих backsenl.
Правило высшего уровня в схеме анализа по парам
различий имеет еще одну особенность. Оно часто исполь-
218
зуется со вторым аргументом, созданным к пустому спи-
ску. Если список, с которым мы работаем, действительно
является предложением, то все слова, входящие в предло-
жение, “отщепляются" от начала списка, поэтому неуди-
вительно, что остается пустой список. Например, если в
процессе анализа по парам различий требуется оценить
предложение “the young engineer smiled" (молодой инже-
нер улыбнулся), мы попросим систему сделать следую-
щее:
sentence ([the,young,engineer,smiled] , [])
что и будет успешно выполнено.
Итак, эти методы показывают, как проводить син-
таксический анализ с помощью Пролога. Читатель мо-
жет задать вопрос: почему мы только описываем, а не
действительно анализируем? Это обусловлено деклара-
тивным характером Пролога и является одним из пре-
имуществ его использования - нам достаточно лишь
тщательного описания.
Основанное на синтаксисе описание грамматики, пре-
образованное в правила Пролога, может использоваться
по меньшей мере тремя способами, которые будут из-
ложены ниже. Предположим, у нас есть набор правил,
объясняющих структуру предложений, причем правило
высшего уровня выглядит так:
sentence (X)
где X - главный аргумент (т.е. список символов, который
может быть, а может и не быть предложением). Мы не
будем пока рассматривать другие аргументы, но пока-
жем, как может быть использовано грамматическое опи-
сание:
Генерация
Если мы попросим систему решить эту проблему всеми
возможными способами (вводя запрос)
sentence (X)
Пролог создаст и выдаст каждое возможное предложение,
известное в грамматике.
Оценка
С помощью правил можно проверить, является ли спи-
сок предложением с точки зрения грамматики. Мы
вводим рассматриваемое предложение как аргумент пре-
диката и затем спрашиваем систему, верно ли это. Напри-
мер, воспользовавшись предикатом
219
sentence ([greedy .magistrate,whined])
мы получим сообщение, что введенный список не являет-
ся предложением из-за того, что нарушены правила грам-
матики - в начале предложения не хватает определителя.
Пролог-программа, используемая подобным образом, выяв-
ляет синтаксические ошибки. Можно проверять ошибки и в про-
грамме, написанной на другомязыке, например Си, Бейсике или
Аде.
Анализ
Анализ может проводиться наряду с оценкой. Оцени-
вая, является ли список предложением, Пролог разбивает
его на составные части, как это предусмотрено граммати-
кой. Для анализа же нас интересует то, как происходит
декомпозиция простейших частей. Данный процесс мож-
но проследить, расширив основные правила.
Итак, мы изучили некоторые методы "синтаксического
анализа и теперь можем перейти к семантике предложе-
ния.
9.3. АНАЛИЗ СЕМАНТИЧЕСКОЙ
СТРУКТУРЫ ПРЕДЛОЖЕНИЯ
9.3.1. ТЕМАТИЧЕСКИЙ АНАЛИЗ
Наиболее мощной стратегией для понимания смысла
предложения является тематический анализ посредством
падежной грамматики. Результаты тематического анали-
за могут служить ядром многих задач^по распознаванию
естественного языка. Чтобы проиллюстрировать это, рас-
смотрим систему для автоматического перевода текста с
английского на европейские языки (см. разд. 9.3.2).
Обсудим виды простых предложений. Некоторые пред-
ложения только описывают объекты:
Крыша старая
Анализ значения такого объектно-ориентированного
предложения несложен, потому что здесь лишь констати-
руется, что некоторому объекту присваивается та или
иная особенность. Более сложная группа предложений -
предложения-действия. Они описывают действия, кото-
рые может произвести объект или в которых он может
участвовать:
Старая крыша протекла.
Такие предложения анализировать труднее. Этим за-
220
нимается падежная грамматика. Главный элемент пред-
ложения - глагол - находится среди групп существитель-
ных, которые поясняют его действие. Для семантического
анализа нам необходимо изучить эти группы существи-
тельных, а именно их падежи. Падеж определяет отноше-
ние к главному глаголу данной группы существительного.
Далее мы опишем некоторые из наиболее распространен-
ных падежей групп существительных (см. Patrie Henry
Winston, Artificial Intelligence, pp. 71-84, Addison-Wesley,
Reading, Mass., 1979).
Объектный падеж
Итак, мы изучаем предложения-действия. Объект есть
группа существительных, которой передается действие,
выраженное глаголом, например, в предложении “Про-
фессор и его студент написали программу для компь-
ютера” группой существительных в объектном падеже
является слово “программу”.
Агентный падеж
Агенс есть сущность, которая применяет действие к
объекту. В приведенном выше примере группа существи-
тельных в агентном падеже - “профессор”.
Ко-агентный падеж
Ко-агенс - это другой агенс, участвующий в осуществ-
лении действия, о котором говорится в предложении. Он
связан с агенсом отношениями некоторой подчиненности.
В данном примере группой существительных в ко-агент-
ном падеже является “его студент”. Заметьте, что в эту
группу входит также и соответствующее притяжательное
местоимение.
Целевой падеж
Группа существительных в целевом падеже отобража-
ет, ради кого/чего произведено действие. В нашем приме-
ре это “для компьютера”.
Локутивный падеж
Здесь речь вдет о группе существительных, которые обозна-
чают место совершения действия. Например, в предложении
“Он заблудился в лесу” такой группой является “в лесу”.
Предложение может иметь несколько групп существительных
в локутивном падеже.
Временной падеж
Группа существительных во временном падеже выра-
жает время совершения действия. Например, в предложе-
нии “Я вчера его видел” такой группой будет “вчера”.
Инструментный падеж
Эта группа существительных обозначает то, что ис-
пользуется агенсом для совершения действия, выражен-
221
ного главным глаголом. Например,в предложении “Я лов-
лю рыбу большой сетью” такой группой является “боль-
шой сетью”.
Падежи источника и назначения
Предложение-действие часто описывает движение, ко-
торое происходит из одного места или состояния в другое.
Начальные и конечные места действия соответствуют ис-
точнику и назначению действия, например: “Он переехал
из Ленинграда в Москву”. Здесь группа существительных
в падеже источника “из Ленинграда”, а группа существи-
тельных в падеже назначения - “в Москву”.
Падеж траектории
В предложение часто входит группа существительных,
описывающая маршрут, по которому совершается дейст-
вие. Например, в предложении “Я прошел через леей
вышел на опушку” такой группой существительных в па-
деже траектории является “через лес”.
Падеж носителя
Если действие совершается в каком-либо носителе,
имеется группа существительных, стоящих в падеже но-
сителя. В предложении “Мужчинй проехал в машине че-
рез мост и остановился” такой группой будет “в машине”.
Определять группу существительных можно с по-
мощью программы. Мы расскажем далее, как это осуще-
ствить, но прежде сделаем несколько замечаний. Четко
зарегистрировать такие группы и свести их к определен-
ному каталогу невозможно, поскольку в зависимости от
поставленной задачи используютсй различные группи-
ровки.
Падежи групп существительных в предложении и граммати-
ческие падежи не всегда совпадают, и установить между ними
связь чрезвычайно трудно. В приводимых ниже предложениях
подлежащие и прямое дополнение меняются местами в зависи-
мости от способа оформления предложения:
The insurance agent bit the dog
(Страховой агент укусил собаку)
The dog was bit by the insurance agent
(Собака была укушена страховым агентом)
Цель тематического анализа, однако, - получение не
внешней формы, а значения (семантики) предложения. С
этой точки зрения в обоих предложениях агенсом являет-
ся “страховой агент”, а объектом, т. е. тем, на кого пере-
ходит действие, - “собака”.
Вспомогательные слова, обычно предлоги, входящие в
группу существительных, очень помогают в определении
222
тематической роли той или иной группы, но они явно не-
достаточны для точного определения падежа. Например,
предлог “в” может указывать как на временной, так и на
локутивный падеж и т.п.
Некоторые машинные программы, как и человек, опре-
деляют падеж группы существительных, используя раз-
нообразные виды информации одновременно: тип
предлога, значение глагола, порядок слов в предложении,
описываемый контекст, вспомогательные слова (части-
цы). Это сложный процесс. Вы увидите в дальнейшем, что
средство отождествления (сопоставления с образцом) в
Прологе позволит объединить все указанные методы в од-
ной программе.
9.3.2. АВТОМАТИЧЕСКИЙ ПЕРЕВОД:
ПРИМЕР ПРОВЕДЕНИЯ ТЕМАТИЧЕСКОГО АНАЛИЗА
В качестве примера рассмотрим систему автоматиче-
ского (машинного) перевода. Ядром этой системы и явля-
ется тематический анализ.
Регистрация всех падежей групп. существительных
плюс информация о главном глаголе служит формой вза-
имодействия между исходным (с которого осуществляется
перевод) и конечным (на который делается перевод) язы-
ками. Эта форма обеспечивает грамматический анализ
предложения вне рамок рассматриваемых языков.
Основу архитектуры системы перевода составляют
модуль для движения от исходного языка к языку-
посреднику и отдельный модуль для движения от язы-
ка-посредника к конечному языку. Такая архитектура
особенно эффективна при многоязычном переводе. На-
пример, мы хотим установить систему, которая могла
бы переводить документ с одного из языков определенной
группы на другой язык той же группы. В группу входят
английский, французский, немецкий, испанский языки.
Если сделать отдельную программу перевода для каждой
пары языков, то всего потребуется 12 программ для пере-
вода:
с английского на испанский
с английского на французский
с английского на немецкий
с испанского на английский
с испанского на французский и т.д.
Однако если используется архитектура системы перевода с
языком-посредником, достаточно только восьми программных
модулей, а именно:
223
с английского на язык-посредник
с испанского на посредник
с французского на посредник
с немецкого на посредник
с посредника на английский
с посредника на испанский
с посредника на французский
с посредника на немецкий
Приведем подробный пример автоматического перево-
да. Скажем, мы переводим с английского на русский
предложение:
Jane repaired the radio for Dan with the instruments
(Джейн починила радио для Дэна с помощью инструментов)
Первый этап перевода - тематический анализ англий-
ского предложения. Вот результат такого анализа:
Глагол: (to repair)
Время глагола: прошедшее
Вид глагола: 3-е лицо единственного числа (repaired)
Объект: the radio
Агенс: Jane
Инструмент: the instruments
Цель: Dan
Следующий этап - перевод всех определенных групп
существительных. Глагол тоже необходимо перевести.
Наиболее подходящим для этого представляется меха-
низм простых табличных преобразований.
Глагол: починить
Время глагола: прошедшее
Вид глагола: 3-е лицо единственного числа (починила)
Объект: радио
Агенс: Джейн
Инструмент: инструментов
Цель: Дэн
И последнее, что нужно сделать, получить доступ к правилу,
показывающему тот порядок слов, который должно иметь
предложение на русском языке при условии, что в него будут
входить все определенные падежи.
<агенс> <глагол> <объект> для <цель> с помощью <инструмент>
Заполнив имена падежей реальными падежами, мы
получим переведенное предложение:
<агенс> <глагол> <объект> для <цель> с помощью <инструмент>
Джейн починила радио для Дэна с помощью инструментов
224
В систему нужно включить также и модуль пост-про-
цессора, который должен просматривать предварительно
переведенное предложение и при необходимости согласо-
вывать окончания прилагательных и пр. в зависимости от
предлогов.
Подобный механизм перевода зависит от автоматиче-
ского анализа семантических функций различных частей
предложения. Модуль для выполнения этой работы и
служит программой перевода с английского на язык-по-
средник. В остальном перевод осуществляется програм-
мой-модулем перевода с языка-посредника на русский
язык. Она переводит группы существительных, обнару-
женные первым модулем, а затем размещает их в соот-
ветствии с принятым в конечном языке порядком слов в
предложении.
Этот механизм весьма неплохо работает на уровне про-
стых предложений, хотя нельзя сказать, что он соверше-
нен. Его эффективность в значительной степени зависит
от тщательности проведения падежного анализа, к рас-
смотрению которого мы и переходим.
93.3. АНАЛИЗАТОР ПАДЕЖЕЙ
Чтобы понять падежную грамматику, рассмотрим не-
которые типичные предложения (простые предложения-
действия с глаголами в активном залоге):
Не hit the ball (Он выбил мяч)
The big man hit the ball (Большой мужчина выбил мяч)
John hit the ball with the bat (Джон выбил мяч клюшкой)
A boy hit the ball through the window during the game
(Какой-то мальчик выбил мяч через окно во время игры)
Мы можем легко написать грамматику, которая описы-
вала бы значение этих предложений с точки зрения тема-
тического анализа. Помните, что грамматика является
просто набором правил, определяющих сложные единицы
по отношению к более простым. Скажем, “hit” - пример
глагола! (третьего лица, единственного числа, прошед-
шего времени в активном залоге). Вот какую грамматику
мы получим:
предложение “♦агенс, глагол 1, объект
предложение *♦ агенс, глагол 1, объект, инструмент
предложение *♦ агенс, глагол!, объект, траектория, время
8—751
225
Все возможные формы с глаголом! должны быть за-
фиксированы в грамматических правилах. Продолжим
записывать грамматические определения:
агенс местоимение
агенс собственное-существител ьное
агенс именное-словосочетание
объект местоимение
объект собственное -существительное
объект именное-словосочетание
инструмент with (с) .именное-словосочетение
траектория through (через), именное-словосочетание
время during (во время), именное-словосочетание
время before (перед), именное-словосочетание
время after (после), именное-словосочетание
местоимение he (он) и т.п.
именное-словосочетание определитель, существительное
именное-словосочетание прилагательное,существительное
прилагательное big (большой)
определитель а (этот)
глагол! “*hit (выбил) >
глагол! _>made (сделал) и т.п.
Это та разновидность грамматики, которая “выраста-
ет” из данного типа анализа предложений. Большинство
объектов, находящихся на одном уровне с предложением,
представляют собой “падежные ячейки”, подлежащие за-
полнению именными словосочетаниями.
Для получения семантических вариаций способов по-
строения простых предложений необходимо иметь не-
сколько сотен структурных правил. Они должны быть
собраны и сопоставлены для нахождения оптимального
варианта. Обычно это происходит, когда невозможно оп-
ределить вид глагола на основании глагольной формы:
Вид Пример
1 лицо ед.числа I hit
2 лицо ед.числа You hit
3 лицо ед.числа Не hit
1 лицо мн.числа We hit
Проблема решается проведением более тщательного
анализа агенса в каждом случае. Вид глагола будет соот-
ветствовать виду агенса.
Механизм встраивания этого типа грамматики в Про-
226
лог не труден: он основан на дальнейшем развитии метода
анализа по парам различий.
Например, все правила для предложений, рассмотрен-
ных в данном разделе, могут быть преобразованы в про-
грамму следующим образом:
sentence(S,SO) if agent(S,Sl), backparta(Sl,SO).
backparta(S,SO) if verb (S,SI), object (SI,SO).
sentence(S,SO) if agent(S,Sl), backpartb(Sl,SO).
backparta(Sl.SO) if verb(S,Sl), backpartc(Sl.SO).
backparta(Sl.SO) if object(S,S1), instrument (SI, SO).
sentence(S,SO) if agent(S,S1), backpartd(Sl,SO).
backparta(Sl,SO) if verb(S,Sl), backparte(Sl,SO).
backparta(Sl,SO) if object(S,S1), backpartf(SI,S0).
backparta(Sl,SO) if trajectory (S,S1), time (SI,SO).
Правила низкого уровня могут быть получены анало-
гично.
Правила анализа по парам различий, ассоциированные
с тематическим анализом, - в меру сложный, но не запу-
танный пример. Эти правила включают огромное количе-
ство деталей, которые, однако, ясны и упорядочены.
9.4. ЗАКЛЮЧЕНИЕ
Некоторые аспекты различий в методах использования
естественных языков и ЭС здесь не обсуждались. Падеж-
ный грамматический анализатор и правило, базирующее-
ся на методике сети вывода, на операционном уровне,
имеют мало общего. Однако, по мнению автора, к области
экспертных систем можно отнести все методики, которые
могут быть полезны для повышения уровня дружествен-
ности и интеллектуальности программ.
Кроме того, для ЭС чрезвычайно важно уметь вести
диалог на естественном языке. Именно на это должны
быть ориентированы будущие исследования. Если сюда
добавить еще и возможность распознавания речи, то ма-
шины действительно станут нашими помощниками - мы
сможем с ними разговаривать.
Когда компьютеры такого типа достигнут уровня, при
котором они смогут самостоятельно усваивать новые зна-
ния, используя современные обучающие машины, то на-
чнется эра по-настоящему интеллектуальных машин (не
имеющих сознания, но обладающих интеллектом). В ма-
шинных сетях будет возможно решать проблемы, не до-
ступные одному компьютеру, и тогда речь пойдет уже о
глобальном интеллекте.
227
С другой стороны, в наше время наблюдается опасная
тенденция - действия людей все более и более становятся
похожими на поведение машин. Однако если мы начнем
создавать интеллектуальные машины, то, может быть,
этот процесс прекратится и люди станут более человеч-
ными.
Упражнения
1. Проанализируйте следующие предложения по группам подлежащего,
сказуемого, предлога и т.д.:
Lighting struck the tallest tree in my backyard during the night.
The new roof leaked rain all over the floor.
The mother cat brought prey into the house for the kitten.
2. Представьте себе простую систему анализа предложений, которая мо-
жет проверить грамматическую корректность следующего предложе-
ния:
John makes good coffee for his friends.
Напишите необходимые правила на Прологе так, чтобы это предложе-
ние было признано правильным, поскольку оно имеет приемлемую
внутреннюю структуру, т.е. следующий предикат должен быть успешно
выполнен, если его подать на вход системы:
sentence ([John,makes,good,coffee,for,his,friends]).
Основные факты могут выглядеть так;
noun ([coffee]).
verb ([makes).
adj ([good]).
Вы можете усовершенствовать стандартное определение группы сущест-
вительного таким образом, чтобы включить в него и притяжательные
местоимения. В конструируемых правилах можно использовать преди-
кат append.
3. Перепишите анализатор из упражнения 2 так, чтобы для требуемого
структурного анализа и проверок использовать механизм анализа по
парам различий.
4. Перепишите анализатор из упражнения 2 так, чтобы в дополнение к
вышеприведенному предложению он признал корректным и следую-
щее предложение:
The men make concrete at the building site.
Для этого требуется добавить к грамматике средства согласования по
числу для субъекта и объекта. Покажите, что анализатор не распознает,
корректно или некорректно следующее предложение:
The men makes concrete at the building site.
228
В данном упражнении нет необходимости использовать механизм ана-
лиза по парам различий.
5. Проведите падежный анализ для каждого предложения из упражне-
ния 1.
6. Покажите, на что может быть похожа промежуточная форма в гипо-
тетической системе автоматического перевода с английского на ис-
панский для следующего предложения:
Jane and Ben took the letter down to the post office in the car.
Приложение А
ОБОЛОЧКА IMP: СРЕДА РАЗРАБОТЧИКА
ЭКСПЕРТНЫХ СИСТЕМ
Напомним основные свойства оболочки IMP, которая рассматрива-
лась в гл. 5,6 и 7.
Оболочка использует обратную цепочку рассуждений.
Рассуждения нечеткие, как в EMYCIN.
По требованию пользователя даются объяснения КАК и ПОЧЕМУ.
Используют средства разработки Турбо Пролога.
Описывающие строки являются объектами рассуждения.
В вывод может быть вовлечено произвольное число правил.
В посылках правил допускается использование реляционных выра-
жений. Переменные таких выражений могут быть, в свою очередь,
заданы в отдельных операторах объявления.
Правило может быть сформулировано как обратимое или необрати-
мое в зависимости от способа его использования.
Оболочка такого типа предусматривает адекватную архитектуру для
создания удовлетворительных экспертных систем в проблемных об-
ластях, связанных с классификацией и диагностикой неисправнос-
тей, и других, где возникает необходимость выбора среди множества
альтернатив. Однако она не подходит для приложений, требующих
четко определенной последовательности шагов со сложной страте-
гией рассуждения на каждом шаге, например для подбора конфигу-
рации сложного оборудования или оценки стоимости проекта.
Соответствующие программы могут быть реализованы в оболочке,
использующей прямое связывание.
Ниже приведена программа оболочки IMF.
code-3500
nowamings
/♦ — copyright Dan Marcettts, 1
/* Детальная информация по программе находится в файле помощи.
После компиляции программы, она запускается автоматически, если
используется опция главного меню системы Турбо Пролога Run. При
выполнении программа пытается удовлетворить внутреннюю цель с
названием
shefl_driver.
Оболочка IMP *♦****♦♦♦***♦♦****♦♦***♦/
THE IMP SHELL
EXPERT SYSTEM DEVELOPMENT ENVIRONMENT
VERSION 1.0
230
domains
file - descriptor
infrec - imp (string,string,string,string,string,string,string,real)
reallist - real*
database
adjustflag
con vstack (string) /* Используется в модуле reinevil. */
danswer (string,real)
dbimp(string,string,string,string,string,string,string,real)
define (symbol,string) /* Используется в модуле relnevll. */
evidence (string,real)
hy pothesis.node (string)
imp(string,string,string,string,string,string,string,real)
infer_summary (infrec,real)
stackvalue (real) /* Используется в модуле relnevll. */
tdbimp (string, string, string, string, string, string, string, real)
terminalnode (string)
varvalue(symbol,real) /* Используется в модуле relnevll. ♦/
predicates
absvalue (real,real)
adjuststack
allinfer (string, real)
and _go_on
answer(string,real)
append (reallist,reallist,reallist)
cleanerx
deanery
cleanerz
cleanitl
cleanit!
cleanit3
cleanit4
cleanitf
cleanit6
cleanit7
cleanit9
cleanitl 0
cleanitl 1
cleanitl!
cleanitl 3
cleanitl 4
clearall
combine (reallist,real)
cond_multiplier (string, real)
defs_go_pn
display_one_answer
displayall
edit_rs
exsys_driver
find_multiplier (string, real .string, real)
form_go_on
formdescriber (string, real)
get_na me (string)
getallans
?31
getmodel (string,string)
getmodel (string,string)
gettypel (string,string)
gettypel (string,string)
getsense (string,string)
how_explain (string)
how_describer (string)
infer(string,real)
more_defs
make_rules
makejmps
make_defs
make_terms
make_hypos
makesimples
make_ands
make_ors
make_forms
max (real,real,real)
min (real,real,real)
or_go_on
pauser
prepare_answer
purgeit
putadjustflag
process (integer)
pick_exsys (string)
qualifier (string, real, real)
reloadit
replyto_input (string,string,real)
repeat
record Jt (char «string,string)
seerules
seeimps
seedefs
seehypos
seeterms
showresults
shell-driver
simple-go_on
supercombine (reallist,real)
why_describer (string, string, string, string, string, string, string, real)
/* Модуль для построения меню фирмы Борланд.
♦/ include “menu.pro"
/* Оценщик реляционных выражений, приведенных в приложении Б */
include “relnevll. pro”
clauses
/*
/*
/*
/*
Код основного механизма всей системы.
•/
V
•/
•/
/«♦a***************************************************************/
232
shell-driver if
makewindow(1,112,7,"IMP — Оболочка для построения ЭС “,
0,0,25,80),
repeat,shiftwindow (1),dearwindow,
menu (6,15,
** Справочная информация**,
“Ввод правил новой экспертной системы",
“Проверка загруженного множества правил",
“Сохранение загруженного множества правил",
“Загрузка одного из наборов правил",
“Прогон загруженной экспертной системы",
“Редактирование одного из наборов правил",
“Печать одного из наборов правил",
“Выход в DOS",
“Окончание работы с программой.".CHOICE),
process (CHOICE),CHOICE-10,1.
/* Определение меню верхнего уровня. ♦/
process(l) if file_str("impshell.hlp",ZZ).display(ZZ),!.
process (2) if clearall,make_rules,!.
process(3) if seerules,!.
process (4) if get_name (Rulefile),save (Rulefile),!.
process (5) if clearall,pick_exsys (Rulefile) .consult (Rulefile),!.
process(6) If cleanerx,cleanerz,exsys_driver,!.
process (7) If clearall,editors,!.
process(8) if pickexsys(Rulefile) ,concat("copy “,Rulefile,Z),
concat(Z," pro:",ZZ),system (ZZ),!.
process (9) if system(""),!.
process(10) if!.
/**********ф********************************ф*«*************ф*******/
/* Заметим, что процессы 1,4,5,8,9 и 10, за исключением нескольких
вспомогательных предикатов, полностью определены в программе
выше. Процессы с более детальным описанием приведены ниже */
/* */
/* Процесс из меню под номером 2 */
/* Сбор исходного множества правил. ♦/
/* в разделе запрашиваются вопросы о возможных правилах и оценках в
соответствующем для правил формате. */
make_rules if clearwindow,make_imps,make_defs,
make_terms,make_hypos,
clearwindow,nl,nl,
write(" Для того чтобы сделать правила постоянными,"),
write ("сохраните их в файле (см. главное меню).") ,nl,nl,
write(" Правила могут быть изменены после сохранения,") ,nl,
writeC используя функцию редактирования (см. главное ме-
ню)."),
nl.pauser.
make_terms if clearwindow.nl,
233
writer ЗАДАНИЕ КОНЦЕВЫХ УЗЛОВ ДЛЯ ЭТОГО НАБО-
РА ПРАВИЛ.”),
repeat,nl,nl,
writeC Введите текст для определения концевого узла: “),
nl, write (" “), read In (X) .assert (terminal_node (X)) ,more_defs,!.
make_hypos if clearwindow,nl,
writeC ЗАДАНИЕ ГИПОТЕТИЧЕСКИХ УЗЛОВ ДЛЯ НАБОРА
ПРАВИЛ.”),
repeat, nl,nl,
write (” Введите строку для определения гипотетического уз-
ла:*),
nl,write (" “) ,readln (X),assert(hypothesis_node(X)) ,more_defs,’..
makejmps if make_simples,make_ands, make_ors, make_forms.
make_simples if clearwindow,simple_go_on,
repeat,clearwindow,nl,
write Г ЗАДАНИЕ ПРОСТОГО ПРАВИЛА-ИМПЛИКАЦИИ
u),nl,nl,
write (” Что может быть выведено из этой импликации?") ,nl,
writer “),readln (Z),nl,
writer Что утверждается в посылке (положительная форма)
?")
nl,writer “),readln (X),nl,
write (" Должно ли условие отрицаться NOT (введите д/н) ? “),
writer “),readln (XX) ,getsense(XX,Xsign),nl,
writer Правило обратимо или нет (введите р/н)? “),
writer “),readln (Rl),nl,
writer Каков коэффициент определенности? “),
readreal(C),
assert (imp (s,Rl ,Z,Xsign, X, dummy, dummy, C)) ,more_defs,!.
make_simples if!.
make_ands if clearwindow,and_go_on,
repeat,clearwindow,nl,
writer ЗАДАНИЕ ПРАВИЛА-ИМПЛИКАЦИИ C AND") ,nl jil,
write Г Что может быть выведено йз этой импликации?"),
nl, write Г “),readln (Z),nl,
write (" Что утверждается в первом условии посылки? “) ,nl,
writer “),readln(X),nl,
write(" Должно ли условие отрицаться NOT (введите д/н)? “),
writer “),readln(XX),getsense(XX,Xsign),nl,
write(" Что утверждается во втором условии посылки? “) ,nl,
writer “),readln(Y),nl,
write(" Должно ли условие отрицаться NOT (введите д/н) ? “),
write(" “),readln (YY) ,getsense(YY,Ysign) ,nl,
write(" Правило обратимо или нет (введите р/н)? *),
writer “),readln(Rl),nl,
write (" Каков коэффициент определенности? “),
readreal(C),
assert (imp (a,R 1 ,Z,Xsign,X,Ysign,Y,C)) ,more_defs,!.
make_ands if!.
make_ors if clearwindow,or_go_on,
repeat,clearwindow,nl,
writer ЗАДАНИЕ ПРАВИЛА-ИМПЛИКАЦИИ C OR “) ,nl,nl,
write (" Что может быть выведено из этой импликации?"),
nl,write(" “),readln(Z),nl,
234"
writer Что утверждается в первом условии посылки? “) ,nl,
writeC “),readin (X),nl,
writeC Должно ли условие отрицаться NOT (введите д/н)? “),
write (" “) ,readln (XX) ,getsense (XX.Xsign), nl,
writer Что утверждается во втором условии посылки? “) ,nl,
writer “),readin (Y),nl,
write Г Должно ли условие отрицаться NOT (введите д/н) ? “),
write Г “),readin (YY) ,getsense(YY,Ysign) ,nl,
writer Правило обратимо или нет (введите р/н) ? “),
writer “),readln(Rl),nl,
write Г Каков коэффициент определенности? “),
readreal(C),
assert (Imp (o,R 1 ,Z,Xsign ,X, Ysign, Y,C)) ,more_defs,!.
make.ors if!.
make_forms if clearwindow,fona_go_on,
re peat,dearwindow.nl,
writer ЗАДАНИЕ ПРАВИЛА В ВВДЕ РЕЛЯЦИОННОГО ВЫРА-
ЖЕНИЯ") ,я1,п1,
write (" Что может быть выведено из этой импликации?"),
nl,write(" M),readln(Z),nl,
write(" Формулировать реляционное выражение"),
write(" используемое в посылке? м),п1,
writer “),readin (X),nl,
writer Должно ли выражение отрицаться NOT (введигед/н)? “),
write (" м),readin (XX) ,getsense(XX,Xsign) ,nl,
write(" Правило обратимо или нет (введите р/н)? “),
writer u),readin (Rl),nl,
write(" Каков коэффициент определенности? “),
readreal(Ct),
assert (imp (f,Rl ,Z,Xsign,X,dummy,dummy,Ct)) .moredefs,!.
aakejbnnsif!.
mke_defetfctearwtodow,defe_jo_oa,
repea t,clearwindow,nl,
writeT ФОРМУТШРОВКА ОПРЕДЕЛЕНИЯ ОБЩЕЙ ЦЕЛИ."),
а1,|й,writer Каково имя определяемой переменной? “),
d,write Г •),readln(Z),ni,
write(" Каковы выражения, определяющие переменную? “),
nl,write(" “),readin(ZZ),nl,
assert (define (Z,ZZ)) ,more_defs,!.
make.defs if!.
simple_jo_oo if nl,writer СБОР ПРАВИЛ"),Ы,н1,
writer Нужны ли простые правила-импликации?"),
write ("напечатайте д/н *) ,readchar(T) ,Т-*у*,1.
and_go_on if nl,writer СБОР ПРАВИЛ"),nl.nl,
write(" Нужны ли правила-импликации AND?"),
write ("напечатайте д/н “) .readchar (Т) ,Т-*у*,!.
oruo.on if nl,write (" СБОР ПРАВИЛ"),nl.nl,
write С Нужны ли правила-импликации OR?"),
write ("напечатайте д/н *) .readchar (Т) ,Т-*у’,!.
235
form_go_on if nl,writeC СБОР ПРАВИЛ") ,nl,nl,
writeC Нужны ли правила в воде реляционных выражений?"),
write ("напечатайте д/н “),readchar(T),T-*y’,!.
defs_go_on if nl,writer СБОР ОПРЕДЕЛЕНИЙ"),nl.nl,
writer Хотите ли вы задать формулы?"),
write ("напечатайте д/н *),readchar (Т),Т-*у*,!.
more_defs if
nl,write(" •♦****♦**♦** Еще элементы этого типа? “),
write Г напечатайте д/н “), readchar (Т),Т-’п*,!.
/* Используются при формулировке отрицания посылок. */
gelsense ("д","neg").
gelsense ("н", "рое")
/*************************Ф*******************««****««*************у
/• •/
/* Процесс из меню под номером 3 */
/* Проверка правил ♦/
•/ •/
/• •/
/********$********************«*******«****************************/
seerules if clearwindow,not (seelmps) .not(seedefs),
not(seeterms) .not(seehypos) ,nl,pauser.
seelmps if imp(A,B,C,D,Dl,E,F,Fl),
write("lmp(",A,",",B,",",C,",",D,",",Dl,",",E,",",F,",",Fl,")"),
ni.fail.
seedefs if define(X,Y),write ("define (",X,",",Y,")"),nl,fall.
seeterms if terminal_node(X), wri te("terminal_node(",Xr).”>,nl,fail.
seehypos if hypothesis_node(X) .write("hypothesis node(",X,")."), ,
nl.fail.
/ф«**********************«*********фф«*«***ф****«****ф*ф*******«***У
/• •/
/* Процесс из меню под номером 6 */
/* Прогон существующей экспертной системы. ♦/
/• ♦/
/• •/
/*«******«******************ф**************«******ф***********ф****/
/• Это ведущее правило для операций вывода. */
exsys_driver if
makewindow(10,7,7,"nPOrOH ЭКСПЕРТНОЙ СИСТЕ-
МЫ,2Д19,65),
getallans,
makewindow(l 1,7,7,"ИТОГОВЫЕ РЕЗУЛЬТАТЫ,4,9,19,65),
236
showresults,!.
getallans if not(prepare_answer).
showresults if not(displayall).
prepare_answer if answer (X,Y) Jail.
answer (X,Y) if hypothesis_node (X),allinfer(X,Y),
assert (danswer (X,Y)).
displayall if display_one_answer,fail.
display_one_answer if danswer (X, Y),clearwindow,
write ("Для этой гипотезы: “),nl,write (" “,X),nl,
write ("Коэффициент определенности равен: “,Y),nl,nl,
not(how_describer (X)).
/* Конец, ведущее правило для всех операций вывода. */
/♦ Правила вывода и механизмы, используемые при прогоне системы */
/• Простые правила-импликации. */
infer(Nodel ,Ct) if imp(s,Use,Nodel ,Sign,Node2,_,_,Cl),
asserta (dbimp(s,Use,Nodel,Sign,Node2,dummy,dummy,Cl)),
asserta (tdbimp(s,Use,Nodel ,Sign,Node2,dummy,dummy,Cl)),
allinfer(Node2,C2) .qualifier (Use, C2,Q mult),
find_multiplier (Sign, Mult, dummy ,0) ,Ct • Mult*Cl *C2*Qmult,
assertz (infer_summary (
imp(s,Use,Nodel,Sign,Node2,dummy,dummy,Cl) ,Ct)),
retract (dbimp (s, Use, Nodel, Sign, Node2, dummy, dummy, CD),
retract (tdbimp (s,Use,Nodel, Sign, Node2, dummy, dummy, Cl)).
/* Вывод с импликацией типа AND. ♦/
infer (Nodel ,Ct) if imp (a,Use,Nodel,SignL,Node2,SignR,Node3,Cl),
asserta (dbimp (a,Use,Nodel,SignL,Node2,SignR,Node3,Cl)),
asserta (tdbimp (a,Use,Nodel,SignL,Node2,SignR,Node3,Cl)),
allinfer(Node2,C2),allinfer (Node3,C3),
find.multiplier (SignL, MultL, SignR, MultR),
C2S - MultL*C2,C3S - MultR*C3,min(C2S,C3S,CE),
qualifier (Use,CE.Qmult) ,Ct - CE*C1 *Qmult,
assertz (infer.summary (
imp (a,Use,Nodel, SignL, Node2, SignR, Node3, Cl) ,Ct)),
retract (dbimp (a, Use, Nodel, SignL, Node2, SignR, Node3, CD),
retract(tdbimp(a,Use,Nodel,SignL,Node2,SignR,Node3,CD).
/* Вывод, включающий импликацию типа OR. */
infer(Nodel,Ct) if imp(o,Use,Nodel,SignL,Node2,SignR,Node3,CD,
asserta (dbimp (o, Use, Nodel, SignL, Node2, SignR, Node3, CD),
asserta (tdbimp (o, Use, Nodel, SignL, Node2, SignR, Node3, CD),
allinfer(Node2,C2), allinfer (Node3,C3),
find_multiplier(SignL,MultL,SignR,MultR),
C2S - MultL*C2,C3S - MultR*C3,max(C2S,C3S,CE),
qualifier (Use,CE,Qmult) ,Ct - CE*C1 *Qmult,
assertz (inferjsummary (
imp (o,Use,Nodel,SignL,Node2,SignR,Node3,Cl) ,Ct)),
retract (dbimp (o, Use, Nodel, SignL, Node2, SignR, Node3, CD),
re tract (tdbimp (o, Use, Nodel, SignL, Node2, SignR, Node3, CD).
237
/♦♦ Процесс вывода для реляционных выражений (формулы). */
infer (Node 1,Ct) if imp (f,Use,Node 1 ,Csign,Cond, dummy, dummy, C),
asserta (dbimp (f,Use,Node 1 ,Csign,Cond, dummy, dummy, C)),
asserta (tdbimp(f, Use, Nodel ,Csign,Cond, dummy, dummy, O),
clearwindow,
write (Требуется задавать вопросы для оценки формулы."),
nl,nl^leanerz,expr eval(Cond,TF),cond multiplier (Csign.Cmuh),
ХХХ-ТР*СтиИ,^иаППег(и8е,XXX,Qmult),Ct-XXX^C’Qmult,
assertz (infer_summary (
imp (f,Use,Nodel, Csign.Cond, dummy .dummy ,C) ,Ct)),
form_desc fiber (Nodel ,Ct),
re tract (dbimp (f, Use, Node l,Csign,Cond, dummy, dummy, C)),
retract (tdbimp(f, Use, Nodel, Csign,Cond, dummy, dummy, O).
/♦* Процесс вывода для концевых узлов. */
infer(Nodel,Ct) if terminal_node(Nodel),evidence(Nodel,Ct),!.
inf er (Nodel, Ct) if termlnal_node(Nodel), repeat, nl, clearwindow,
write ("Для этого условия:") ,nl,nl,writeC M,Nodel),nl,nl,
write("Введите д(да), н(нет) илип(почему),"),nl,
write С или задайте коэффициент определенности (-1.0 to 1.0)."),nl,
nl,readin (Reply) ,reply_tojnput (Nodel,Reply,Ct),!.
/* Используется для проверки обратимости правил. */
qualifier (Use,С,Qmult) if Use-"p",Qmult-l,!.
qualifier (Use,C,Qmult) if Use-"H",C - 0,Qmult-l,!.
qualifier(Use,C,Qmult) if Use-"H",C 0,Qmult-0,!.
/* Используется для отрицания посылок правил, когда посылка является
реляционным выражением (т.е. формулой.) ♦/
cond_multiplier( pos,l).
cond_multiplier( neg,-l).
/♦ Служит для изменения знака, что необходимо при отрицании. */
/♦ Это используется для простой импликации. •/
find_multiplier (pos, 1,dummy,0).
find_multiplier (neg,-1 «dummy ,0).
/* Это используется для AND и OR */
find_multiplier(pos, l,pos, 1).
find_multiplier(pos, l,neg,-l).
find_multiplier(neg,-l,pos, 1).
find_multiplier(neg,-l,neg,-l).
/* Собирает результаты всех приложимых правил в узле. */
allinfer (Node,Ct) if findall (Cl ,infer(Node,Cl) .Ctlist),
supercombine (Ctlist, Ct).
/* Реализует изменение для двух правил во время комбинирования. */
supercombine [Ct, Ct) if!.
supercombine [Cl,С2,Ct) if combine [Cl ,C2,Ct),!.
supercombine [Cl ,C21 T,Ct) if combine [Cl ,C2,C3),
append [C3,T,TL),supercombine (TL,Ct),!.
238
/* Этот предикат объединяет свидетельства из двух правил, когда каж-
дое из них применяется к одному заключению. Первый аргумент — спи-
сок коэффициентов определенности.
Second is what they all resolve too. */
combine [-1,1,0.0).
combine [1,-1,0.0).
combine [Cl,C2,Ct) if Cl -0, C2-0,
Cte Cl C2 — Cl *C2
combine [Cl ,C2,Ct) if Cl 0, C2 0,
Ct-Cl C2 C1*C2
combine [Cl ,C2,Ct) if Cl 0, C2-0,
absvalue(Cl ,Z1), absvalue(C2,Z2) ,min (Z1 ,Z2,Z3),
Ct-(Cl C2)/(1.0 — Z3).
combine [Cl ,C2,Ct) if C2 0, Cl -0,
absvalue (Cl ,Z1), absvalue (C2,Z2) ,min (Z1 ,Z2,Z3),
Ct-(Cl C2)/(1.0 —Z3).
/** Управление вводом концевых узлов и вопросами почему. */
/* Заметим, что все данные системы задаются в концевых узлах. Можно
вводить коэффициенты определенности, да, нет или почему. */
reply_to_input(Node,Reply,Ct) if not(isname(Reply)),
adjusts tack,str_real (Reply, Ct),asserta (evidence (Node,Ct)),!.
reply_to_input(Node,Reply,Ct) if isname(Reply),Reply - “y",
adjuststack, Ct-1.0,asserta (evidence (Node,Ct)),!.
reply_to_input(Node,Reply,Ct) if isname(Reply),Reply - “n",
adjuststack, Ct--1.0,asserta (evidence (Node, Ct)),!.
replyjojnput(_,Reply,_) if isname(Reply),Reply - “w",nl,
dbimp(U,V,R,S,Sl,X,Y,Yl),
why_describer(U, V,R,S,S1 ,X,Y,Y1),
retract(dbimp(U,V,R,S,Sl,X,Y,YD),
putadjustflag,
pa user,!, fail.
reply_to_input(_,Reply,J if
Isname(Reply),Reply - “c”,adjuststack,!.
/♦*** Управляет специальными объяснениями почему для вывода, вклю-
чающего в посылку реляционное выражение. ****•/
form_describer(Node,Ct) if
repeat,nl,nl,
write ("Для просмотра причины этих вопросов, "),
write Сили такой обработки/),
nl .write ("введите п (почему). Иначе напечатайте д (дальше)."),
nl,readin (Reply) ,reply_to_input(Node,Reply,Ct),!.
7* Ответы на вопросы почему для правил типа И/ИЛИ */
why_describer(U,Ul,V,R,S,X,Y,Z) if clearwindow,nl,
U “s",U uf",gettype2(U,UU),
write ("Пытаюсь использовать правило вывода") ,nl,
write (UU),write (" введите для поддержки заключения: “) ,nl,
writeC “,V),nl,write("nocbuiKa 1: tf,S),nl,getmodel(R,RR),
write (" Эта посылка используется",RR) ,nl,
239
write ("Посылка 2: “,Y),nl,getmodel(X,XX),
writer Эта посылка используется “,XX),nl,
write ("Коэффициент определенности импликации равен: “,Z),nl,!.
/* Ответы на вопрсы ПОЧЕМУ для простой импликации. */
why_describer("s",Vl,V,R,S,X,Y,Z) if clearwin dow,nl,
write ("Пытаюсь использовать правило вывода"),nl,
write ("простого типа, для поддержки заключения: м),п1,
writeC “,V),nl,write("nocbuiKa 1: “,S),nl,getmodel (R,RR)»
write(" Эта посылка используется M,RR),nl,
write ("Коэффициент определенности импликации равен: “,Z),nl,!.
/* Ответы на вопрсы ПОЧЕМУ для правил с реляционным выражени-
ем. •/
why_describer("f",Vl,V,R,S,X,Y,Z) if clearwindow,nl,
write ("Пытаюсь использовать правило вывода “),
nl,write ("с реляционным выражением, “),
write ("для поддержки заключения: м),п1,
writer M,V),nl, write ("Посылка 1: M,S),nl, getmodel (R,RR),
write(" Эта посылка используется M,RR) ,nl,
write ("Коэффициент определенности импликации равен: “ Л) ,nl,!.
/* Used to expand terse rule format for user friendlyness. */
gettypel ("а"," импликация типа И").
ge tty pel ("о"," импликация типа ИЛИ"),
gettypel ("s"," простая импликация"),
gettypel ("Г," импликация с реляционным выражением").
gettypel ("a","AND").
gettypel ("о","OR").
getmodel ("pos","как вы его видите."),
getmodel ("neg","с отрицанием.").
getmodel("pos"," “).
getmodel ("neg"," NOT “).
getmodel("dummy"," “).
/* Востанавливает стек в состояние перед вопросом ПОЧЕМУ. */
adjuststack if adjustflag,retract (adjustflag) ,purgeit, reloadit,!.
adjuststack.
purgeit if retract(dbimp(_,fall,
purgeit.
reloadit if tdbimp (X,Y,Z,R,R1,S,V, VI),
assertz(dbimp(X,Y,Z,R,Rl,S,V,Vl)),fail.
reloadit.
/* Makes sure just one flag is on stack after it's called. */
/♦ Flag is used to show when why stack needs restoration. */
putadjustflag If not (adjustflag),asserta (adjustflag).
putadjustflag.
240
/•Конец управления процессом опроса по концевым узлам и ПОЧЕ-
МУ ♦/
/• Управление объяснением КАК. ♦/
how_describer(Node) if hypothesis_node (Node), repeat, nl,
write ("Введ ите к (как) получено заключение или д (дальше)."),
nl,readin (Reply) ,nl,how_explain (Reply) J.
how_explain(X) if X - “д".
/• Используется для всех выведенных заключений. •/
how explain (Reply) if
fronttoken (Reply,_,XI),fronttoken (XI,X2,Y),concat(X2,Y,X),
infer_summary (imp (_,_, X, ,_) .clearwindow,!,
write ("Правила, поддерживающие это заключение: “),nl.nl,
infer_summary (imp(A,Al .X.R.S.C.D.E) ,F),
write ("Выведено: “,X),nl,gettypel(A,Z),write(" H3",Z),nl,
getmode2(R,RR), write (" посылкой 1 6buio:",RR,"(",S,")"),nl,
getmode2(C,CC).write(" посылкой 2 было:",СС,"(",В,")"),п1,
write ("К. о. при использовании только этого правила: M,F),
nl.nl,fail.
/• Объяснение концевых фактов. ♦/
how_explain (Reply) if
fronttoken (Reply,_,XI),fronttoken (XI ,X2,Y) ,concat(X2,Y,X),
terminal_node(X) .evidence (X.C),
write ("Вы сказали, что: “),nl,write(" “,X),nl,
write ("с коэффициентом определенности: M,C),nl,fail.
/******* Конец правил вывода и секции механизма •**♦***/
/•♦I****************»**********************************************/
/• */
/• Процесс из меню под номером 7 •/
/• Редактирование существующего набора правил ♦/
/• ♦/
/••••••••«••••«•••«••••••••••••••••••••••••••••••••••••••••••««««««у
editors if
pick_exsys (Filename) ,file_str (Filename, Inputstring),
edit (Inputstring, Outputstring),clearwindow,
write ("Сохранить набор правил? (введите д/н) “),
readchar(Ans) .record _it(Ans.Outputstring, Filename).
recordJtCд’,Data,Filename) if
openwrite (descriptor,Filename), writedevice (descriptor),
write (Data) .closefile (descriptor) ,clearall,consult (Filename).
record _i t(’H’,_,_).
/***********♦♦♦**♦***♦♦♦***♦*******♦******♦***************♦*****♦♦♦/
/•••••••♦•••••♦•♦♦♦♦•♦♦••♦•♦♦♦♦a***********************************/
/• */
/* Различные вспомогательные предикаты ♦/
/• */
/• */
/***♦*♦♦♦♦♦*****♦♦♦*♦♦»*•*$*♦♦♦♦♦♦♦*♦♦****♦♦♦♦*****♦**♦♦♦♦♦♦♦♦♦♦♦♦♦/
241
/♦ Предикаты низкого уровня, используемые в многих местах систе-
мы. ***/
get_name(Name) If такеш1пбош(10,7,7,"ЗАДАЙТЕ ИМЯ ФАЙ-
ЛА", 10,10,10,60),
nl,write ("Введите имя файла для этого набора правил."),
nl,write ("Не используйте расширение."),
nl,readln (Z) ,concat(Z,".rul", Name), removewindow, !.
pauser if nl,nl,
write(" Для продолжения нажмите любую клави-
шу."),readchar (Т).
pick.exsys (Rules) if
makewindow (10,7,7,"ВЫБЕРИТЕ НАБОР ПРАВИЛ",10,10,10,60),
dir("//","*.rul", Rules), removewindow.
/* Предикаты иницилизации и реинициализации. */
/* Used to clean up results of one run with a given rule set. */
cleanerx if not(cleanitl),not(cleanit2),not(cleanit3),
not (cleanit4), not (cleanitf), not (cleanitl 0), not (cleanitl 3).
cleanitl if retract (evidence (_,_)),fail,
cleanitl if retract(dbimp (_,Jail.
cleanit3 if retract(tdbimpJ) Jail.
cleanlt4 if retract (inf er_summary (_,_)), fail.
cleanit5 if retract (adjustflag) Jail.
cleanitlO If re tract (danswer (_,_)) Jail,
cleanitl3 if retract(varvalue(_,_)),fall.
/♦ Используется для полного изменения набора правил. */
deanery if not (clean! t6),not (cleanit7),
not(cleanit9) ,not(cleanitl 4).
cleanit6 if retract (imp Jail.
cleanit7 If retract(terminal_node(_)) Jail.
cleanit9 if retract (hypothesis_node(_)) Jail,
cleanitl 4 if retract (define (_,_)) Jail.
/* Используется для очистки после работы обработчика выражений. */
cleanerz if not(cleanit 11),not(cleanitl2).
cleanitl 1 if retract(convstack(_)),fail.
cleanitl! if retract (stackvalue (_)),fail.
/* Используется для реинициализации — очищает все. */
clearall if cleanerx,deanery,cleanerz.
/♦♦** Конец, предикаты низкого уровня. ♦•**•♦***/
/* Предикаты общего вида, как правило, в библиотечном модуле. * /
/* Стандартные предикаты mln and max. */
max(Cl,C2,C2) if C2-C1,!.
max (Cl,C2,Cl) if C2 Cl,!.
min(Cl,C2,C2) ifC2<-Cl,!.
min(Cl,C2,Cl) if C2 Cl,!.
242
/* Новый преддикат для абсолютного значения выражения. */
absvalue(X.Y) if X-O.Y-O,!.
absvalue(X.Y) ИХ O.Y-X,!.
absvalue(X,Y) if X 0, Y - -X,!.
repeat.
repeat if repeat.
append [, List, List).
append [XI LI ,List2,X IL3) if append (LI ,List2,L3).
goal
shel!_driver.
Приложение Б
ИНТЕРПРЕТАТОР ДЛЯ ОЦЕНИВАНИЯ
АЛГЕБРАИЧЕСКИХ И РЕЛЯЦИОННЫХ
ВЫРАЖЕНИЙ
Приведенная ниже программа в этом разделе является интерпретато-
ром в том же смысле, что и поставляемая вместе с персональным компь-
ютером версия Бейсика, с более ограниченными целями. Ее основная
функция заключается в оценке реляционных выражений произвольной
формы. Она возвращает 1, если выражение истинно, и -1 - если ложно.
Предполагается, что интерпретатор может быть включен в программу
высокого уровня, которая нуждается в средствах подобного типа.
Ведущий предикат expr_eval может быть использован так:
expreval(реляционное выражение в кавычках, Ответ).
Пример:
expr_evalH (а + b) /2 > - 5 * с", Ответ).
Интерпретатор может запрашивать у пользователя значения пере-
менных в реляционном выражении и затем сохранять их для дальней-
шего использования при других оцениваниях в программе.
Для выполнения части своей работы программа вставляет предикат
низкого уровня infix_eval. Он может быть использован для оценки произ-
вольного алгебраического выражения и самостоятельно:
infixeval (алгебраическое выражение в кавычках, ответ).
Пример:
infixeval" (а + Ь) /2", Ответ).
Оценка алгебраического выражения составляет большую часть обра-
ботки реляционных выражений. Приведем механизм, который здесь бу-
дет использован. Любое алгебраическое выражение обрабатывается в
трех последовательных операциях. В первой выделяются унарные мину-
сы и заменяются новыми символами, т.е. они становятся отличимыми от
бинарных. Это важно, поскольку указанные две операции имеют раз-
личный порядок выполнения. Затем выражение преобразуется в поль-
скую обратную нотацию (RPN). И наконец, полученное выражение
оценивается одним действительным числом посредством простого стеко-
вого алгоритма.
Оценщик выражений достаточно гибок, чтобы знать, что нужно де-
лать в случае, когда переменная в выражении определяется с помощью
других переменных. Иногда это оказывается удобным. Пусть, например,
требуется, чтобы система знала следующее соотношение:
расстояние - скорость * время
244
В таком случае нужно записать в базу данных факт
define (расстояние,"скорость * время")
При работе с программой именно оценщик выражений отвечает за
то, что это определение доступно. Теперь предположим, что как часть
вывода система должна исследовать истинность или ложность следую-
щего реляционного выражения:
расстояние > - 3
Приведенный выше факт define заставит систему действовать так,
как будто это рассуждение о другом выражении, а именно,
скорость * время > 3
Пользователь не будет знать о том, что произошло до тех пор, пока не
поймет, что была выполнена замена, так как вопрос, заданный систе-
мой, касается скорости и времени, а не расстояния.
Ниже приведен текст программы
/♦ Программа relnevll ♦/
/♦ — copyright Dan Marcellus, 1988 ♦/
/* •/
/************* ОЦЕНЩИК ВЫРАЖЕНИЙ •♦♦♦♦•♦♦♦♦♦♦♦/
/• •/
/* ПРОГРАММА ПРЕДСТАВЛЯЕТ ИНТЕРПРЕТАТОР, •/
/* КОТОРЫЙ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ДЛЯ ОЦЕНКИ */
/* БУЛЕВСКИХ И АЛГЕБРАИЧЕСКИХ ВЫРАЖЕНИЙ */
/* ВЕРСИЯ 1 */
/• V
/••Ф*«*Ф*Ф*****Ф*******«*«***«**«*«****О«****************«*««««««**/
/* Эти объявления должны быть в главной программе, которая использу-
ет данный оценщик выражений.
database
con vs tack (string)
stackvalue(real)
varvalue (symbol,real)
define (symboMtring) •••••••••••••/
predicates
expander (string,string)
expr-eval (string,real)
findleft (string,string,string)
findmiddle (string,string,string)
get-rpn-value (string)
get-token (string,string,string,real,string)
gtprecedence (string,string)
gettoken (string,string,symbol,real symbol)
initial-work (string«string,string)
infix-to-rpn (string,string,string)
infix-eval (string,real)
proctoken (symbol,real,symbol)
rewriteit (string,string)
245
recode-unary-minus (string,string)
recognize-unary (string,string)
readtop (string)
rpn-eval (string,real)
relcomp (string,real,real,real)
segment (string,string,string,string)
squeezeblanks (string,string,string)
token-work (string,string,string,real,string)
unload-stack (string,sting)
clauses
/* •/
/* Предикаты высшего уровня системы начинаются здесь. */
/• •/
expr-eval(S,Ct) if segments,Left,Middle,Right),
expander (Left,Leftnew),inflx-eval (Leftnew,Lval),
expander (Right,Rightnew),Inflx-eval (Rightnew,Rval),
relcomp (Middle, Lval,Rval, Ct)
/* Это разделяет реляционное выражение на три части для обработки
низкого уровня. */
segment(S,Left,Middle,Right) if
squeezeblanks(S,"",SS),
findleft (SS,"", Left),
concat (Left,Rest,SS).findmiddle (Rest,"",Middle),
concat (Left,Middle,Inter),concat (In ter,Right,SS),!.
/* Приведение алгебраических выражений к наиболее общей форме.
Если некоторые переменные определены с помощью формул, их опре-
деления заменяются выражениями. ♦ /
/* Приведение токена, определенного в другом месте. */
expander (S,R) If
fronttoken (S,S1,S2),define (S1,Y),
expander (S 2, S3),
concat("(",Y,Yl)^»ncat(Yl,")",Y2),concat(Y2,S3,R),!.
/* Пропуск токена, для которого не нужно приведения. •/
expander(S.R) If
fronttoken (S,S1,S2),
expander(S2,S3) .concat (SI ,S3,R),!.
expanderC*,—) if!.
/• Оценивание инфиксного (алгебраического) выражения. */
inflx-eval(S,X) if recode_unary_minus(S,Sl),
inflx_to_rpn (SI ,"",Sf) ,rpn_eval (Sf,X),!.
/* Сравнение правой и левой сторон реляционного выражения.
Каждая часть может быть оценена числом раздельно. */
relcomp("-",L,R,Ct) if Y-L R,Z-abs(Y) ,Z < 0.000001 ,Ct - 1,!.
rokemp(">M,L,R,Ct) if L>R,Ct-1,1.
relcomp("<“,L»R,Ct) if L<R,Ct-1,!.
relcomp(">—",L,R,Ct) if L>-R,Ct- 1,!.
246
relcomp("<-",L,R,Ct) if L<-R,Ct- 1,!.
relcomp (-,-,-, Ct) if Ct
/* Вспомогательные предикаты для разбора реляционного выражения на
три части. */
squeezeblanks (S,Sl,Sf) if fronttoken(S,X,Y),concat(Sl,X,Sinter),
squeezeblanks (Y, Sinter, Sf)
squeezeblanks(S,Sl,Sf) if Sf — SI,!.
findleft (S,Initleft,Left) if fronttoken (S,X,Y),
X <> “<",X <> X <> “>",
concat(Initleft,X,Newleft),findleft (Y,Newleft,Left)
findleft(S,Initleft,Left) if Left - Initleft,!.
findmiddle(SJnitmid,Mid) if fronttoken (S.X,Y),X- “>",
concat(Initmid,X,Newmid), findmiddle (Y.Newmid, Mid)
findmiddle(S,Initmid,Mid) if fronttoken(S,X,Y),X - “<",
concat(Initmid,X,Newmid),findmiddle (Y.Newmid, Mid),!.
findmiddle(S,Initmid,Mid) if fronttoken (S,X,Y) ,X -
concat(Initmid,X,Newmid),findmiddle (Y.Newmid,Mid),!.
findmiddle(S,Initmid,Mid) if Mid - Initmid,!.
/************»*****♦*******************************************♦♦*♦♦/
/****♦****************♦********♦****************♦****♦***♦♦**♦♦*♦♦♦*/
/• ♦/
/* Перекодировка всех унарных минусов в новый символ. */
/* */
/••••••♦••••♦••♦♦••••••••♦♦•••••••••♦••••••♦•••••••••••♦♦•••••♦♦♦♦♦♦у
/• На вход предиката recode_unary_minus поступает строка, представля-
ющая инфиксное выражение. Он определяет места вхождения унар-
ных минусов, и заменяет их символом тильда. */
recode_unary_minus(Ins,Outs) if
concat C?",Ins,Insl), rewriteit (Insl.Outsl),
fronttoken (Outsl,-, Outs).
/* Обработка вложенных унарных минусов.
Обрабатывается ситуация с минусом в начале, так как здесь присутст-
вует “?”, так что мы можем считать, что все унарные минусы вложе-
ны в один. */
rewriteit (Ins,Outs) if fronttoken (Ins,Z,Insl),
fronttoken (Insl ,ZZ,Ins2),
recognize-unary (Z,ZZ),
rewriteit (Ins2,0 utx),
concat(Z,"~",Outy) ,concat(Outy,Outx,Outs),!.
/• Нормальный проход для следующего токена. •/
rewriteit (Ins, Outs) if fronttoken (Ins,Z,Insl),
rewriteit (Insl ,Outx) ,concat(Z,Outx,Outs),!.
/* Это предложение охватывает случай самого крайнего токена и его
пересылку. Заметим, что оно также прекращает рекурсию. */
rewriteit(Ins,Outs) if Outs "Ins,!.
/* Распознавание мест перекодировки для унарных минусов. */
recognizeunary ("(","-") if!,
recognize unaryif!.
recognize_unary if!,
recognlze unaryif!.
/♦♦♦♦ Конец раздела для перекодировки унарных минусов. ♦♦♦♦♦♦♦♦♦♦/
/• •/
/• Раздел преобразует алгебраическое выражение в форму RPN. */
/• V
/"• ••• I
/♦ Название предиката inflx_to_rpn. У него 3 аргумента строки, первый
- инфиксное выражение, второй - пустая строка, и последний -
выход - результат преобразования. Унарные минусы обрабатываемой
строки будут заменены на символ тильды. Эта операция выполняется
с помощью алгоритма Бауера-Самуельсона. */
/* Главное правило преобразования. */
inflx_to_rpn(Ins,Outstart,Outfinal) if
lnitial_work(Ins,Outstart,Outf) ,unload_stack(Outf,Outfinal),!.
/* Первая часть главного правила преобразования. */
initial_work(Ins,Outstart,Outfinal) if
get_token (Ins.Insl ,X,Y,Z),
token_work (Outstart,Outnext,X,Y,Z),
initial_work(Insl ,Outnext,Outfinal),!.
initial_work("”,X,Y) ifY-X,!.
/* Последняя часть преобразования. Перемещает все операторы из стека
после того как входная строка обработана. */
unload stack(Zl,Z) if retract(convstack(X)),
concat (Z1 ,X,XX) ,concat(XX," “,Z2kunload_stack(Z2,Z),!.
unload_stack(X,Y) ifY-X,!.
/* Вставка переменной в выходную строку. */
tokenwork (Outs,Outsl,var,О,Z) If
concat (Outs, Z,ZZ),concat(ZZ,"“, Outs 1),!.
/* Вставка числа в выходную строку. */
token_work(Outs,Outsl,num,Z,dummy) if
str_real (Y,Z),concat (Outs,Y, YY),concat (YY,"“ ,Outs 1),!.
/♦ Вставка левой скобки в стек. ♦/
token_work(Outs,Outsl,op,0,"(") if
Outsl - Outs,asserta(convstack("(")),!.
/* Приходящий оператор имеет более высокий приоритет, чем вершина
стека. •/
token_work(Outs,Outsl,op,0,Z) if
readtop (Т) ,gtprecedence (Z,T),
asserta (convstack (Z)),
Outsl - Outs,!.
248
/♦ Приходящий оператор имеет меньший приоритет, чем вершина сте-
ка. */
token_work(Outs,Outsl,op,O.Z) if
"hoUZf")") ,readtop(T) , not (gtprecedence (Z,T)),
retract(convstack(T)),concat (Outs,T.TT),
concat(TT," “.Outsx),
token_work (Outsx,Outsl ,op,0,Z),!.
/* Приходящий токен - правая скобка. */
token_work(Outs,Outsl,op,0,")") If
readtop(T),T-"(",retract(convstack(T)),Outsl - Outs,!.
token_work(Outs,Outsl,op,0,”)”) If
readtop (T) ,not (T-" (") .retract (convstack (T)),
concat(Outs,T,TT),concat(TT," M,Outsx),
token_work (Outsx,Outsl ,op,0,")"),!.
/* Если мы оказались здесь, то это значит, что стек пуст и можно поме-
стить в него оператор. ♦/
token_work (Outs,Outsl ,ор,О,Z) if Outsl-Outs,
asserta (convstack (Z)).
/* Просмотр стека без его изменения. */
readtop (X) if retract (convstack (X)) ,asserta (convstack (X)),!.
/* Удачное завершение, если первый аргумент имеет больший приори-
тет, чем второй. */
gtprecedence ("~“,”/").
gtprecedence ("-“,"*“).
gtprecedence ("~“, ”+“).
gtprecedence ("~м,"-").
gtprecedence ,"(").
gtprecedence ("/","+").
gtprecedence ("/","-").
gtprecedence ("/","(").
gtprecedence ("* “,"+").
gtprecedence ("*“,"-").
gtprecedence (").
gtprecedence ("+"," C) •
gtprecedence ("-"," (").
/* Заметим, что порядок следующих правил существен. */
/* Возвращение числового токена. */
get_token(S.Sl,num,Zl,dummy) if fronttoken (S,Z,S1),
not (isname (Z)),str-real (Z,Z1),!.
/♦ Возвращение токена для переменной. ♦/
get_token(S,SI,var,О,Z) if
fronttoken (S,Z1, SI), upper_lower(Zl,Z),isname(Z),!.
/* Все, что слева от рассматриваемого токена, должно быть оператором.
•/
get_token(S,Sl,op,О,Z) if fronttoken(S,Z,SI),not(isname(Z)),!.
/••• Конец преобразования алгебраического выражения в RPN •♦♦/
249
/• •/
/* Раздел оценивания выражения в RPN. */
/* •/
/«••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••/
/* Этот модуль берет строку в обратной польской записи в качестве аргу-
мента rpn_eval и оценивает ее. Используемые для переменных значе-
ния должны быть объявлены в программе с помощью фактов varvalue
ранее. Программа ожидает, что унарные минусы заменены тильда-
ми. ♦/
/♦ Общий драйвер для оценивания. */
rpn_eval(S,V) If get_rpn_value(S) .retract(stackvalue(V)),!.
/* Здесь проводится реальная работа по оцениванию посредством мани-
пуляций над стеком. */
get_rpn_value(S) if gettoken (S,S 1 ,X,Y,Z),proctoken (X,Y,Z),
get_rpn_value(Sl).
get_rpn_value("").
get_rpn_value(" “).
/* Заметим, что порядок следующих правил существен. */
/• Обработка различных случаев, которые могут встретиться при работе
с вершиной стека преобразования.
/* Возвращение для числового токена. */
gettoken(S,S1,num,Zl,dummy) if fronttoken (S,Z,S1),
not (isname (Z)),str-real (Z,Z1),!.
/• Возвращение токена для переменной. */
gettoken(S,SI,var,О,Z) if
fronttoken (S,Z1 ,S1 > .upper-lower (Zl ,Z) .isname (Z),!.
/• Все, что слева от рассматриваемого токена; должно быть операто-
ром?/
gettoken(S,Sl,op,О,Z) if fronttoken(S,Z,SI),not(isname(Z)),!.
/* Это различные действия, которые должны быть выполнены над вер-
шиной стека или его двумя токенами. */
/* Здесь у пользователя запрашиваются значения переменных, если они
еще не известны. */
proctoken (var,О,Z) if varvalue (Z,Y),
write С Использование ранее запрошенных значений “),
write ("для переменных в формуле.") ,nl,
asserta (stackvalue (Y)),!.
proctoken (var,О,Z) If write ("Каково значение переменной: “,Z),nl,
readreal (Y) ,nl,assert (varvalue (Z, Y)),
asserta (stackvalue (Y)),!.
proctoken (num,Z,dummy) if asserta (stackvalue (Z)),!.
proctoken (op,0,"+") if retract (stackvalue (X)),
retract (stackvalue (Y)) ,Z - X + Y,asserta (stackvalue (Z)),!.
proctoken (op,0,"-") if retract (stackvalue (X)),
retract (stackvalue (Y)),Z-Y — X,asserta (stackvalue (Z)),!.
250
proctoken (op,0,"*“) if retract (stackvalue (X)),
retract (stackvalue (Y)),Z-X ♦ Y, asserta (stackvalue (Z)),!.
proctoken (op,0,”/”) if retract (stackvalue (X)),
retract (stackvalue (Y)),Z-Y / X, asserta (stackvalue (Z)),!.
proctoken (op,0,"*“) If retract (stackvalue (X)),
Z- -X,asserta (stackvalue (Z)),!.
/**** Конец раздела оценивания выражения в виде RPN
****************I
ОГЛАВЛЕНИЕ
Предисловие к русскому изданию............................5
Предисловие.............................................. 15
1. ВВЕДЕНИЕ...............................................19
1.1. Что такое экспертная система?.......................19
1.2. Общие сведения о структуре экспертных систем........ 20
1.2.1. Экспертные системы как один из видов программ
искусственного интеллекта............................... 20
1.2.2. Программы поиска................................. 25
1.2.3. Управление с помощью эвристики................... 30
1.2.4. Ориентированный на человека диалог............... 32
1.2.5. Архитектура для автоматического рассуждения,
основанная на правилах.................................. 33
1.2.5.1. Что такое правило?............................. 33
1.2.5.2. Совокупность правил, управляемых механизмом вывода.... 34
1.2.5.3. Преимущества систем, основанных на правилах.... 39
1.2.6. Отделение знаний от структур управления.......... 40
1.3. Автоматическое рассуждение......................... 40
1.3.1. Основные механизмы дедукции (логического вывода).. 40
1.3.2. Прямая цепочка рассуждений....................... 41
1.3.3. Обратная цепочка рассуждений..................... 43
1.4. Классификация экспертных систем.................... 44
1.4.1. Некоторые категории ЭС........................... 44
1.4.2. Программы-прототипы в каждой категории........... 44
Упражнения............................С................. 48
2. СИСТЕМЫ, ИСПОЛЬЗУЮЩИЕ ПРОСТОЙ
ПОИСК И РАСПОЗНАВАНИЕ ОБРАЗОВ........................... 51
2.1. Несложные, но весьма полезные программы............ 51
2.2. Программа психологической помощи................... 52
2.2.1 .Миниатюрная версия, демонстрирующая метод
сопоставления с образцом................................ 52
2.2.2. Машина в роли психолога.......................... 53
2.2.3. Детальное рассмотрение структуры программы........54
2.3. Поисковые возможности языка Пролог................. 55
2.3.1. Поисковые программы для графов................... 55
2.3.2. Некоторые особенности программирования........... 57
2.4. Простая программа химического синтеза.............. 60
2.4.1. Миниатюрная версия, иллюстрирующая процесс поиска. 60
2.4.2. Программируемые стратегии поиска................. 63
252
2.4.2.1. Химический синтез: нахождение дерева реакций.. 63
2.4.2.2. Достаточно хороший синтез..................... 66
2.4.2.3. Наилучший синтез.............................. 68
2.4.3. Реальная система химического синтеза............ 70
2.4.4. Развитие по принципу “снизу-вверх”.............. 71
Упражнения............................................. 72
3. ВЫБОР НАПРАВЛЕНИЙ ПОИСКА
С ПОМОЩЬЮ ЭВРИСТИК..................................... 74
3.1. Введение в технологию программирования с эвристиками.... 74
3.2. Поиск с применением эвристической оценочной функции.... 75
33. Поиск с эвристическими правилами: помощник студента.80
3.3.1. Конструирование расписаний с большим поисковым
пространством.......................................... 80
3.3.2. Эвристики, определяющие задачу.................. 81
3.3.3. Данные для программы - специфика курсов......... 82
3.3.4. Программируемая стратегия для создания хороших расписаний 83
3.3.5. Программирование баз знаний..................... 87
Упражнения............................................. 87
4. УПРАВЛЕНИЕ СТРАТЕГИЕЙ ВЫВОДА....................... 89
4.1. Прямая и обратная цепочки рассуждений............. 89
4.2. Программа классификации с обратной цепочкой рассуждений 91
4.2.1. “Птица, зверь или рыба”: версия 1............... 91
4.2.2. Как работает программа?......................... 94
4.3. Программа классификации с прямой цепочкой рассуждения.. 97
4.3.1. “Птица, зверь или рыба”: версия 2............... 97
4.3.2. Как работает программа?......................... 98
4.4. Сравнение двух главных стратегий вывода........... 101
Упражнения............................................. 103
5. ЭКСПЕРТНЫЕ СИСТЕМЫ И ВЫВОД В УСЛОВИЯХ
НЕОПРЕДЕЛЕННОСТИ...................................... 104
5.1. Более сложные системы вывода..................... 104
5.1.1. Оценка вероятности при использовании нескольких посылок . 104
5.1.2. Условная вероятность........................... 105
5.2. Точное вероятностное рассуждение................. 108
5.2.1. Как может быть точным то, что является неопределенным? ... 108
5.2.2. Простая импликация с позиций вероятности........109
5.2.3. Импликация, в которой две посылки объединены
с помощью правила И................................... 111
5.2.4 Импликация, в которых посылки объединены с помощью
правила ИЛИ........................................... 113
5.2.5. Непригодность вероятностного вывода для реальных задач ... 114
253
5.3. Приближенные рассуждения ....................... 115
5.3.1. Менее строгая, но более полезная схема........ 115
5.3.2. Импликации с одной посылкой................... 115
5.3.3. Логические комбинации посылок в одном правиле. 116
5.3.4. Поддержка одного заключения множеством правил... 118
5.3.5. Дополнение: несколько правил, используемых
последовательно...................................... 120
5.3.6. Биполярные схемы для коэффициентов определенности.... 121
5.4. Цепочки рассуждений: многоступенчатые рассуждения.125
5.4.1. Возможности сетей вывода...................... 125
5.4.2. Процесс распространения в сети вывода......... 129
5.5. Программа приближенных рассуждений в стиле EMYCIN. 133
5.5.1. FUZZYNET выбирает между конкурирующими гипотезами.. 133
5.5.2. Структура FUZZYNET............................ 133
Упражнения........................................... 142
6. СИСТЕМЫ, ОБЪЯСНЯЮЩИЕ СВОЕ ПОВЕДЕНИЕ................. 146
6.1. Механизм объяснения............................. 146
6.2. Ответы на вопросы “ почему**.................... 148
6.3. Ответы на вопросы “как**....................... 151
6.4. Сеть вывода с возможностями объяснения ......... 153
Упражнения........................................... 159
7. НАПИСАНИЕ И ИСПОЛЬЗОВАНИЕ ОБОЛОЧЕК
НА ПРОЛОГЕ...............................<............160
7.1. Ускорение процесса разработки экспертных систем
с помощью оболочек................................... 160
7.2. Оболочка imp: архитектура и проектирование.......162
7.2.1. Сборка........................................ 162
7.2.2. Добавление формул вправила.................... 166
7.2.3. Среда разработчика............................ 172
7.3. Создание “Консультанта по инвестициям**......... 177
7.4. Использование оболочки в больших Пролог-программах .... 181
Упражнения........................................... 182
8. ИНТЕРФЕЙСЫ НА ЕСТЕСТВЕННОМ ЯЗЫКЕ:
НЕФОРМАЛЬНЫЕ МЕТОДЫ.................................. 183
8.1. Введение в неформальные методы общения.......... 183
8.2. Извлечение значения из ключевых слов............ 185
254
8.2.1. Операция просмотра ключевых слов.............. 185
8.2.2. Информационная система документации........... 185
8.2.3. Детальное описание системы DOCSYS............. 186
8.2.3.1. Структуры данных для системы................ 186
8.2.3.2. Стратегии программирования.................. 188
8.3. Извлечение значений из отношений сущностей...... 191
8.3.1. От ключевых слов к шаблонам: программа GEOBASE.191
8.3.2. Возможности GEOBASE........................... 192
8.3.3. Основная организация базы данных.............. 193
8.3.4. Функции высокого уровня....................... 194
8.3.5. Синтаксический анализ......................... 197
8.3.6. Низкоуровневые функции доступа к базе данных.. 199
8.3.7. Механизм ответов на вопросы................... 201
8.3.8. Более подробно о синтаксическом анализе....... 204
Упражнения........................................... 206
9. ИНТЕРФЕЙСЫ НА ЕСТЕСТВЕННОМ ЯЗЫКЕ:
ФОРМАЛЬНЫЕ МЕТОДЫ.................................... 208
9.1. Формальные методы общения....................... 208
9.2. Анализ синтаксической структуры предложения..... 210
9.3. Анализ семантической структуры предложения.......220
9.3.1. Тематический анализ........................... 220
9.3.2. Автоматический перевод: пример проведения
тематического анализа.................................223
9.3.3. Анализатор падежей............................ 225
9.4. Заключение...................................... 227
Упражнения........................................... 228
Приложение А. ОБОЛОЧКА IMP: СРЕДА РАЗРАБОТЧИКА
ЭКСПЕРТНЫХ СИСТЕМ.....................................230
Приложение Б. ИНТЕРПРЕТАТОР ДЛЯ ОЦЕНИВАНИЯ
АЛГЕБРАИЧЕСКИХ И РЕЛЯЦИОННЫХ ВЫРАЖЕНИЙ................243
Научное издание
Марселлус Дэнэл Н.
ПРОГРАММИРОВАНИЕ ЭКСПЕРТНЫХ СИСТЕМ
НА ТУРБО ПРОЛОГЕ
Редакторы Н.КЛогинова, Л.Д.Григорьева
Худож. редактор Ю.И. Артюхов
Техн.редакторы Л.Г.Челышева, И.В.Завгородняя
Корректоры Т.М. Колпакова, Н.П.Сперанская
Обложка художника А.Е.Рачинского
Репродуцируемый оригинал-макет выполнен
Е.Ф.Тимохиной, И.В.Юдинцевой
ИБ№2693
Подписано в печать 04.02.94.
Формат 84x108/32. Гарнитура Таймс. Печать офсетная.
Усл.печл. 13,44. Уч.-изд.л. 15,74. Усл.кр.-отт. 13,54.
Тираж 25000 экз. Заказ 751 “С”009
Издательство “Финансы и статистика",
101000, Москва, ул. Чернышевского, 7.
Типография издательства “Новости"
107005, Москва, ул. Ф.Энгельса, 46.