WWW.NET.KNIGI-X.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Интернет ресурсы
 

Pages:   || 2 |

«Министерство образования и науки Российской Федерации Южно-Российский государственный политехнический университет (НПИ) имени М.И Платова Ю.М. Рыбальченко СИСТЕМЫ ...»

-- [ Страница 1 ] --

Министерство образования и науки Российской Федерации

Южно-Российский государственный политехнический университет

(НПИ) имени М.И Платова

Ю.М. Рыбальченко

СИСТЕМЫ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА

В НЕФТЕГАЗОВОЙ ОТРАСЛИ

Методические указания

к практическим занятиям

Новочеркасск

ЮРГПУ (НПИ)

УДК 622.233.05(076.5)

ББК 30.605я73

Рецензент – докт. геол.-мин. наук, проф. И.А. Богуш

Рыбальченко Ю.М.

Системы искусственного интеллекта в нефтегазовой отрасли :

методические указания к практическим занятиям / Южно-Российский государственный политехнический университет (НПИ) имени М.И. Платова. – Новочеркасск: ЮРГПУ(НПИ), 2016. – 93 с.

Методические указания составлены в соответствии с учебным планом и рабочей программой по дисциплине “ Буровые технологические жидкости для бурения и крепления горизонтальных скважин ” для направления подготовки 21.04.01 «Нефтегазовое дело» специализации “Строительство нефтяных и газовых скважин в сложных горно-геологических условиях»

УДК 622.233.05(076.5) © Южно-Российский государственный политехнический университет (НПИ) имени М.И. Платова, 2016 Содержание Введение Практическая работа № 1. Применение инструментальных средств систем ИИ Практическая работа № 2. Программирование на языке Prolog Практическая работа № 3. Технология программирования для ИИ на языке LISP Практическая работа № 4.


Технология программирования для ИИ на языке CLIPS Практическая работа № 5. Изучение методов формализации интеллектуальных задач Практическая работа № 6. Изучение оболочек экспертных систем Практическая работа № 7. Изучение нечетких моделей Практическая работа № 8. Основы программирования в нефтегазовой отрасли на языке PDC PROLOG Введение Искусственный интеллект (ИИ) - это наука о концепциях, позволяющих ВМ делать такие вещи, которые у людей выглядят разумными. Но что же представляет собой интеллект человека? Есть ли эта способность размышлять? Есть ли эта способность усваивать и использовать знания? Есть ли эта способность оперировать и обмениваться идеями? Несомненно, все эти способности представляют собой часть того, что является интеллектом. На самом деле дать определение в обычном смысле этого слова, по-видимому, невозможно, потому что интеллект - это сплав многих навыков в области обработки и представления информации.

Центральные задачи ИИ состоят в том, что бы сделать ВМ более полезными и чтобы понять принципы, лежащие в основе интеллекта. Поскольку одна из задач состоит в том, чтобы сделать ВМ более полезными, ученым и инженерам, специализирующимся в вычислительной технике, необходимо знать, каким образом ИИ может помочь им в разрешение трудных проблем.

ПРАКТИЧЕСКАЯ РАБОТА № 1 Тема: «Применение инструментальных средств систем ИИ»

Цель работы: изучить инструментальные средства систем искусственного и их применение.

Дидактический материал: плакаты, раздаточный материал.

Основные теоретические положения:

Искусственный интеллект – самое молодое научное направление. Появление его было подготовлено развитием мощности вычислительных машин.

Искусственный интеллект занимает исключительное положение. Это связано со следующим:

1. Часть функций программирования в настоящее время оказалось возможным передать машине. При этом общение с машиной происходит на языке, близком к разговорному. Для этого в ЭВМ закладывают огромную базу знаний, способы решения, процедуры синтеза, программы, а также средства общения, позволяющие пользователю легко общаться с ЭВМ.

2. В связи с внедрением ЭВМ во все сферы человеческой жизни становится возможным переход к безбумажной технологии обработки информации.

3. Если раньше производство ориентировалось на обязательное участие человека, то в настоящее время находят применение безлюдные технологии, основанные на роботизации и автоматизации системы управления.

4. Интеллектуальные системы в настоящее время начинают занимать ведущее положение в проектировании образцов изделий. Часть изделий невозможно спроектировать без их участия.

Системы, относящиеся к системам ИИ в настоящее время:

1. Экспертные системы. Первые системы, которые нашли широкое применение. Их элементы используются в системах проектирования, диагностики, управления и играх. Основаны на вводе знаний высококвалифицированных специалистов (экспертов) в ЭВМ и разработке специальной системы по их использованию.

2. Системы естественно - языкового общения (подразумевается письменная речь). Данные системы позволяют производить обработку связанных текстов по какой – либо тематике на естественном языке.

–  –  –

системы воспроизведения речи.

4. Системы обработки визуальной информации. Находят применение в обработке аэрокосмических снимков, данных, поступающих с датчиков, роботов и автоматизированных систем.

5. Системы машинного перевода. Подразумеваются естественные языки человеческого общения.

6. Системы автоматического проектирования. Без этих систем не может обойтись ни одно крупное машиностроительное предприятие.

Инструментальные средства разработки экспертных систем Экспертные системы (ЭС) - это системы искусственного интеллекта (интеллектуальные системы), предназначенные для решения плохоформализованных и слабоструктурированных задач в определенных проблемных областях, на основе заложенных в них знаний специалистов-экспертов. В настоящее время ЭС внедряются в различные виды человеческой деятельности, где использование точных математических методов и моделей затруднительно или вообще невозможно. К ним относятся: медицина, обучение, поддержка принятия решений и управление в сложных ситуациях, деловые различные приложения и т. д.

Основными компонентами ЭС являются базы данных (БД) и знаний (БД), блоки поиска решения, объяснения, извлечения и накопления знаний, обучения и организации взаимодействия с пользователем. БД, БЗ и блок поиска решений образуют ядро ЭС.

Для конструирования ЭС используются различные инструментальные средства: универсальные языки программирования, языки искусственного интеллекта, инструментальные системы и среды и системы-оболочки. Системыоболочки являются наиболее простым средством формализации (автоформализации) экспертных знаний, практически не требующие участия посредников в лице инженера по знаниям или программиста при их использовании. Инженер по знаниям только помогает эксперту выбрать наиболее подходящую для его проблемной области оболочку.

Известны три основные разновидности исполнения экспертных систем:

• - Экспертные системы, выполненные в виде отдельных программ, на некотором алгоритмическом языке, база знаний которых является непосредственно частью этой программы. Как правило, такие системы предназначены для решения задач в одной фиксированной предметной области. При построении таких систем применяются как традиционные процедурные языки PASCAL, C и др., так и специализированные языки искусственного интеллекта LISP, PROLOG.

• - Оболочки экспертных систем - программный продукт, обладающий средствами представления знаний для определенных предметных областей. Задача пользователя заключается не в непосредственном программировании, а в формализации и вводе знаний с использованием предоставленных оболочкой возможностей. Недостатком этих систем можно считать невозможность охвата одной системой всех существующих предметных областей. Примером могут служить ИНТЕРЭКСПЕРТ, РС+, VP-Expert.

• - Генераторы экспертных систем - мощные программные продукты, предназначенные для получения оболочек, ориентированных на то или иное представление знаний в зависимости от рассматриваемой предметной области.

Примеры этой разновидности - системы KEE, ART и др..

Системы EXSYS и GURU относятся к системам дедуктивного продукционного типа, причем система GURU (в ее современной версии, ориентированной на рабочие станции) по сути является инструментальной средой, поддерживающей различные режимы конструирования прикладных ЭС и обладающей достаточно развитыми средствами обработки фактора неопределенности. Эта система ориентирована на различные классы пользователей в зависимости от их подготовки в области искусственного интеллекта и программирования, имеет развитый интерфейс с современными СУБД и электронными таблицами, средства сбора статистики и т. д. Система может работать на различных вычислительных платформах под управлением различных операционных систем, а также имеет поддержку сетевой конфигурации.





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

В списке наиболее распространенных в настоящее время за рубежом экспертных систем и их оболочек можно выделить следующие наименования:

INSIGT, LOGIAN, NEXPERT, RULE MASTER, KDS, PICON, KNOWLEDGE

CRAFT, KESII, S1, TIMM и др.

В качестве критериев, по которым можно судить о возможности создания экспертной системы следует отметить следующие:

- Необходимость символьных рассуждений, очевидно, нет смысла 1.

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

- Наличие экспертов, компетентных в избранном круге вопросов, 2.

которые согласны сотрудничать при создании ЭС.

- Поставленная проблема должна быть достаточно важной и актуальной. Это могут быть проблемы, требующие высокого уровня экспертизы, либо простые, но трудоемкие многократно повторяющиеся проверки. Нет смысла тратить время на решение проблем, которые возникают редко и могут быть разрешены человеком с обычной квалификацией.

- Необходимо четко ограничивать круг решаемых задач, т.е. предметная область выбирается достаточно "узкой", чтобы избежать "комбинаторного взрыва" объема информации необходимой для компетентного решения поставленной задачи.

- Необходима согласованность мнений экспертов о том, как следует 5.

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

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

- Должна обеспечиваться возможность постепенного наращивания 8.

системы. База знаний должна легко расширяться и корректироваться, так как правила часто меняются с появлением новых фактов.

Ценность использования ЭС проявляется в следующих аспектах:

- В сборе, оперативном уточнении, кодировании и распространении a) экспертных знаний.

- В эффективном решении проблем, сложность которых превышает b) человеческие возможности и для которых требуются экспертные знания нескольких областей.

- В сохранении наиболее уязвимой ценности коллектива - коллекc) тивной памяти.

Создание баз знаний открывает широкие возможности, которые обусловлены безошибочностью и тщательностью, присущими ЭВМ и синтезом знаний экспертов. Если база знаний объединяет информацию по нескольким дисциплинам, то такой "сплав" знаний приобретает дополнительную ценность.

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

Экспертная система VP-Expert представляет собой "пустую" оболочку, хорошо зарекомендовавшую и получившую достаточно широкое распространение. ее применение возможно на IBM совместимых персональных компьютерах с операционной системой MS DOS, имеющих не менее 256 К оперативной памяти и адаптеры графических дисплеев подобные CGA, EGA или HERKULES.

Важной особенностью оболочки, существенно расширяющей ее возможности, является совместимость с файлами созданными dBASE II, dBASE III и dBASE III+.

ПРАКТИЧЕСКАЯ РАБОТА № 2 Тема: «Программирование на языке Prolog»

Цель работы: Изучение принципов логического программирования на языке Prolog.

Дидактический материал: плакаты, раздаточный материал.

Задание

Разработать:

1) математическую модель решения логической задачи.

2) написать программу поиска решения на языке ПРОЛОГ.

В отчет включить:

1) постановку задачи

2) описание математической модели

3) листинг программы

Основные теоретические положения:

В Прологе (Prolog — PROgrammmg LOGic) решение задачи получается логическим выводом из ранее известных положений. Обычно программа на Прологе не является последовательностью действий, — она представляет собой набор фактов с правилами, обеспечивающими получение заключений на основе этих фактов. Поэтому Пролог известен как декларативный язык.

Пролог базируется на предложениях Хорна, являющихся подмножеством формальной системы, называемой логикой предикатов. Логика предикатов — это простейший способ объяснить, как “работает” мышление, и она проще, чем арифметика, которой вы давно пользуетесь.

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

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

Одной из важнейших особенностей Пролога является то, что в дополнение к логическому поиску ответов на поставленные вопросы он может иметь дело с альтернативами и находить все возможные решения. Вместо обычной работы от начала программы до ее конца, Пролог может возвращаться назад и просматривать более одного “пути” при решении всех составляющих задачу частей. Логика предикатов была разработана для наиболее простого преобразования принципов логического мышления в записываемую форму. Пролог использует преимущества синтаксиса логики для разработки программного языка. Здесь исключаются из высказываний все несущественные слова. Затем предложения преобразуются по форме, где на первое место ставятся отношения, а после него — сгруппированные объекты. В дальнейшем объекты становятся аргументами, между которыми устанавливается это отношение. В качестве примера в таблице 1.1 представлены предложения, преобразованные в соответствии с синтаксисом логики предикатов.

Таблица 1.1 Синтаксис логики предикатов Предложения на естественном языке Синтаксис логики предикатов Машина красивая fun (car) Роза красная red (rose) Билл любит машину, если машина likes(bill, Car) if fun (Car) красивая Примечание: В высказываниях на Прологе все известные факты и данных записываются со строчной, а переменные – с прописной букв.

Факты и правила Программист на Прологе описывает объекты и отношения, а затем описывает правила, при которых эти отношения являются истинными. Например, предложение Билл любит собак. (Bill likes dogs.) устанавливает отношение между объектами Bill и dogs (Билл и собаки), этим отношением является likes (любит).

Ниже представлено правило, определяющее, когда предложение "Билл любит собак" является истинным:

Билл любит собак, если собаки хорошие. (Bill likes dogs if the dogs are nice.) Факты В Прологе отношение между объектами называется фактом. В естественном языке отношение устанавливается в предложении. В логике предикатов, используемой Прологом, отношение соответствует простой фразе (факту), состоящей из имени отношения и объекта или объектов, заключенных в круглые скобки. Как и предложение, факт завершается точкой (.).

Ниже представлено несколько предложений на естественном языке с отношением "любит" (likes) и соответствие высказываний на Прологе:

Билл любит Синди. (Bill likes Cindy) likes(bill, cindy).

Синди любит Билла. (Cindy likes Bill) likes(cindy, bill).

Билл любит собак. (Bill likes dogs) likes(bill, dogs).

Факты, помимо отношений, могут выражать и свойства.

Так, например, предложения естественного языка 'Kermit is green" {Кермит зеленый) и 'Caitlin is girl" (Кейтлин — девочка) на Прологе, выражая те же свойства, выглядят следующим образом:

green (kerrrat). girl(caitlin).

Правила Правила позволяют вам вывести один факт из других фактов. Другими словами, можно сказать, что правило — это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными.

Ниже представлены правила, соответствующие связи "любить" (likes):

Синди любит все, что любит Билл. (Cindy likes everything that Bill likes) Кейтлин любит все зеленое. (Caitlin likes everything that is green)

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

Синди любит Синди. (Cindy likes Cindy) Кейтлин любит Кермит.

(Caitlin likes Kermit) Чтобы перевести эти правила на Пролог, вам нужно немного изменить синтаксис, подобно этому:

likes (cindy, Something) :- likes (bill, Something).

likes (caitlin, Something) :- green (Something).

Символ :- имеет смысл "если"; и служит для разделения двух частей правила: заголовка и тела.

Правило можно рассматривать и как процедуру. Другими словами, эти правила likes (cindy, Something) :- likes (bill, Something) likes (caitlin, Something) :- green (Something).

также означают, "Чтобы доказать, что Синди любит что-то, докажите, что Билл любит это" и "Чтобы доказать, что Кейтлин любит что-то, докажите, что это что-то зеленое". С такой "процедурной" точки зрения правила могут "попросить" Пролог выполнить другие действия, отличные от доказательств фактов, — такие как напечатать что-нибудь или создать файл.

Объекты Программа на языке Пролог обычно описывает некую действительность.

Объекты (элементы) описываемого мира представляются с помощью термов.

Терм интуитивно означает объект. Существует 4 вида термов: атомы, числа, переменные и составные термы. Атомы и числа иногда группируют вместе и называют простейшими термами.

Атом - это отдельный объект, считающийся элементарным. В Прологе атом представляется последовательностью букв нижнего и верхнего регистра, цифр и символа подчеркивания '_', начинающейся со строчной буквы. Кроме того, любой набор допустимых символов, заключенный в апострофы, также является атомом. Наконец, комбинации специальных символов + - * = : & также являются атомами (следует отметить, что набор этих символов может отличаться в различных версиях Пролога).

Пример.

Представленные далее последовательности являются корректными атомами:

b, abcXYZ, x_123, efg_hij, коля, слесарь, 'Это также атом Пролога', +, ::, ----, *** Числа в Прологе бывают целыми (Integer) и вещественными (Float). Синтаксис целых чисел прост, как это видно из следующих примеров: 1, 1313, 0, Не все целые числа могут быть представлены в машине, их диапазон ограничен интервалом между некоторыми минимальным и максимальным значениями, определенными конкретной реализацией Пролога. Синтаксис вещественных чисел также зависит от конкретной реализации. При обычном программировании на Прологе вещественные числа используются редко, поскольку Пролог - язык, предназначенный в первую очередь для обработки символьной, а не числовой информации. При символьной обработке часто используются целые числа, нужда же в вещественных числах невелика. Везде, где можно, Пролог старается привести число к целому виду.

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

X, _4711, X_1_2, Результат, _x23, Объект2, _ Последний пример (единственный символ подчеркивания) является особым случаем - анонимной переменной (переменной без имени). Анонимная переменная применяется, когда ее значение не используется в программе.

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

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

Ниже приведены два составных терма:

итого(клиент(X,23,_), 71) 'Что случилось?'(ничего) При задании имен термов предпочтительнее использовать мнемонические ("говорящие") имена, так как терм a(ж), например, гораздо менее информативен, чем терм aвтор(жюль_верн).

Еще одной важной структурой данных в Прологе является список. Сейчас отметим только один из видов списков - список символов. Такие списки могут быть представлены в виде строк, например, первый аргумент составного терма возраст("Борис",10) - строка. При записи строки заключаются в кавычки.

Запросы Однократно предоставив языку Пролог несколько фактов, можно задавать вопросы, касающиеся отношений между ними. Это называется запросом системы языка Пролог. Основываясь на известных, заданных ранее фактах и правилах, можно ответить на вопросы об этих отношениях, в точности так же это может сделать Пролог.

На естественном языке мы спрашиваем:

Does Bill like Cindy? (Билл любит Синди?)

По правилам Пролога мы спрашиваем:

likes(bill, cindy).

Получив такой запрос, Пролог мог бы ответить:

yes (да).

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

What does Bill like? (Что любит Билл?)

По правилам Пролога мы спрашиваем:

likes (bill, What).

Заметим, что синтаксис Пролога не изменяется, когда вы задаете вопрос:

этот запрос очень похож на факт. Впрочем, важно отметить, что второй объект — What — начинается с большой буквы, тогда как первый объект — bill — нет. Это происходит потому, что bill — фиксированный, постоянный объект — известная величина, a What — переменная.

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

What=cindy What=dogs 2 Solutions Так как ему известно, что likes(bill, cindy).

и likes(bill, dogs).

Надеемся, что вы пришли к такому же выводу.

Если бы мы спросили вас (и Пролог):

What does Cindy like? (Что любит Синди?) likes(cindy, What).

то Пролог ответил бы:

What = bill What = cindy What = dogs 3 solutions поскольку Пролог знает, что Синди любит Била, и что Синди любит то же, что и Билл, и что Билл любит Синди и собак.

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

Размещение фактов, правил и запросов

Предположим, у вас есть следующие факты и правила:

Быстрая машина — приятная. (A fast car is fun).

Большая машина — красивая. (A big car is nice).

Маленькая машина — практичная. (A little car is practical).

Биллу нравится машина, если она приятная. (Bill likes a car if the car is fun).

Исследуя эти факты, можно сделать вывод, что Билу нравится быстрый автомобиль. В большинстве случаев Пролог придет к подобному решению. Если бы не было фактов о быстрых автомобилях, вы не смогли бы логически вывести, какие автомобили нравятся Биллу. Вы можете делать предположения о том, какой тип машин может быть крепким, но Пролог знает только то, что вы ему скажете, Пролог не строит предположений.

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

likes (ellen, tennis).

likes (john, football).

likes (tom, baseball).

likes (eric, swimming).

likes (mark, tennis).

likes (bill, Activity) :- likes (tom, Activity).

Это правило соответствует предложению естественного языка:

Биллу нравится занятие, если Тому нравится это занятие. (Bill likes an activity if Tom likes that activity) В данном правиле заголовок — это likes (Bill, activity), а тело — likes (torn, Activity). Заметим, что в этом примере нет фактов о том, что Билл любит бейсбол.

Чтобы выяснить, любит ли Билл бейсбол, можно дать Пролог такой запрос:

goal likes (bill, baseball).

Пролог ответит на этот запрос:

yes (да) При этом Пролог использовал комбинированное правило likes(bill,Activity) :- likes(tom,Activity).

с фактом likes(tom,baseball).

для решения, что likes(bill, baseball).

Краткие выводы по вышесказанному:

1. Программы на языке Пролог состоят из двух типов фраз: фактов и правил, также называемых предложениями.

Факты — это отношения или свойства, о которых известно, что они имеют значение "истина".

Правила — это связанные отношения; они позволяют Прологу логически выводить одну порцию информации из другой. Правило принимает значение "истина", если доказано, что заданный набор условий является истинным.

2. В Прологе все правила имеют 2 части: заголовок и тело, разделенные специальным знаком :-.

Заголовок — это факт, который был бы истинным, если бы были истинными несколько условий. Это называется выводом или зависимым отношением.

Тело — это ряд условий, которые должны быть истинными, чтобы Пролог мог доказать, что заголовок правила истинен.

Факты и правила — практически одно и то же, кроме того, что факты не имеют явного тела. Факты ведут себя так, как если бы они имели тело, которое всегда истинно.

Пролог всегда ищет решение, начиная с первого факта и/или правила, и просматривает весь список фактов и/или правил до конца.

Механизм логического вывода Пролога берет условия из правила (тело правила) и просматривает список известных фактов и правил, пытаясь удовлетворить условиям. Если все условия истинны, то зависимое отношение (заголовок правила) считается истинным. Если все условия не могут быть согласованы с известными фактами, то правило ничего не выводит.

Предложения По сути, есть только два типа фраз, составляющих язык Пролога: фраза может быть либо фактом, либо правилом. Эти фразы в Прологе известны под термином предложения (clause). Сердце программ на Прологе состоит из предложений.

Подробнее о фактах. Факт представляет либо свойство объекта, либо отношение между объектами. Факт самодостаточен. Прологу не требуется дополнительных сведений для подтверждения факта, и факт может быть использован как основа для логического вывода.

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

Рассмотрим несколько примеров работы с правилами.

1. Пример, иллюстрирующий правило, которое может быть использовано для того, чтобы сделать вывод, подходит ли некоторое блюдо из меню Диане:

Диана — вегетарианка и ест только то, что говорит ей ее доктор. (Diane is a vegetarian and eats only what her doctor tells her to eat) Зная меню и предыдущее правило, можно сделать вывод о том, выберет ли Диана данное блюдо.

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

• является ли Food_on_menu овощем?

• находится ли Food_on_menu в списке доктора?

• заключение: если оба ответа положительны, Диана может заказать Food_on_menu.

В Прологе подобное отношение должно быть выражено правилом, т.к.

вывод основан на фактах. Вот один вариант записи правила:

diane_can_eat(Food_on_menu):vegetable(Food_on_menu), on_doctor_list(Food_on_menu).

Обратите внимание, что после vegetable (Food__on_menu) стоит запятая.

Она обозначает конъюнкцию нескольких целей и читается как "и", оба правила — vegetable (Food_on_menu) и on_doctor_list (Food_on_meru) — должны быть истинны для истинности diane_can_eat(Food_on_menu).

2. Предположим, что вам хотелось бы записать факт, который истинен, если некто Рersonl является родителем кого-то Рerson2. Нужный факт выглядит так:

parent(paul, samantha).

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

Например, "Пол — отец Саманты":

father(paul, samantha).

Пусть у вас также есть факты, формулирующие отношение материнства, например, "Джулия — мать Саманты":

mother(julie, samantha).

Если у вас уже есть несколько фактов, формулирующих отношения отцовства/материнства, то не стоит тратить время на запись факта родства в базу данных фактов для каждого отношения родства.

Так как вы знаете, что Personl — родитель Рerson2, если Personl — отец Рerson2 или Personl — мать Person2, то почему бы не записать правило, объединяющее эти ограничения? После формулирования этих условий на естественном языке достаточно просто записать их в правило Пролога.

parent(Personl, Person2):- father(personl, Person2).

parent{Personl, Person2):- mother(Personl, Person2).

Эти правила Пролога говорят, что Personl является родителем Рerson2, если Personl является отцом Person2. Personl является родителем Person2, если Personl является матерью Person2.

Предикаты Отношение в Прологе называется предикатом. Аргументы — это объекты, которые связываются этим отношением; в факте likes (bill, cindy) отношение likes — это предикат, а объекты bill и cindy — аргументы.

Вот несколько примеров предикатов с различным числом аргументов:

pred(integer, symbol) person(last, first, gender) run() birthday(firstName, lastName, date) В вышеприведенном примере показано, что предикаты могут вовсе не иметь аргументов, но использование таких предикатов ограничено. Чтобы выяснить имя Mr.Rosemont, можно применить запрос person (rosemont, Name, male). Но что делать с запросом без аргументов run? Выясним, есть ли в программе предложение run, и если run — это заголовок правила, то можно вычислить данное правило. В некоторых случаях это оказывается полезным — например, если бы вы захотели создать программу, работающую по-разному в зависимости от того, имеется ли предложение run.

Переменные

В простом запросе, чтобы найти того, кто любит теннис, можно использовать переменные. Например:

likes(X, tennis).

В этом запросе буква X используется как переменная для нахождения неизвестного человека. Осмысленный выбор имен переменных делает программу более удобной для чтения.

Например:

likes(Person, tennis).

лучше, чем предыдущий вариант, потому что Person имеет больше смысла, чем переменная X.

Инициализация переменных Пролог не имеет оператора присваивания. Это важное отличие Пролога от других языков программирования. Переменные в Прологе инициализируются при сопоставлении с константами в фактах или правилах.

До инициализации переменная свободна; после присвоения ей значения она становится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение.

Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.

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

predicates likes(symbol,symbol) clauses likes(ellen,reading). likes(john,computers). likes(john,badminton).

likes{leonard,badminton). likes(eric,swimming). likes(eric,reading).

Рассмотрим запрос: есть ли человек, который любит и чтение, и плавание?

likes(Person, reading), likes(Person, swimming).

Пролог будет решать обе части запроса посредством поиска фактов с начала и до конца программы. В первой части запроса likes (Person, reading) переменная Person свободна; ее значение неизвестно перед тем, как Пролог попытается найти решение. С другой стороны, второй аргумент, reading, известен. Пролог ищет факт, который соответствует первой части запроса. Первый факт в программе likes (ellen, rerading) удовлетворяет первой части запроса (reading в факте соответствует reading в запросе), то есть Пролог связывает свободную переменную Person со значением ellen, соответствующим значению в факте. В то же время Пролог помещает указатель в список фактов, показывающий, как далеко продвинулась процедура поиска. Далее, для полного разрешения запроса (поиск человека, которому нравится и чтение, и плавание) должна быть решена вторая часть запроса. Так как Person сейчас связана со значением ellen, Пролог должен искать факт likes(ellen, swimming).

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

Пролог ищет следующего человека, кто любит чтение и находит факт likes (eric, reading).

Переменная Person сейчас связана со значением eric, и Пролог пытается вновь найти соответствие со второй частью запроса посредством поиска в программе факта:

likes(eric, swimming) Пролог находит совпадение (последнее предложение в программе), и запрос полностью удовлетворяется. Пролог возвращает Person=eric.

1 Solution.

Анонимные переменные

Анонимные переменные позволяют "привести в порядок" программы.

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

Следующий пример демонстрирует использование анонимных переменных.

predicates male(symbol) female(symbol) parent(symbol, symbol) clauses male(bill). male (jое).

female(sue). female(tammy).

parent(bill, joe). parent(sue, joe). parent(joe, tammy).

Анонимная переменная может быть использована на месте любой другой переменной и ей никогда не присваивается значение.

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

goal parent(Parent, _).

Получив такой запрос, Пролог отвечает:

Parent=bill Parent=sue Parent=joe 3 Solutions В этом случае Пролог находит и выдает трех родителей, но он не выдает значения, связанные со вторым аргументом в предложении parent.

Анонимные переменные также можно использовать в фактах. Следующие факты Пролога:

owns(_, shoes). eats(_).

могли быть использованы для выражения утверждений на естественном языке:

У каждого есть туфли. (Everyone owns shoes) Каждый ест. (Everyone eats) Анонимные переменные сопоставляются с любыми данными.

Цели (запросы) Формируя запрос, мы тем самым ставим цель Прологу, которую он должен достичь. Для объявления раздела цели в программе на Прологе используется служебное слово goal.

Трактовка запросов как целей такова: когда вы даете Прологу запрос, в действительности вы даете ему цель для выполнения.

Цели могут быть или простыми:

likes(ellen, swimming). likes(bill, What), или более сложными.

likes(Person, reading), likes(Person, swimming).

Цель, состоящая из двух и более частей, называется сложной целью, а каждая часть сложной цепи называется подцелью.

Часто бывает нужно найти общее решение двух целей. Например, в предыдущем примере о родителях вы могли бы поинтересоваться, которые из родителей являются родителями мужского пола. Искать решение для такого запроса можно, задав сложную цель.

Задайте следующую сложную цель:

goal parent(Person, _), male(Person).

Сначала Пролог попытается решить подцель parent(Person, _) путем поиска соответствующего предложения и последующего связывания переменной Person со значением, возвращенным parent (Person — это родитель). Значение, возвращаемое parent, далее предоставляется второй подцели в качестве значения, с которым будет продолжен поиск: является ли Person — теперь это связанная переменная — мужского пола?

male(Person)

Если цель задана корректно, Пролог ответит:

Person=bill Person=joe 2 Solutions Комментарии Хорошим стилем программирования является включение в программу комментариев, объясняющих все то, что может быть непонятно кому-то другому. Рекомендуется подбирать подходящие имена для переменных, предикатов и доменов, раскрывающих их смысл.

Многострочные комментарии должны начинаться с символов /* (косая черта, звездочка) и завершаться символами */ (звездочка, косая черта). Для установки однострочных комментариев можно использовать либо эти же символы, либо начинать комментарий символом процента (%).

/* Это первый пример комментария */ % Это второй пример комментария /************************************* А эти три строчки — пример многострочного комментария *************************************/ Сопоставление (унификация) Ранее было показано, как Пролог "сопоставляет вопросы и ответы", "ищет сопоставление", "сопоставляет условия с фактами", "сопоставляет переменные с константами" и т.д. Ниже рассмотрим, что же понимается под термином сопоставление.

В Прологе имеется несколько примеров сопоставления одной вещи с другой.

Ясно, что идентичные структуры сопоставимы (сравнимы) друг с другом:

parent (joe, tammy) сопоставимо с parent (joe, tammy).

Однако сопоставление (сравнение) обычно использует одну или несколько свободных переменных. Например, если X свободна, то parent (joe,

X) сопоставимо с parent (joe, tammy) и X принимает значение (связывается с) tammy. Если же X уже связана, то она действует так же, как обычная константа. Таким образом, если X связана со значением tammy, то parent (joe, X) сопоставимо с parent (joe, tammy), но parent (joe, X) не сопоставимо с parent (joe, millie). В предыдущем примере сопоставление не выполняется, т.к. если переменная становится связанной, то ее значение не может изменяться.

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

Например:

parent(joe,X), parent(X,jenny) является корректной целью. Она означает: "Найти кого-либо, являющегося ребенком Joe и родителем Jenny". Здесь при достижении подцели parent (X, jenny) переменная X уже будет связана. Если для подцели parent (X, jenny) нет решений, Пролог "развяжет" переменную X и вернется назад, пытаясь найти новое решение для parent (joe, X), а затем проверит, будет ли "работать" parent (X, jenny) с новым значением X.

Две свободные переменные могут сопоставляться друг с другом. Например, parent (joe, X) сопоставляется с parent (joe, Y), связывая при этом переменные X и Y между собой. С момента "связывания" X и У трактуются как одна переменная, и любое изменение значения одной из них приводит к немедленному соответствующему изменению другой. В случае подобного "связывания" между собой нескольких свободных переменных все они называются совмещенными свободными переменными. Некоторые методы программирования специально используют "взаимосвязывание" свободных переменных, являющихся, на самом деле, различными.

В Прологе связывание переменных (со значениями) производится двумя способами: на входе и выходе. Направление, в котором передаются значения, указывается в шаблоне потока параметров (flow pattern). В дальнейшем (для краткости) будем опускать слово "шаблон" и говорить просто "поток параметров". Когда переменная передается в предложение, она считается входным аргументом и обозначается символом (i). Когда же переменная возвращается из предложения, она является выходным аргументом и обозначается символом (о) в потоке параметров.

Разделы Пролог-программы

Обычно программа на Прологе состоит из четырех основных программных разделов. К ним относятся:

раздел clauses (предложений);

раздел predicates (предикатов);

раздел domains (доменов);

раздел goal (целей).

Раздел clauses — это сердце программы; именно в этот раздет записываются факты и правила, которыми будет оперировать Пролог, пытаясь разрешить цель программы.

Раздел predicates — это тот, в котором объявляются предикаты и домены (типы) их аргументов.

Раздел domains служит для объявления своих доменов (типов данных).

Раздел goal — это тот, в который вы помещаете цель программы.

Раздел предложений В раздел clauses (предложений) последовательно размещаются факты и правила, составляющие вашу программу. Последовательность предложений, описывающих один предикат и сгруппированных по имени, называется процедурой.

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

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

Ниже представлен обобщенный синтаксис правила:

Заголовок :- Подцель, Подцель, …, Подцель.

Тело правила состоит из одной или более подцелей. Подцели разделяются запятыми, определяя конъюнкцию, а за последней подцелью правила следует точка.

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

Для успешного разрешения правила Пролог должен разрешить все его подцели и создать последовательный список переменных, должным образом связав их. Если же одна из подцелей ложна Пролог вернется назад для поиска альтернативы предыдущей подцели, а затем вновь двинется вперед, но уже с другими значениями переменных. Этот процесс называется поиск с возвратом.

В качестве разделителя заголовка и тела правила Пролог использует знак :-, который читается как "если" (if). Однако if Пролога отличается от if, написанного в других языках, например в Pascal, где условие, содержащееся в операторе if, должно быть указано перед телом оператора, который может быть выполнен.

Другими словами:

Если ЗАГОЛОВОК истинен, тогда ТЕЛО истинно (или: тогда выполнить ТЕЛО).

Данный тип оператора известен как условный оператор если/тогда (if/then).Пролог же использует другую форму логики в таких правилах.

Вывод об истинности заголовка правила Пролога делается, если (после того, как) тело этого правила истинно, например, так:

ЗАГОЛОВОК истинен, если ТЕЛО-истинно (или:если ТЕЛО может быть выполнено).

Учитывая вышесказанное, правило Пролога соответствует условной форме тогда/если (then/if).

Раздел предикатов Если в разделе clauses программы был описан собственный предикат, то вы обязаны объявить его в разделе predicates (предикатов). В результате объявления предиката указывается, к каким доменам (типам) принадлежат аргументы этого предиката.

Пролог имеет набор встроенных «системных» предикатов (их не нужно объявлять).

Предикаты задают факты и правила. В разделе же predicates все предикаты просто перечисляются с указанием типов (доменов) их аргументов.

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

predicateName(argument_type1 OptionalNamel, argument_type2 OptionalName2,..., argument_typeN OptionalName3) После каждого домена (типа) аргумента следует запятая, а после последнего типа аргумента — закрывающая (правая) скобка. Отметим, что, в отличие от предложений в разделе clauses, декларация предиката не завершается точкой. Доменами (типами) аргументов предиката могут быть либо стандартные домены, либо домены, объявленные в разделе domains. Можно указывать имена аргументов OptionalNameK — это улучшает читаемость программы.

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

Аргументы предикатов Аргументы предикатов должны принадлежать доменам, известным Прологу. Эти домены могут быть либо стандартными доменами, либо некоторыми из тех, что вы объявили в разделе доменов.

Рассмотрим такой пример.

Если предикат my_predicate(symbol, integer) объявлен в разделе predicates следующим образом:

predicates my_predicate(symbol, integer) то вам не нужно в разделе domains декларировать домены его аргументов, т. к. symbol и integer — стандартные домены.

Однако если этот же предикат вы объявляете так:

predicates my_predicate (name,number), то необходимо объявить, что name (символический тип) и number (целый тип) принадлежат к стандартным доменам symbol и integer:

domains name = symbol number = integer predicates my_predicate(name, number) Задание типов аргументов при декларации предикатов

Объявление доменов аргументов в разделе predicates называется заданием типов аргументов. Предположим, имеется следующая связь объектов:

Франк — мужчина, которому 45 лет.

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

person(frank, male, 45).

Для того, чтобы объявить person (человек), как предикат с этими тремя аргументами, вы можете разместить в разделе predicates следующую строку:

person(symbol, symbol, unsigned).

Здесь для всех трех аргументов использованы стандартные домены. Отныне всякий раз при работе с предикатом person, вы должны передавать ему три аргумента, причем первые два должны быть типа symbol, а третий — типа integer.

Если в программе используются только стандартные домены, то нет необходимости использовать раздел domain.

Или, предположим, что вы хотите описать предикат, который сообщал бы позицию буквы в алфавите, т.е. цель alphabet_position(Letter, Position) должна вернуть вам Position = 1, если Letter = a, Position = 2, если Letter =

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

alphabet_position(A_character, N).

Если при объявлении предиката используются только стандартные домены, то программе не нужен раздел domains. Предположим, что вы хотите описать предикат так, что цель будет истинна, если A_character является N-м символом алфавита.

Предложения этого предиката будут такими:

alphabet_position('а', 1).

alphabet_position('b', 2).

alphabet_position('с', 3).

… alphabet_position('z', 26).

Вы можете объявить данный предикат следующим образом:

predicates alphabet_position(char, unsigned) и тогда вам не будет нужен раздел domains.

Если разместить все фрагменты программы вместе, получим:

predicates alphabet_position(char, integer) clauses alphabet_position('a', 1).

alphabet_position('b', 2).

alphabet_position('с', 3).

% здесь находятся остальные буквы alphabet_position('z', 26).

Ниже представлено несколько простых целей, которые вы можете использовать:

alphabet_position('а', 1).

alphabet_position(X, 3).

alphabet_position('z', What).

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

Встроенные предикаты используются так же, как и определяемые пользователем предикаты. Единственное ограничение - встроенный предикат не может являться головой правила или появляться в факте.

Одним из наиболее часто используемых встроенных предикатов является предикат not (отрицание). Этот предикат истинен, если его аргумент ложен, и наоборот.

Другим часто используемым встроенным предикатом является = (унификация): =(X, Y). Этот предикат допускает более удобную форму записи X = Y.

Значение этого предиката истинно, если термы X и Y удается унифицировать.

Иногда бывает полезно использовать предикаты, про которые заранее известно, истинны они или ложны. Для этих целей используют предикаты true и fail. Предикат true всегда истинен, в то время как fail всегда ложен.

Встроенный предикат read позволяет считывать термы с клавиатуры.

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

Выполнение предиката nl осуществляет перевод строки: последующий вывод начнется с новой строки. Предикат tab выводит количество пробелов, определяемое его аргументом.

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

- программах объекты в отношениях (аргументы предикатов) принадлежат доменам, причем это могут быть как стандартные (Таблицы. 1.2, 1.3), так и описанные вами специальные домены. Раздел domains служит двум полезным целям. Во-первых, вы можете задать доменам осмысленные имена, даже если внутренне эти домены аналогичны уже имеющимся стандартным. Во-вторых, объявление специальных доменов используется для описания структур данных, отсутствующих в стандартных доменах.

–  –  –

domains name, sex = symbol age = integer predicates person(name, sex, age) Таблица 1.3 Дополнительные стандартные домены До- Описание мен Символ, реализуемый как беззнаковый byte. Синтаксически это Char символ заключенный между двумя одиночными кавычками: 'а' Число с плавающей запятой, реализуемое как 8 байт в соответReal ствии с соглашением IEEE; эквивалентен типу double в С.

Примеры действительных чисел (real):

42705…9999…86.72 9111.929437521е238…79.83е+21 Здесь 79.83е+21 означает 79.83x1021, как и в других языках.

Допустимый диапазон чисел: от 1x10-307 до 1x10+308(от 1е-307 до 1е+308).

При необходимости, целые автоматически преобразуются в real Последовательность символов, реализуемых как указатель на байstring товый массив, завершаемый нулем как в С.

Для строк допускается два формата:

1.Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой.

2.Последовательность символов, заключенных в двойные кавычки.

Примеры строк:

telephone_number “railway ticket” “Dorid Inc” Строки, которые вы пишете в программе, могут достигать длины в 255 символов Последовательность символов, реализуемых как указатель на вход symв таблице идентификаторов, хранящей строки идентификаторов.

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

Домены типов byte, word и dword наиболее удобны при работе с машинными числами. В основном используются типы integer и unsigned, а также short и long (и их беззнаковые аналоги) для более специализированных приложений.

В объявлениях доменов ключевые слова signed и unsigned могут использоваться вместе со стандартными доменами типов byte, word и dword для построения новых базовых доменов. Так:

domains 18 = signed byte создает новый базовый домен в диапазоне от -128 до +127.

Раздел цели По существу, раздел goal (цели) аналогичен телу правила: это просто список подцелей.

Цель отличается от правила лишь следующим:

за ключевым словом goal не следует :- ;

при запуске программы Пролог автоматически выполняет цель.

Если все подцели в разделе goal истинны, — программа завершается успешно. Если же какая-то подцель из раздела goal ложна, то считается, что программа завершается неуспешно.

Работа с числами на Прологе

–  –  –

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

Для сравнения арифметических выражений используется ряд операторов.

Цель X Y (больше) будет успешна, если выражение X будет соответствовать большему числу, чем выражение Y.

Аналогично используются операторы (меньше), = (меньше или равно), = (больше или равно), =\= (не равно) и =:= (арифметически равный). Различия между операторами =:= и = очень существенны. Первый оператор сравнивает значения арифметических выражений, тогда как последний пытается унифицировать их.

Пример решения логической задачи на Прологе

Рассмотрим такую задачу:

Для каждого из четырех сезонов года купили по паре туфель разного цвета – красного, синего, зеленого, желтого. Какую-то пару туфель носили зимой, какую-то - летом, какую-то – осенью, какую-то – весной.

Пару туфель какого цвета носили осенью, если известно, что:

1) желтые туфли носили не осенью и не зимой;

2) летом носили зеленые туфли;

3) осенью носили пару не красных туфель;

4) синие туфли носили не весной.

Аналитическим способом логические задачи могут решаться заполнением таблиц.

По условиям данной задачи, зеленые туфли носили летом – следует поставить символ '+' в соответствующей клетке; зеленые туфли носили не зимой, не весной и не осенью, желтые туфли носили не осенью и не зимой, красные туфли носили не осенью, синие туфли носили не весной – следует поставить символ '-' в соответствующих клетках. Между множеством туфель и множеством времен года должно быть установлено взаимнооднознач

–  –  –

Из построенной таблицы следует, что осенью носили синие туфли.

Листинг программы на Прологе:

% раздел доменов domains season=winter;summer;autumn;spring color=green;red;blue;yellow /* раздел предикатов */ predicates shoes(color).

wear(season,color).

notwear(season,color).

% раздел правил clauses shoes(green).

shoes(red).

shoes(blue).

shoes(yellow).

notwear(autumn,yellow).

notwear(winter,yellow).

notwear(autumn,red).

notwear(spring,blue).

wear(summer,green).

wear(autumn,X) :- shoes(X), not(notwear(autumn,X)), not(wear(summer,X)), nl,write("Autumn wear ",X," shoes"),nl.

/* раздел цели */ goal wear(autumn,X).

–  –  –

В этой работе Вы познакомитесь с языком программирования Лисп. Для работы будет использовать диалект Лиспа, известный как Common Lisp.

Название языка Лисп происходит из “list processing” (обработка списков).

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

Первая реализация языка Лисп 1 появилась в 1958 г. для машины IBM 704. Разработчиком языка стал доцент Массачусетского технологического института (MIT) Джон Маккарти. За период с 1958-1963 г Лисп претерпел некоторые изменения и дополнения. В 1963 г появляется версия Лисп 1.5 для машины IBM 7090. В этом виде Лисп стал стандартом. Однако широкое признание язык получил в начале 80-х годов. До этого времени он использовался в различных университетских исследовательских проектах.

В Лиспе формы представления программ и обрабатываемых ее данных одинаковы. И то и другое представляется списочной структурой, имеющей одинаковую форму. Таким образом, программы могут обрабатывать и преобразовывать другие программы и даже самих себя. Используемое в Лиспе, так называемое, функциональное программирование основывается на той простой идее, что в результате каждого действия возникает значение. Значения становятся аргументами следующих действий, и конечный результат всей задачи выдается пользователю. Функции также могут являться аргументами и возвращаться в качестве значений других функций.

Атомы и списки Основными типами данных языка Лисп являются атомы и списки.

Атомами являются символы и числа. В Лиспе используется много различных типов чисел. Символ – это имя, состоящее из букв, цифр и специальных знаков. Символы T и NIL имеют в Лиспе специальное значение. T обозначает логическое значение истина, а NIL – логическое значение ложь. Числа и логические значения T и NIL являются константами, остальные символы – переменными.

Список в Лиспе – это последовательность, элементами которой являются атомы либо списки (подсписки). Списки заключаются в круглые скобки, элементы списка разделяются пробелами.

Например,

– список из трех элементов (+ 2 3)

– список из четырех элементов (a b (c d) e) Список, в котором нет ни одного элемента, называется пустым списком и обозначается () или NIL.

Атомы и списки называются символьными выражениями или sвыражениями.

Функции В языке Лисп, как для вызова функций, так и для записи выражений принята префиксная форма записи, при которой как имя функции или действия, так и сами аргументы записываются внутри скобок.

Например, выражение 2 + 3 будет записано в Лиспе как (+ 2 3), а вызов функции f(x, g(y, x)) будет записан в Лиспе как (f x (g y z)).

Лисп содержит функцию quote или ’(апостроф), которая требует одного аргумента и возвращает этот аргумент без вычисления.

Основные функции обработки списков Функция car возвращает голову переданного в качестве аргумента списка (первый элемент списка называется головой, а остаток списка – хвостом).

Функция cdr возвращает хвостовую часть списка.

Функция nth возвращает элемент списка по его номеру. Эта функция получает два аргумента: первый – номер элемента в переданном в качестве аргумента списке (нумерация начинается с нуля); второй – сам список.

Функции first, second., third, … возвращают соответственно первый, второй, третий, … элементы переданного в качестве аргумента списка.

Функция last возвращает последний элемент списка.

Функция cons строит новый список из переданных ей в качестве аргументов головы и хвоста списка.

Функция list создает список из переданных ей в качестве элементов аргументов. Количество аргументов произвольно.

Диаграммы s-выражений Базовый элемент этих диаграмм называется списочной ячейкой (conscell). Списочная ячейка состоит из 2-х частей: полей CAR и CDR, т.е. частей, содержащих голову и хвост списка. Каждое из полей содержит указатель. Указатель может ссылаться на другую списочную ячейку или некоторый другой лисп-объект, например, атом.

Графически списочная ячейка представляется следующим образом:

Для представления списка используют одну списочную ячейку для каждого элемента списка. Первая часть ячейки заполняется именем атома, если элемент является атомом, или указателем на другой список, если элемент является списком. Вторая часть списочной ячейки содержит указатель на следующий элемент списка или знак \ (слэш), если этот элемент является последним элементом списка.

На рис.

1 приведено несколько примеров представления конструкций языка в виде диаграмм списочных ячеек:

(+ 3 5) + 3 5

–  –  –

Язык программирования Xlisp – версия широко известного языка Lisp, расширенная средствами объектно-ориентированного программирования.

Автором Xlisp является Д.М. Бетз, который реализовал XLISP, в качестве экспериментального языка программирования и разрешил его свободное некоммерческое использование. В настоящее время Xlisp свободно распространяется по глобальным некоммерческим компьютерным сетям.

Синтаксис языка Xlisp в основном следует диалекту Common Lisp. Язык Lisp стал наиболее популярным среди специалистов по искусственному интеллекту в США, где в качестве стандарта получил распространение Common Lisp.

Среда интерпретатора Xlisp достаточно проста и не требует дополнительных описаний. Для начала работы достаточно запустить файл XLISP.EXE в папке BIN.

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

Это означает, что интерпретатор ждет выражения, набираемого на клавиатуре. Если набрано незавершенное выражение, в котором количество открывающих скобок не соответствует количеству закрывающих скобок, интерпретатор ждет необходимые скобки.

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

Выполнение работы:

Лисп обычно используется в режиме интерпретации. Интерпретатор Лиспа функционирует следующим образом: когда пользователь заканчивает ввод какого-либо выражения, интерпретатор вычисляет и выдает значение этого выражения. Рассмотрим простейший пример.

Введите в окне Xlisp следующее выражение и нажмите клавишу enter:

Мы ввели число 3, которое является атомом и, следовательно, sвыражением. Интерпретатор Лиспа вычисляет значение этого s-выражения и выдает результат. Он совпадает с введенным выражением, поскольку значением числа является само это число.

Введем следующее выражение:

(+ 2 5) ; s-выражение ; результат При вычислении s-выражений интерпретатор Лиспа следует следующим правилам:

1. Если s-выражение число, то значением этого выражения является само это число.

2. Если s-выражение список, то значения всех аргументов, исключая первый, вычисляются, а затем передаются как аргументы в функцию, обозначенную первым символом.

Например, при вычислении значения выражения (* (+ 1 2) (- 4 3)) интерпретатор вначале вычислит значения первого и второго аргументов функции «*». Первый и второй аргументы являются списками. В каждом из этих списков аргументы являются числами. Значением числа является само это число. Числа 1 и 2 передаются в качестве аргументов в функцию «+». Числа 4 и 3 передаются в качестве аргументов в функцию «-». Затем результаты вычисления первого и второго выражений (3 и 1) передаются в качестве аргументов в функцию «*».

Пока что мы не рассмотрели как вычисляются s-выражения, которые являются символами. Если мы зададим следующее символьное выражение, то получим сообщение об ошибке.

A Error: unbound variable A Символы можно использовать как переменные. В этом случае они могут обозначать некоторые выражения. У символов изначально нет какого-нибудь значения как у констант. В нашем примере интерпретатор не может вычислить значение символа, поскольку его у символа нет.

Свяжем переменную A с каким-либо значением, используя функцию setf:

(setf A 3)

Теперь, когда мы связали значение с переменной A, интерпретатор позволит нам вычислить значение s-выражение:

A

Мы можем использовать переменную A в более сложном s-выражении:

(+ A A) Рассмотрим еще несколько примеров применения описанных выше функций:

‘(+ 2 5) (+ 2 5) Обратите внимание на использование функции quote, которая просто возвращает переданный ей аргумент. Аналогом функции quote является символ ’.

’(+ 2 5) (+ 2 5) (+ 2 5)

–  –  –

ПРАКТИЧЕСКАЯ РАБОТА № 4 Тема: «Технология программирования для ИИ на языке CLIPS»

Цель работы: изучить технологию программирования для искусственного интеллекта на языке CLIPS.

Дидактический материал: плакаты, раздаточный материал.

Основные теоретические положения:

Название языка CLIPS — аббревиатура от С Language Integrated Production System. Язык был разработан в Центре космических исследований NASA (NASA's Johnson Space Center) в середине 1980-х годов и во многом сходен с языками, созданными на базе LISP, в частности OPS5 и ART. Использование С в качестве языка реализации объясняется тем, что компилятор LISP не поддерживается частью распространенных платформ, а также сложностью интеграции LISP-кода в приложения, которые используют отличный от LISP язык программирования. Хотя в то время на рынке уже появились программные средства для задач искусственного интеллекта, разработанные на языке С, специалисты из NASA решили создать такой продукт самостоятельно. Разработанная ими система в настоящее время доступна во всем мире, и нужно сказать, что по своим возможностям она не уступает множеству гораздо более дорогих коммерческих продуктов.

Первая версия представляла собой, по сути, интерпретатор порождающих правил. Процедурный язык и объектно-ориентированное расширение CLIPS Object-Oriented Language (COOL) были включены в этот программный продукт только в 1990-х годах. Существующая в настоящее время версия может эксплуатироваться на платформах UNIX, DOS, Windows и Macintosh. Она является хорошо документированным общедоступным программным продуктом и доступна по сети FTP с множества университетских сайтов. Исходный код программного пакета CLIPS распространяется совершенно свободно и его можно установить на любой платформе, поддерживающей стандартный компилятор языка С. Однако я бы рекомендовал пользоваться официальной версией для определенной платформы, поскольку такие версии оснащены пользовательским интерфейсом, включающим меню команд и встроенный редактор.

Это Приложение организовано следующим образом. В разделе А.2 рассмотрены основные функции языка описания правил и процедурного языка. В разделе А.З представлены методы работы с объектами и показано, как использовать их в сочетании с правилами и процедурами. В разделе А.4 описан пример, демонстрирующий некоторые приемы программирования правил, а в разделе А.5 резюмируются характеристики этого программного продукта и предлагаются темы для более углубленного изучения.

–  –  –

CLIPS включает в язык представления порождающих правил и язык описания процедур.

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

Основными компонентами языка описания правил являются база фактов (fact base) и база правил (rule base).

На них возлагаются следующие функции:

–  –  –

Машина логического вывода CLIPS сопоставляет эти факты и правила и выясняет, какие из правил можно активизировать.

Это выполняется циклически, причем каждый цикл состоит из трех шагов:

(1) сопоставление фактов и правил;

(2) выбор правила, подлежащего активизации;

(3) выполнение действий, предписанных правилом.

Такой трехшаговый циклический процесс иногда называют "циклом распознавание— действие" (см. главу 5).

–  –  –

В режиме интерпретатора пользователь может использовать множество команд. Факты можно включить в базу фактов прямо из командной строки с помощью команды assert, например:

CLIPS (assert (today is Sunday))

–  –  –

Для лучшего восприятия текста Приложения мы в дальнейшем будем выделять текст, вводимый пользователем, полужирным шрифтом, а запросы и ответы интерпретатора — обычным моноширинным шрифтом.

Для вывода списка фактов, имеющихся в базе, используется команда facts:

CLIPS (facts) f-0 (today is Sunday) f-1 (weather is warm) В последних версиях CLIPS, в частности, в той, которая работает в операционной среде Windows, такие команды, как facts, можно вызывать с помощью меню. Для удаления фактов из базы используется команда retract.

CLIPS (retract 1) CLIPS (facts) f-0 (today is Sunday) Эти же команды, assert и retract, используются в выполняемой части правила (заключении правила) и с их помощью выполняется программное изменение базы фактов. Часто приходится пользоваться и другой командой интерпретатора, clear, которая очищает базу фактов (как правило, эта команда доступна в одном из выпадающих меню).

CLIPS (clear) CLIPS (facts) В тексте программы факты можно включать в базу не по одиночке, а целым массивом. Для этого в CLIPS имеется команда deffacts.

(deffacts today (today is Sunday) (weather is warm) ) Выражение deffacts имеет формат, аналогичный выражениям в языке LISP.

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

Этот массив фактов можно затем удалить из базы командой undef facts.

CLIPS (undeffacts today)

Выражение def facts можно вводить и в командную строку интерпретатора, но лучше записать его в текстовый файл с помощью редактора CLIPS или любого другого текстового редактора. Загрузить этот файл в дальнейшем можно с помощью команды в меню File либо из командной строки.

CLIPS (load "my file") Однако после загрузки файла факты не передаются сразу же в базу фактов CLIPS. Команда deffacts просто указывает интерпретатору, что существует массив today, который содержит множество фактов. Собственно загрузка выполняется командой reset.

CLIPS (reset) Команда reset сначала очищает базу фактов, а затем включает в нее факты из всех ранее загруженных массивов.

Она также добавляет в базу единственный системно определенный факт:

f-0 (initial-fact) Это делается по умолчанию, поскольку иногда имеет смысл включить в программу правило start rule, которое может быть сопоставлено с этим фактом и позволит выполнить какие-либо нестандартные инициализирующие операции. Однако включать такое правило в программу или нет — дело программиста.

Можно проследить, как выполняется команда reset, если перед выполнением приведенных выше команд установить режим слежения среды разработки.

Для этого нужно вызвать команду Watch из меню Execution и установить в ней флажок Facts.

–  –  –

В языке CLIPS правила имеют следующий формат:

(defrule имя правила необязательный комментарий необязательное объявление предпосылка_1

–  –  –

Например:

(defrule chores "Things to do on Sunday" (salience 10) (today is Sunday) (weather is warm) = (assert (wash car)) (assert (chop wood) ) В этом примере Chores — произвольно выбранное имя правила. Предпосылки в условной части правила (today is Sunday) (weather is warm) сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =), вставят в базу два факта (wash car) (chop wood) в случае, если правило будет активизировано. Приведенный в тексте правила комментарий "Things to do on Sunday" "Что сделать в воскресенье" поможет в дальнейшем вспомнить, чего ради это правило включено в программу. Выражение (salience 10) указывает на степень важности правила. Пусть, например, в программе имеется другое правило (defrule fun "Better things to do on Sunday" (salience 100) (today is Sunday) (weather is warm) = (assert (drink beer)) (assert (play guitar)) ) Поскольку предпосылки обоих правил одинаковы, то при выполнении оговоренных условий они будут "конкурировать" за внимание интерпретатора.

Предпочтение будет отдано правилу, у которого параметр salience имеет более высокое значение, в данном случае — правилу fun. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000].

Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.

Обычно в определении правила присутствуют и переменные. Если, например, правило (defrule pick-a-chore "Allocating chores to days" (today is ?day) (chore is ?job) = (assert (do ?job on ?day)) ) будет сопоставлено с фактами (today is Sunday) (chore is carwash) то в случае активизации оно включит в базу новый факт (do carwash on Sunday).

Аналогично, правило (defrule drop-a-chore "Allocating chores to days" (today is ?day) ?chore - (do ?job on ?day) = (retract ?chore) ) отменит выполнение работ по дому (a chore). Обратите внимание на то, что оба экземпляра переменной ?day должны получить одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся (today is Sunday) (do carwash on Sunday) то при активизации правила из базы будет удален факт (do carwash on Sunday) С подробностями выполнения процесса сопоставления в интерпретаторе CLIPS вы сможете познакомиться в Руководстве пользователя, а здесь только отметим, что факт (do carwash on Sunday) будет сопоставлен с любым из представленных ниже образцов

–  –  –

(do $? Sunday) (do ?chore $?when) Учтите, что префикс $? является признаком сегментной переменной, которая будет связана с сегментом списка. Например, в приведенном выше примере переменная $?when будет связана с (on Sunday) Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.

–  –  –

Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.

(defrule start (initial-fact) (printout t "hello, world" crlf) ) Выполните команду reset. Для этого либо введите эту команду в командной строке интерпретатора CLIPS (reset) либо выберите в меню команду Execution = Reset, либо нажмите CTRL+U (последних два варианта возможны в версии, которая работает под Windows).

Затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора CLIPS (run) либо выберите в меню команду ExecutionORun, либо нажмите CTRL+R (последних два варианта возможны в версии, которая работает под Windows).

В ответ программа должна вывести сообщение hello, world, знакомое всем программистам мира. Для повторного запуска программы повторите команды reset и run.

Если в меню Execution^Watch ранее был установлен флажок Rules или перед запуском программы на выполнение вы ввели в командную строку команду watch rules, то на экране появится результат трассировки процесса выполнения CLIPS (run) FIRE 1 start: f-0 hello, world В этом сообщении в строке, начинающейся с FIRE, выведена информация об активизированном правиле: start— это имя правила, а f-0— имя факта, который "удовлетворил" условие в этом правиле. Команда watch позволяет организовать несколько разных режимов трассировки, с деталями которых вы можете познакомиться в Руководстве пользователя. Если перед запуском программы вы ввели CLIPS (dribble-on "dribble.dp")

–  –  –

Для определения фактов можно использовать не только списочные структуры, но и шаблоны, которые напоминают простые записи.

(Шаблоны в CLIPS не имеют ничего общего с шаблонами C++.) Шаблон выглядит примерно так:

(deftemplate student "a student record" (slot name (type STRING)) (slot age (type NUMBER) (default 18)) Каждое определение шаблона состоит из произвольного имени шаблона, необязательного комментария и некоторого количества определений слотов.

Слот включает поле данных, например name, и тип данных, например STRING.

Можно указать и значение по умолчанию, как в приведенном выше примере.

Если в программу включено приведенное выше определение шаблона, то выражение (deffacts students (student (name fred)) (student (name freda) (age 19)) ) приведет к тому, что в базу фактов после выполнения команды reset будет добавлено (student (name fred) (age 18)) (student (name freda) (age 19))

–  –  –

В языке CLIPS функции конструируются примерно так же, как в языке LISP (см. главу 4). Существенное отличие состоит в том, что переменные должны иметь префикс ?, как это показано в приведенном ниже определении.

(deffunction hypotenuse (?a ?b)

–  –  –

Формат определения функции в CLIPS следующий:

(deffunction имя функции (аргумент... аргумент) выражение выражение ) Функция возвращает результат последнего выражения в списке. Иногда выполнение функции имеет побочные эффекты, как в приведенном ниже примере.

(deffunction init (?day)

–  –  –

(assert (today is ?day)) ) В результате после запуска функции на выполнение командой CLIPS (init Sunday) будет выполнена команда reset и, следовательно, очищена база фактов, а затем в нее будет включен новый факт (today is Sunday).

–  –  –

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

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

(defclass pistol (is-a USER) (role concrete) (pattern-match reactive) (slot safety (type SYMBOL) (create-accessor read-write)) (slot slide (type SYMBOL) (create-accessor read-write)) (slot hammer (type SYMBOL) (create-accessor read-write)) (slot chamber (type INTEGER) (create-accessor read-write)) (slot magazine (type SYMBOL) (create-accessor read-write)) (slot rounds (type INTEGER) (create-accessor read-write)) ) Первые три слота — системные. Они нужны объектно-ориентированной надстройке CLIPS (COOL — CLIPS object-oriented language). Эти слоты COOL извещают о том, что

–  –  –

pistol является конкретным классом, т.е. возможно создание экземпляров этого класса (альтернативный тип — абстрактный класс, который играет ту же роль, что и виртуальный класс в C++);

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

Следующие пять слотов представляют свойства и члены данных класса:

слот safety (предохранитель) может содержать символ on или off;

слот slide (затвор) может содержать значение forward или back, т.е.

хранит информацию о положении затвора;

слот hammer (курок) содержит информацию о состоянии курка, back или down;

слот chamber (патронник) содержит значение 1 или 0, в зависимости от того, есть ли патрон в патроннике;

слот magazine (обойма) может содержать значение in или out, в зависимости от того, вставлена ли обойма;

слот rounds (патроны) содержит текущее количество патронов в обойме.

Для того чтобы иметь возможность записывать в слот новое значение или считывать текущее, нужно разрешить формирование соответствующих функций доступа через фацет create-accessor. Теперь сформируем экземпляр класса

pistol с помощью следующего выражения:

(definstances pistols (РРК of pistol (safety on) (slide forward) (hammer down) (chamber 0) (magazine out) (rounds 6) Этот экземпляр, РРК, правильно уложен — обойма вынута из рукоятки, пистолет установлен на предохранитель, затвор в переднем положении, курок опущен, а патронник пуст. В обойме имеется 6 патронов.

Теперь, имея в программе определение класса и сформировав экземпляр класса, разработаем правила и обработчики сообщений, с помощью которых можно описать отдельные операции обращения с пистолетом и стрельбы из него. Для этого сначала разработаем шаблон задачи.

Желательно отслеживать две вещи:

–  –  –

Для этого можно использовать следующий шаблон:

(deftemplate range-test (field check (type SYMBOL) (default no)) (field fired (type SYMBOL) (default no)) ) Первое правило будет устанавливать в рабочую память программы задачу range-test.

(defrule start (initial-fact) = (assert (range-test)) ) При активизации этого правила в рабочую память будет добавлено (rangetest (check no) (fired no)) Следующие три правила будут проверять, правильно ли снаряжен пистолет.

(defrule check (object (name [PPK]) (safety on) (magazine out) ?T - (range-test (check no)) = (send [PPK] clear) (modify ?T (check yes) ) Правило check заключается в том, что если пистолет стоит на предохранителе (safety on), обойма вынута (magazine out) и пистолет не был проверен, то нужно очистить патронник и проверить, нет ли в нем патрона. Обработчик сообщения clear для класса pistol будет выглядеть следующим образом:

(defmessage-handler pistol clear ( ) (dynamic-put chamber 0) (ppinstance) ) В первой строке объявляется, что clear является обработчиком сообщения для класса pistol, причем этот обработчик не требует передачи аргументов.

Оператор во второй строке "очищает" патронник. Присвоение выполняется независимо от того, какое текущее значение имеет слот chamber, — 0 или 1.

Оператор в третьей строке требует, чтобы экземпляр распечатал информацию о текущем состоянии своих слотов.

В следующих двух правилах обрабатываются ситуации, когда пистолет снаряжен неправильно, — не установлен на предохранитель или в него вставлена обойма. Правило correctl устанавливает пистолет на предохранитель, а правило correct2 извлекает из него обойму.

(defrule correctl (object (name [PPK]) (safety off) ) (range-test (check no)) = (send [PPK] safety on) ) (defrule correct2 (object (name [PPK]) (safety on) (magazine in)) (range-test (check no)) = (send [PPK] drop) ) Как и при разработке предыдущего правила, нам понадобятся обработчики сообщений safety и drop.

(defmessage-handler pistol safety (?on-off) (dynamic-put safety ?on-off) (if (eq ?on-off on) then (dynamic-put hammer down) )) Обработчик сообщения safety принимает единственный аргумент, который может иметь только два символических значения on или off. В противном случае нам пришлось бы разработать два обработчика: один для сообщения saf etyon, а другой — для сообщения safety-of f. Учтите, что в некоторых моделях, например в Walther PPK, при установке пистолета на предохранитель патронник очищается автоматически.

Обработчик сообщения drop просто извлекает обойму из пистолета.

(defmessage-handler pistol drop () (dynamic-put magazine out) ) Теперь, когда обеспечено правильное исходное снаряжение пистолета, можно приступить к стрельбе. Следующее правило обеспечивает вставку обоймы в пистолет перед стрельбой:

(defrule mag-in (object (name [PPK]) (safety on) (magazine out)) (range-test (fired no) (check yes)) = (send [PPK] seat) ) Обработчик сообщения seat выполняет действия, противоположные тем, которые выполняет обработчик drop.

(defmessage-handler pistol seat () (dynamic-put magazine in) ) Можно было бы, конечно, включить в программу и следующее правило

mag-in:

(defrule mag-in ?gun - (object (name [PPK]) (safety on) (magazine out)) (range-test (fired no) (check yes)) = (modify ?gun (magazine in) ) но это противоречит одному из принципов объектно-ориентированного программирования, который гласит, что объект должен самостоятельно обрабатывать содержащиеся в нем данные. Следующее правило обеспечивает снаряжение обоймы патронами:

(defrule load (object (name [PPK]) (magazine in) (chamber 0)) = (send [PPK] rack) ) На примере обработчика сообщения rack вы можете убедиться в справедливости нашего замечания о том, что обработку данных внутри объекта нужно поручать методам этого объекта, а не включать прямо в правило.

(defmessage-handler pistol rack () (if ( (dynamic-get rounds) 0) then (dynamic-put chamber 1) (dynamic-put rounds (- (dynamic-get rounds) 1)) (dynamic-put slide forward) else (dynamic-put chamber 0) (dynamic-put slide back) В этом обработчике обеспечивается досылка патрона в патронник в том случае, если в обойме имеются патроны. Следующее правило подготавливает пистолет к стрельбе, снимая его с предохранителя. Обратите внимание на то, что в нем повторно используется сообщение safety, но на этот раз с аргументом off.

(defrule ready (object (name [PPK]) (chamber 1)) = (send [PPK] safety off) ) Правило fire выполняет стрельбу.

(defrule fire (object (name [PPK]) (safety off);

?T - (range-test (fired no)) = (if (eq (send [PPK] fire) TRUE) then (modify ?T (fired yes))) ) Обратите внимание, что в данном правиле используется обработчик сообщения, которое возвращает значение. Анализируя его, можно выяснить, произведен ли выстрел, т.е. выполнена ли в действительности та операция, которая "закреплена" за этим сообщением. Если в патроннике был патрон и пистолет был снят с предохранителя, то обработчик сообщения вернет значение TRUE (после того, как выведет на экран BANG ! ). В противном случае он вернет FALSE (после того, как выведет на экран click).

(def message-handler pistol fire () (if (and (eq (dynamic-get chamber) 1) (eq (dynamic-get safety) off) ) then (printout t crlf "BANG!" t crlf)

–  –  –

else (printout t crlf "click" t crlf) FALSE ) Пусть вас не смущает, что в обработчике сообщения анализируется условие, которое уже было проанализировано правилом, отославшим сообщение (в данном случае речь идет об условии safety off). Дело в том, что одно и то же сообщение может отсылаться разными правилами и нет никакой гарантии, что в каждом из них будет проверяться это условие.

После завершения стрельбы пистолет нужно вновь вернуть в положение "по-походному". Начинается это с того, что пистолет устанавливается на предохранитель, для чего используется ранее разработанный обработчик сообщения safety.

(defrule unready (object (name [PPK]) (safety off)) (range-test (fired yes)) = (send [PPK] safety on) ) Следующая операция — вынуть обойму. Обратите внимание, что в нем мы вновь обращается к обработчику сообщения drop.

(defrule drop (object (name [PPK]) (safety on)) (range-test (fired yes)) = (send [PPK] drop) ) Последнее правило выбрасывает патрон из патронника, вызывая обработчик сообщения clear.

(defrule unload (object (name [PPK]) (safety on) (magazine out)) (range-test (fired yes)) = (send [PPK] clear) ) В этом примере было продемонстрировано, как в рамках единой CLIPS программы "уживаются" правила и объекты. Правила управляют ходом вычислений, но некоторые операции объекты выполняют и самостоятельно, получив "указание" (сообщение) от правил. Объекты не являются резидентами рабочей памяти, но члены левой части правил (условий) могут быть сопоставлены с содержимым их слотов. Состояние объектов может измениться и вследствие побочных эффектов активизации правил, но я считаю, что лучше предоставить объектам возможность самостоятельно выполнять манипуляции с хранящимися в них данными в ответ на поступающие от правил сообщения. Объекты не могут самостоятельно активизировать правила, но их обработчики сообщения могут возвращать определенную информацию о результатах, которая используется для управления логикой выполнения действий в правой части правил.

ПРАКТИЧЕСКАЯ РАБОТА № 5 Тема: «Изучение методов формализации интеллектуальных задач»

Цель работы: изучить основные методы формализации интеллектуальных задач.

Дидактический материал: плакаты, раздаточный материал.

Основные теоретические положения:

На этапе формализации базы знаний осуществляется выбор метода представления знаний. В рамках выбранного формализма осуществляется проектирование логической структуры базы знаний.

Рассмотрим классификацию методов представления знаний с точки зрения особенностей отображения различных видов концептуальных моделей, а именно: соотношения структурированности и операционности, детерминированности и неопределенности, статичности и динамичности знаний.

Так, объектные методы представления знаний в большей степени ориентированы на представление структуры фактуального знания, а правила - операционного.

• Логическая модель реализует и объекты, и правила с помощью предикатов первого порядка, является строго формализованной моделью с универсальным дедуктивным и монотонным методом логического вывода "от цели к данным";

• Продукционная модель позволяет осуществлять эвристические методы вывода на правилах и может обрабатывать неопределенности в виде условных вероятностей или коэффициентов уверенности, а также выполнять монотонный или немонотонный вывод;

• Семантическая сеть отображает разнообразные отношения объектов;

• Фреймовая модель, как частный случай семантической сети, использует для реализации операционного знания присоединенные процедуры;

• Объектно-ориентированная модель, как развитие фреймовой модели, реализуя обмен сообщениями между объектами, в большей степени ориентирована на решение динамических задач и отражение поведенческой модели.

Логическая модель представления знаний

Логическая модель предполагает унифицированное описание объектов и действий в виде предикатов первого порядка. Под предикатом понимается логическая функция на N - аргументах (признаках), которая принимает истинное или ложное значение в зависимости от значений аргументов. Отличие заключается в том, что для объектов соответствующие реляционные отношения задаются явно в виде фактов, а действия описываются как правила, определяющие логическую формулу вывода фактов из других фактов. Пример фрагмента базы знаний подбора претендентов на вакансии в языке логического программирования ПРОЛОГ представлен на рис. 2.4. (Обозначения: ":-" - "если", "," - "и", "." - "конец утверждения").

vibor(Fio, Dolgnost):

- pretendent(Fio, Obrazov, Stag), vacancy(Dolgnost, Obrazov, Opyt), Stag=Opyt.

pretendent(”HeaHoe”, ”среднее” 10).

pretendent(”nempoe”, уасапвысшее", 12).

су(”менеджер”, "высшее", 10).

уасапсу(”директор”, "высшее”, 15).

Механизм вывода осуществляет дедуктивный перебор фактов, относящихся к правилу по принципу "сверху - вниз", "слева - направо" или обратный вывод методом поиска в глубину. Так, в ответ на запрос vibor(X,Y) получим: X="Петров", Y-’менеджер".

Правила могут связываться в цепочки в результате использования одинакового предиката в посылке одного и в заключении другого правила.

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

Продукционные модели представления знаний

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

В продукционной модели основной единицей знаний служит правило в виде:

- "если посылка, то заключение", с его помощью выражены:

• пространственно-временные,

• причинно-следственные,

• функционально-поведенческие (ситуация - действие) отношения объектов.

Правилами могут быть описаны и сами объекты: "объект - свойство" или "набор свойств - объект", хотя чаще объекты описывают только в качестве переменных ("атрибут - значение") внутри правил.

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

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

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

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

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

Такая стратегия поиска решений называется поиском в ширину.

Для ее реализации в описание продукций вводятся предусловия и постусловия в виде:

A, B, C - D, E, где

- импликация С - D представляет собственно правило;

- А - предусловие выбора класса правил;

- B - предусловие выбора правила в классе;

- Е - постусловие правила, определяющее переход на следующее правило.

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

Сами правила могут иметь как простой, так и обобщенный характер.

Простые правила описывают продукции над единичными объектами, обобщенные правила определяются на классах объектов (аналогично правилам языка ПРОЛОГ).

Для обработки неопределенностей знаний продукционная модель использует, как правило, либо методы обработки условных вероятностей Байеса, либо методы нечеткой логики Заде.

Байесовский подход предполагает начальное априорное задание предполагаемых гипотез (значений достигаемых целей), которые последовательно уточняются с учетом вероятностей свидетельств в пользу или против гипотез, в результате чего формируются апостериорные вероятности:

P(H/E) = P(E/H)*P(H)/P(E) и P(AH/E) = P(E/A H)*P(AH)/P(E), где Р(Н) априорная вероятность гипотезы Н;

Р(АН) = 1 - Р(Н) - априорная вероятность отрицания гипотезы Н;

Р(Е) - априорная вероятность свидетельства Е;

Р(Н/Е) - апостериорная (условная) вероятность гипотезы Н при условии, что имеет место свидетельство Е;

Р(АН/Е) - апостериорная (условная) вероятность отрицания гипотезы Н при условии, что имеет место свидетельство Е;

Р(Е/Н) - вероятность свидетельства гипотезы Е при подтверждении гипотезы Н;

Р(Е/АН) - вероятность свидетельства гипотезы Е при отрицании гипотезы Н. Найдем отношения левых и правых частей представленных уравнений:

P(H/E) / P(AH/E) = (P(E/H) / P(E/A H)) * (P(H) / P(AH)) или О(Н/Е) = Ls * О(Н) где

- О(Н) - априорные шансы гипотезы Н, отражающие отношение числа позитивных проявлений гипотезы к числу негативных;

- О(Н/Е) - апостериорные шансы гипотезы Н при условии наличия свидетельства Е;

- Ls - фактор достаточности, отражающий степень воздействия на шансы гипотезы при наличии свидетельства Е.

Аналогично выводится зависимость:

О(Н/АЕ) = Ln * О(Н), где - О(Н/Е) - апостериорные шансы гипотезы Н при условии отсутствия свидетельства Е;

- Ln - фактор необходимости, отражающий степень воздействия на шансы гипотезы при отсутствии свидетельства Е.

Шансы и вероятности связаны уравнениями:

О = Р / (1 - Р) и Р = О / (О + 1) Отсюда апостериорная вероятность гипотезы рассчитывается через апостериорные шансы, которые в свою очередь получаются перемножением априорных шансов на факторы достаточности или необходимости всех относящихся к гипотезе свидетельств в зависимости от их подтверждения или отрицания со стороны пользователя. Свидетельства рассматриваются как независимые аргументы на дереве целей.

Рассмотрим использование байесовского подхода на примере оценки надежности поставщика. Фрагмент подмножества правил представляется следующим образом:

Если Задолженность = "есть", То Финансовое_состояние = "удовл." Ls = 0.01, Ln = 10 Если Рентабельность = "есть", То Финансовое_состояние = "удовл." Ls = 100, Ln = 0.001

Пусть оцениваемое предприятие является рентабельным и без задолженностей. Априорная вероятность удовлетворительного финансового состояния любого поставщика составляет 0.5. Тогда расчет апостериорных шансов и вероятности удовлетворительного финансового состояния осуществляется по формулам:

О(Н/Е1,Е2) = 1 * 10 * 100 = 1000;Р(Н/Е1,Е2) = 1000 /1001 = 0.99.

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

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

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

Факторы уверенности измеряются по некоторой относительной шкале, например, от 0 до 100. В отличие от теории вероятностей сумма факторов уверенностей некоторых альтернативных значений необязательно составляет 100. Множество возможных значений некоторой переменной с различными факторами уверенностей для каждого значения составляет нечеткое множество вида: { x1 cf1, x2 cf2,..., xN cfN }, причем фактор уверенности в общем виде задается функцией принадлежности значений нечеткому множеству, например, как представлено на рис.

2.5. (Например, для рентабельности 6,7% получаем оценку в виде нечеткого множества {"неудовлетворительно" cf 66, "удовлетворительно" cf 33}).

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

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

Конъюнкция (А и В) : min (cfA, cfB) или cfA*cfB/100 Дизъюнкция (А или В): max (cfA, cfB) или cfA + cfB - cfA*cfB/100 Объединение факторов уверенности в посылках правил осуществляется чаще всего, как например, в программном средстве GURU, по формулам "min/max", а левых и правых частей правил и одинаковых результатов нескольких правил соответственно по формулам "произведение" и "сумма". Для объединения одинаковых результатов нескольких правил используется оператор "+=", который означает не присваивание значения, а добавление значения. Аналогично используется оператор "для удаления значения.

Факторы уверенности в последнем случае объединяются по формуле:

cfA*(100 - cfB)/100 Рассмотрим применение аппарата нечеткой логики на примере оценки надежности поставщика, в котором кроме фактора финансового состояния учитывается и фактор формы собственности. Пусть государственное предприятие не имеет задолженность с уверенностью 60 и предполагается, что его рентабельность удовлетворительна с уверенностью 80.

Фрагмент множества правил имеет следующий вид:

Правило 1: Если Задолженность = ”нет” и Рентабельность = ”удовл. " То Финансовоесостояние = ”удовл. " cf 100 Правило 2: Если Финансовоесостояние = ”удовл. " То Надежность += "есть " cf 90 Правило 3: Если Предприятие = ",государств. " То Надежность+ = "есть ” cf 50 Результат выполнения первого правила: cf^^mm.) = min(60,80) = 60, cf(Фин_сост. = "удовл.") = 60*100/100 = 60.

Результат выполнения второго правила: cf(Надежность="есть") = 60*90/100 = 54 Результат выполнения третьего правила: cf(Надежность="есть") = 54 + 50 - 54*50/100 = 67

Динамические модели представления знаний

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

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

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

"Всякий раз, как происходит некоторое событие, выполнить некоторое действие". Например:

Всякий раз, как становится известным значение переменной "Поставщик", Выполнить набор правил "Финансовый анализ предприятия"

В программном средстве GURU подобное правило будет записано следующим образом:

IF: KNOWN("Поставщик") = true THEN: CONSULT F I N AN Для динамических экспертных систем характерна также обработка времени как самостоятельного атрибута аргументации логического вывода:

Если в течение дня уровень запаса понизился больше, чем на 50 % То выполнить набор правил "Выбор поставщика для поставки" Общим недостатком всех формализмов представления знаний, основанных на правилах, является недостаточно глубокое отражение семантики проблемной области, что может сказываться на гибкости формулирования запросов пользователей к экспертным системам. Этот недостаток снимается в объектно-ориентированных методах представления знаний.

Семантические сети - представление знаний

Объектно-ориентированные методы представления знаний берут начало от семантических сетей, в которых типизируются отношения между объектами. Элементарной единицей знаний в семантической сети служит триплет (см. объектную концептуальную модель), в котором имя предиката представляет помеченную дугу между двумя узлами графа, соответствующими двум связанным объектам (рис.

2.6):

Важнейшими типизированными отношениями объектов являются:

"Род" - "Вид", "Целое" - "Часть", "Причина" - "Следствие", "Средство" - "Цель", "Аргумент" - "Функция", "Ситуация" - "Действие".

Типизация отношений позволяет однозначно интерпретировать смысл отображаемых в базе знаний ситуаций и настраивать механизм вывода на особенности этих отношений. Так, отображение отношений "Род" - "Вид" дает возможность осуществлять наследование атрибутов классов объектов и, таким образом, автоматизировать процесс вывода заключений от общего к частному.

ПРАКТИЧЕСКАЯ РАБОТА № 6 Тема: «Изучение оболочек экспертных систем»

Цель работы: изучить основные оболочки для создания ЭС.

Дидактический материал: плакаты, раздаточный материал.

Основные теоретические положения:

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

Экспертные системы — это системы искусственного интеллекта, предназначенные для решения задач в проблемных областях, на основе заложенных в них знаний специалистов-экспертов. В настоящее время ЭС внедряются в различные виды человеческой деятельности, где использование точных математических методов и моделей затруднительно. Такой трудно формализуемой задачей является определение неполадок в компьютерной лаборатории. Так как в лабораториях университета функционирует несколько информационных систем и лаборанты часто меняются, то возникают проблемы быстрого реагирования на запросы преподавателей, устранения мелких неисправностей в компьютерной сети, настройки программ. Для решения рассматриваемой задачи было предложено разработать простую систему оказания консультативной помощи новым или неопытным сотрудникам лаборатории.

Класс программ, которые называются оболочкой экспертной системы, создавался с целью позволить непрограммистам воспользоваться результатами работы программистов, решавших аналогичные проблемы. Так, программа EMYCIN позволяет использовать архитектуру системы MYCIN в приложении к другим областям медицины (напомним, что программа MYCIN была ориентирована только на заболевания крови). На базе EMYCIN были разработаны экспертные системы как для медицины (например, система PUFF для диагностики легочных заболеваний), так и для других областей знаний, например программа структурного анализа SACON.

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

Автор системы EMYCIN Ван Мелле одним из первых подчеркнул, что оболочки экспертных систем отнюдь не являются универсальной архитектурой для решения проблем. Разработанная им система EMYCIN ориентирована на те проблемы диагностирования с большими объемами данных, которые поддаются решению с помощью дедуктивного подхода в предположении, что пространство диагностических категорий стационарно.

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

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

Большинство коммерческих продуктов типа оболочек экспертных систем подходит только для тех проблем, в которых пространство поиска невелико.

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

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

На это обратила внимание Эйкинс в критическом замечании по поводу реализации экспертной системы PUFF на базе оболочки EMYCIN:

Использованный в EMYCIN формализм порождающих правил затрудняет разделение разных видов знаний – эвристических, управляющих, знаний об ожидаемых значениях параметров.

Недостаточная структурированность набора порождающих правил в EMYCIN также затрудняет и восприятие новых знаний, поскольку добавление в базу знаний нового правила требует внесения изменений в различные компоненты системы. Например, нужно вносить изменения в таблицы знаний, содержащие информацию о медицинских параметрах. Это одна из проблем, решением которой гордятся создатели системы TEIRESIAS.

Другое критическое замечание Эйкинс касается не столько конкретной системы PUFF или EMYCIN, сколько функциональных возможностей систем, базирующихся на правилах, в общем, а, следовательно, и всех оболочек экспертных систем, в которых порождающие правила используются в качестве основного языка представления знаний. Значительная часть экспертности – это знания о типовых случаях, т.е. довольно часто встречающихся в предметной области. Эксперты легко распознают известные типовые случаи и способны без особого труда классифицировать их в терминах идеальных прототипов даже при наличии определенных помех или неполных данных. Они интуитивно различают подходящие случаю или необычные значения исходных данных и принимают адекватное решение о том, как поступить в дальнейшем при решении проблемы. Такие знания практически невозможно представить в экспертной системе, если пользоваться только правилами в форме «условие-действие». Для этого потребуется значительно более сложный формализм, который сведет на нет одно из главных достоинств использования порождающих правил в качестве основного средства принятия решений.

В оболочках экспертных систем существует также проблема с реализацией механизма обработки неопределенности. Некоторые оболочки уже включают в себя определенный формальный механизм работы с неопределенностью, например основанный на использовании коэффициентов уверенности. Однако большинство, если не все использованные в оболочках экспертных систем механизмы такого рода, не согласуются с выводами теории вероятностей и обладают свойствами, которые с трудом поддаются анализу. Конечно, конкретному методу обработки неопределенности при решении конкретной задачи в данной предметной области можно дать прагматическое обоснование, как поступил, например, Шортлифф по отношению к схеме обработки коэффициентов уверенности в системе MYCIN. Но вряд ли оправданно распространять этот аппарат на другие области применения, встроив его в оболочку.

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

болочки экспертных систем - программный продукт, обладающий средствами представления знаний для определенных предметных областей. Задача пользователя заключается не в непосредственном программировании, а в формализации и вводе знаний с использованием предоставленных оболочкой возможностей. Недостатком этих систем можно считать невозможность охвата одной системой всех существующих предметных областей. Примером могут служить ИНТЕРЭКСПЕРТ, РС+, VP-Expert.

Оболочка, shell - базовый элемент операционной системы, определяющий интерпретацию команд и действий пользователя.

CLIPS (Язык C, интегрированная Продукционная Система) - OPS-ПОДОБНАЯ продукционная система, использующая вывод от фактов к цели, написанная на C в ANSI NASA. Механизм логического вывода CLIPS включает сопровождение, динамическое добавление правил и настраиваемые cтратегии разрешения противоречий. CLIPS, включая динамическую версию, легко встраивается в другие прикладные программы. CLIPS включает объектно-ориентированный язык, названный COOL(Объектно-ориентированный Язык CLIPS), который прямо интегрирован с механизмом логического вывода. CLIPS выполняется на многих платформах, включая IBM PC ( Windows 3.1 и версии МС-ДОС 386).

Домашняя страница Software Technology Branch http://www.jsc.nasa.gov/stb/STB_homepage.html NASA, домашняя страница Nasa Information Services http://hypatia.gsfc.nasa.gov/NASA_homepage.html и домашняя страница CLIPS - http://www.jsc.nasa.gov/~clips/CLIPS.html Cписок ЧАСТО ЗАДАВАЕМЫХ ВОПРОСОВ по CLIPS и ошибки располагаются на jsc.nasa.gov:/pub/clips/ и поддерживаются Gary Riley.



Pages:   || 2 |
Похожие работы:

«УДК 316.36 СТРУКТУРА ЦЕННОСТНЫХ ОРИЕНТАЦИЙ СТУДЕНТОВ И ПРЕПОДАВАТЕЛЕЙ ТЕХНИЧЕСКОГО ВУЗА Курбатова Людмила Николаевна, канд.социол.наук, доцент кафедры социологии и политологии, зав. лабораторией социологии высшего образования Пермский национальный исследовательский политехнический университет, г. Пермь E-mail: kurbatova-l...»

«ШАЛАГИНОВ КОНСТАНТИН КОНСТАНТИНОВИЧ ПРАВОВОЙ РЕЖИМ ОБЪЕКТА НЕЗАВЕРШЕННОГО СТРОИТЕЛЬСТВА: ТЕОРИЯ И ПРАКТИКА Специальность 12.00.03 – гражданское право; предпринимательское право; семейное право; международное частное право. АВТОРЕФЕРАТ диссертации на соискание ученой степени кандидата...»

«База нормативной документации: www.complexdoc.ru ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ Р РЕКОМЕНДАЦИИ 50.2.061ПО МЕТРОЛОГИИ Государственная система...»

«Гениатулин Константин Агзамович ОБЕСПЕЧЕНИЕ ЭЛЕКТРОМАГНИТНОЙ СОВМЕСТИМОСТИ ПРИ ЧАСТОТНО-ТЕРРИТОРИАЛЬНОМ ПЛАНИРОВАНИИ СИСТЕМ СПУТНИКОВОЙ СВЯЗИ С ЗОНАЛЬНЫМ ОБСЛУЖИВАНИЕМ 05.12.04 Радиотехника, в том числе системы и устройства телевидения Автореферат диссертации на соиск...»

«Дисциплина "Методология конструирования" для направления 150900 "Технология, оборудование и автоматизация машиностроительных производств", 261001 "Технология художественной обработки материалов" 9. РАЗРАБОТКА ТЕХНОЛОГИЧЕСКИХ МАШИН И АВТОМАТИЗИРОВАННЫХ УСТРОЙСТВ Приведены схемы и элементы...»

«Вестник ДВО РАН. 2008. № 2 Н.Г.АРТЕМЬЕВА О датировке Южно-Уссурийского городища Приведен анализ новых археологических материалов, свидетельствующих, что построенное во время империи Цзинь и существовавшее при государстве Восточное Ся Южно-Уссурийское г...»

«ТРЕБОВАНИЯ К РЕКЛАМНЫМ МАТЕРИАЛАМ NUR.KZ, 2016 Дата последнего обновления: 26.02.2016 ОГЛАВЛЕНИЕ БАННЕРНАЯ РЕКЛАМА Основные положения 2 Требования к ссылкам 3 Правила использования кодов отслеживания показов 3 Видео в баннер...»

«III. Технологические вопросы безопасности горных работ Г.Д. Буялич д-р техн. наук, профессор ФГБОУ ВПО "КузГТУ им. Т.Ф. Горбачева" В.М. Тарасов генеральный директор ООО "РивальСИТ" Н.И. Тарасова генеральный директор ООО ИКЦ "Промышленная безопасность" УДК 622...»

«Научно-производственная фирма "Радиус" Комплектные испытательные устройства "Сатурн-М" "Сатурн-М1" Руководство по эксплуатации 4222-006-17326295-96 РЭ Москва СОДЕРЖАНИЕ Раздел Стр. 1. ВВЕДЕНИЕ 3 2. НАЗНАЧЕНИЕ И ОБЛАСТЬ ПРИМЕНЕНИЯ 3 3. ВЫПОЛНЯЕМЫЕ ФУНКЦИИ 4 4. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ 5 5. КОМПЛЕКТ ПОСТАВКИ 6 6. УСТРОЙСТВО И РАБОТА...»

«ИСПОЛЬЗОВАНИЕ НАЗЕМНЫХ ЛАЗЕРНЫХ СКАНЕРОВ В СТРОИТЕЛЬСТВЕ Гостищева К., Телепова М., Червонных Н. – студенты группы ПЗ-01, Азаров Б.Ф. – к.т.н., доцент Алтайский государственный технический университет им. И.И. Ползунова (г. Барнаул) Лазерное сканирование технология, позволяющая создать ци...»

«ДОГОВОР на проведение комплексного технического обслуживания лифтов и систем диспетчерской сигнализации и связи (ЛДСС) г. Йошкар-Ола / *2?&*&2011 г. Муниципальное предприятие "Лифтовое хозяйство" МО "Город Йошкар-Ола", именуемое в дальнейшем "Подрядчик", в лице директора Гуляева Олега Юрьевича, действующего н...»

«МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО МОРСКОГО И РЕЧНОГО ТРАНСПОРТА УФИМСКИЙ ФИЛИАЛ ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО ОБРАЗОВАНИЯ "МОСКОВСКАЯ ГОСУДАРСТВЕННАЯ АКАДЕМИЯ ВОДНОГО ТРАНСПОРТА" УТВЕРЖДАЮ директор У...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО РЫБОЛОВСТВУ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ "МУРМАНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ" Пример...»

«№ 2, 2014 ВІСНИК ІНЖ ЕНЕРНОЇ А КАДЕМІЇ УКРАЇНИ BULLETIN OF ENGINEERING ACADEMY OF UKRAINE МАШИНОБУДУВАННЯ УДК 621.923.42 Веремей Г.А. АНАЛИЗ ЗАВИСИМОСТИ ПАРАМЕТРОВ КАЧЕСТВА ДЕТАЛЕЙ ГАЗОРАСПРЕДЕЛИТЕЛЬНОГО МЕХАНИЗМА ОТ ХАРАКТЕРИСТИК ДВИГАТЕЛЯ ВНУТ...»

«Федеральное агентство морского и речного транспорта Федеральное государственное образовательное учреждение высшего профессионального образования "Морской государственный университет им. адм. Г. И. Невельского" А. В. Степанец, В. Е. Верютина УПРАВЛЕНИЕ ИСПОЛЬЗОВАНИЕМ ДОКЕРОВ-МЕХАНИЗАТОРОВ МОРСКОГО ПО...»

«ІНФОРМАТИКА, ЕЛЕКТРОНІКА, ЗВ'ЯЗОК 7 УДК 681.3 Ю.Г. Шаталова, доцент, канд. техн. наук Севастопольский национальный технический университет ул. Университетская 33, г. Севастополь, Россия, 99053 E-mail: volnajulia@mail.ru РАЗРАБОТКА ИМИТАЦИОННОЙ МОДЕЛИ ТРЕХУРОВНЕВОЙ АРХИТЕКТУРЫ РАСПРЕДЕЛЕННОЙ БАЗЫ ДАННЫХ И...»

«ISSN 2073-9575. Наукові праці ДонНТУ. Серія "Гірничо-геологічна". № 1(20)'2014. С. 38-48 УДК 552.3+551.14 Е. В. Седова1, канд. геол. наук, Е. М. Шеремет2, д-р геол.-мин. наук ГВУЗ "Донецкий национальный технический универси...»

«ИКОННИКОВА ЛЮДМИЛА НИКОВНА ОЦЕНКА ЭФФЕКТИВНОСТИ МЕРОПРИЯТИЙ ПО ИНТЕНСИФИКАЦИИ ДОБЫЧИ НЕФТИ ПРИ СОЛЯНО-КИСЛОТНОЙ ОБРАБОТКЕ Специальность 25.00.17 – Разработка и эксплуатация нефтяных и газовых месторождений АВТОРЕФЕРАТ диссертации на соискание ученой степени кандидата технических наук Ухта 2013...»

«Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Пермский национальный исследовательский |пнипу| политехнический университет Гуманитарный факультет Кафедра иностранных языков и связе...»

«УДК 622.83 РАСЧЕТ УСТОЙЧИВОСТИ ПРИБОРТОВЫХ МАССИВОВ КАРЬЕРА "ПУСТЫННОЕ" Фарит Камалович Низаметдинов Карагандинский государственный технический университет, Республика Казахстан, 100027, г. Караганда, Бульвар Мира, 56, зав. кафедры маркшейдерского дела и геодезии, проф., доктор технических наук, тел. (7212) 56-26-27 Ольга Гази...»

«СРЕДНЕЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАНИЕ Ю. Г. БАРАБАНЩИКОВ СТРОИТЕЛЬНЫЕ МАТЕРИАЛЫ И ИЗДЕЛИЯ УЧЕБНИК Рекомендовано Федеральным государственным учреждением "Федеральный институт развития образования" в качестве учебника для использования в учебном проц...»








 
2017 www.ne.knigi-x.ru - «Бесплатная электронная библиотека - электронные матриалы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.