АИС_Конспект. Учебное пособие по предмету основы построения автоматизированных информационных систем для специальности
![]()
|
3.4. Экспертные информационные системыЭкспертные информационные системы позволяют получить определенные рекомендации на запрос пользователя. Для реализации таких систем требуется перевести «знания» в форму пригодную для обработки на ЭВМ из определенной предметной области. В общем виде экспертная система состоит из следующих подсистем: пользователи и специалисты – эксперты в данной предметной области; интерфейс системы. Определяет правила взаимодействия системы с пользователями и правила предоставления результатов работы; подсистема логического вывода результатов по запросам пользователей; база знаний системы; подсистема объяснения полученных результатов. Классифицировать экспертные системы можно по двум основным типам: эвристические; общеконцептуальные. Эвристические системы ориентированны на определенный тип задач. При их создании используются личный опыт, интуиция и знания разработчиков системы. Для таких систем не существует единого формализованного подхода к их разработке. Общеконцептуальные системы базируются на определенные базовые принципы представления знаний к виду пригодному для хранения в формализованном виде. Процесс разработки экспертных систем сводится к выполнению этапов, которые показаны в таблице 3.1. Таблица.3.1. Этапы разработки экспертных систем.
Последовательность работ заканчивается опытной эксплуатацией системы. После завершения этого этапа делается вывод о пригодности дальнейшего использования системы. В качестве критериев оценки результата выступают: возможность взаимодействия с системой на естественном языке; возможность адаптации – приспособления системы под конкретного пользователя; устойчивость системы к ошибкам со стороны пользователей. В процессе рабочей эксплуатации системы производят ее последующую модификацию. При модификации экспертных систем вносят изменения в структуру базы знаний. База знаний дополняется новыми фактами, правилами. Обработка запросов пользователей выполняет логический процессор. Поиск решения может осуществляться двумя путями: по запросу системы вводится определенный набор данных, система выполняет анализ введенного набора и предоставляет пользователю заключение; по запросу систему пользователь вводит определенное утверждение, система выполняет поиск фактов – данных, которые соответствуют этому утверждению. База знаний является основным элементом системы. Для ее создания могут быть использованы различные подходы. Одним из удачных методов формализации знаний является продукционная модель. Продукционная модель предусматривает выделение фактов в предметной области и связей между ними по правилу «ЕСЛИ ТО». Правила позволяют выявить причинно – следственную связь между фактами. Продукционная модель была реализована в языке логического программирования ПРОЛОГ. Основными понятиями языка ПРОЛОГ являются факты и правила. Факт фиксирует некоторую связь между объектами, событиями в предметной области. Оформляется факт в виде предиката. В общем виде предикат имеет вид: НаименованиеСвязи(А1,А2). где A1,A2 – аргументы предиката. Предикат должен заканчиваться точкой. Читается предикат по схеме: A1 НаименованиеСвязи A2 Пример факта: АОИСТРА выполнило поставку 10ед товара. На языке ПРОЛОГ факт будет записан в виде: Поставлено(“АОИСТРА”,10). Символьные данные берутся в предикате в кавычки. Совокупность фактов образует модель связей в предметной области. Для работы с фактами используется механизм переменных. Переменные должны начинаться с большой буквы. Каждой переменной сопоставляется определенной значения аргумента предиката. Например, имеется описание поставок: Поставлено(“АОИСТРА”,10). Поставлено(“АОВОСТОК”,20). Поставлено(“АОИВОЛГА”,100). Для обращения к описанию предметной области нужно составить запрос. Запрос начинается с символа ? и представляет собой предикат с переменными. Для получения списка всех поставщиков требует использование предиката: ? Поставлено(Поставщик,_). Символ «_» означает игнорировать значение при поиске информации. В результате выполнения запроса будет получен результат: Поставщик = АОИСТРА Поставщик = АОВОСТОК. Поставщик = АОИВОЛГА. При выполнении запроса допустимо ставить условия на отбор информации. Для составления условий используются условные обозначения операций отношения <(меньше),>(больше),<=(меньше или равно),>=(больше или равно),<>(не равно), =(равно). В качестве связки в запросах используются символы «,» (связка И), «;» (связка ИЛИ). Пример: ? Поставлено(Постащик,Количество),Количество<100. В результате будет выведена информация о двух первых поставщиках. Для получения «знаний» о предметной области недостаточно зафиксировать факты, требуется зафиксировать правила обработки фактов. В языке ПРОЛОГ правила создаются путем объединения предикатов с помощью связки :- «ЕСЛИ» Предикат1(<аргументы>):- Предикат2(<аргументы>). Пример. Дан список поставщиков и фирм потребителей, показанный в таблице 3.3. Таблица 3.2. Поставщики–потребители
Составим описание связей таблицы: Поставщик("ЗАО Волга","АО Пульсар"). Поставщик("ЗАО Иволга","АО Квазар"). Поставщик(X,"АО Сапфир"):- Поставщик(X,"АО Пульсар"). Описание содержит правило. Которое можно прочитать так: Если некоторый поставщик обслуживает АО Пульсар, то этот же поставщик обслуживает АО Сапфир. Заканчивается правило точкой как и факт. Процессор логического вывода выполняет обработку правила с правой части, если обработка дает результата «ИСТИНА» выполняется обработка левой части правила. Левая часть называется головной, а правая часть хвостовой. 3.4.1. Основы создания информационных систем в Visual Prolog Известно несколько версий реализации данного языка ПРОЛОГ на персональных ЭВМ. Наиболее удачными реализациями компилятора являются следующие две версии Turbo Prolog фирмы Borland Inc и Visual Prolog (VIP) фирмы PDC. Последняя версия реализуют графический интерфейс пользователя и предназначена для работы в современных операционных системах, таких как Windows 2000/XP. В пособие рассматривается версия Visual Prolog 5.2. При разработке программы в VIP В разделе предикатов приводится описание всех предикатов создаваемой программы. предикаты в общем виде задаются как: p(arg1 [rem1],arg2 [rem2],…) Здесь: p – наименование предиката; arg – наименование аргумента предиката ; rem – строка символов, комментарий предиката, может отсутствовать. Аргумент предиката – условное обозначение домена, из которого может принимать значение переменная или константа предметной области программы. Допускается указывать напрямую имена доменов, в этом случае раздел доменов в программе может отсутствовать. Допускается так же наличие предикатов, не содержащих аргументов. Обычно такие предикаты используются для программирования правил. Формализованное описание предметной области программы приводится в разделе фактов. Раздел содержит факты и правила, формирующие базу знаний системы. Факты и правила заканчиваются символом «.». В целевом разделе программы записывается целевой предикат, который должен быть обработан процессором логического вывода системы программирования VIP. Цель может состоять из отдельных подцелей объединенных логическими связками «И» – «,» , либо «ИЛИ» – «;». Программа – проект. Наиболее простой вариант проекта – проект для работы с утилитой TestGoal, которая является подсистемой среды разработки. Процесс разработки такой программы приводится в приложении № 2, базовые сведения по языку программирования VIP приводятся в приложении № 1. Пример программы. Составить программу для поиска фирмы и количества поставленного товара по запросу пользователя. domains firma=string kol_vo=integer predicates postavleno(firma,kol_vo) poisk clauses %факты поставки товара postavleno("АО ИСТРА",10). postavleno("АО ВОСТОК",20). postavleno("АО ИВОЛГА",100). %Правило поиска фирмы poisk:- write("Введите фирму "),readln(Firma), postavleno(Firma,Kol), writef("\n%-20\t%-20",Firma,Kol),nl. goal poisk. Рис.3.3. Вывод программы. Вывод программы показан на рисунке 3.3. Раздел предикатов можно упростить, тогда раздел доменов программы нужно убрать: predicates postavleno(string firma,integer kol_vo) При обработке целевого утверждения раздела goal процессор логического вывода стремится найти решение, которое ему соответствует. При этом нужно учитывать ряд особенностей описания предметной области и процесса поиска решения. Создание описания предметной области в разделе clauses строится на основе предикатов, которые могут как детерминированными, так и не детерминированными. Предикаты первого типа позволяют получить только одно решение, предикаты второго типа позволяют получать множество решений. Обычно программы – информационные системы содержат предикаты второго типа, что задается в настройках компилятора параметр Default Predicate Type (см приложение). Набор фактов для конкретного предиката образует процедуру. Пример. Рассмотрим программу для вывода информации о руководителях отделов. predicates rukovodit(string f_i_o,string otdel) vyvod clauses %Процедура предиката rukovodit("Иванов И.С", "склад"). rukovodit("Петров О.И ", "сбыт"). rukovodit(Lico, "маркетинг"):- rukovodit(Lico, "сбыт"). %Конец процедуры vyvod:- rukovodit(Rukov,Otdel),write(Rukov,"\t",Otdel),nl. goal vyvod. Предметная область содержит предикат rukovodit, который является не детерминированным. При использовании правила вывода vyvod будет получено только одно решение см. рисунок 3.4. Рис.3.4. Обработка правила вывода. 3.4.2. Управления поиском решения в VIP Несмотря на то, предикат rukovodit (см. предыдущий пример) порождает несколько ответов, процессор логического вывода находит первое решение, которое соответствует поставленной цели. При обработке целевого утверждения процессор логического вывода использует так называемую точку возврата. Пусть имеется некоторая цель: P:-P1,P2,P3. Где P – цель, а P1,P2,P3 – подцели. При обработке данного правила возможны варианты рассмотренные ниже. Если выполнение первой подцели дает значение ИСТИНА, выполняется переход ко второй подцели, если она дает значение ИСТИНА, то выполняется переход к третьей подцели. Если третья подцель дает значение ИСТИНА, то правило P считается выполненным. Пусть подцель P3 дала значение ЛОЖЬ, тогда выполняется переход к подцели P2 так как там было найдено последнее правильное решение. Отыскивается, если возможно новое решение для данной подцели и выполняется снова переход к подцели P3 для отыскания правильного решения. Если подцель P2, не дает правильного результата, то выполняется переход к подцели P1 и делается попытка найти новое для нее решение. Если такое решение найдено, выполняется переход к P2 для поиска нового правильного решения, иначе правило P считается невыполнимым. Такой процесс поиска решения – поиск решения с возвратом. Чтобы получить все решения для правила P нужно найти все возможные решения для подцелей. Для решения этой задачи служит системный предикат fail. Обработка данного предиката всегда возвращает значение ЛОЖЬ. Пример. Правило вывода для получения полной информации о предметной области нужно представить в виде. vyvod:- rukovodit(Rukov,Otdel),write(Rukov,"\t",Otdel), nl,fail. vyvod. Второй вариант пустого правила нужен для вывода значения yes – решение найдено при завершении работы программы. На рисунке видно, что выведена полная информация о предметной области и найдено верное решение в соответствии с правилом, что отелом «маркетинг» руководит то же лицо, что и отделом «сбыт» (см рис 3.5.) Рис. 3.5. Обработка предметной области. Так как в правиле вывода системный предикат fail последний, то после вывода информации об отделе склад происходит повторный возврат к предикату rukovodit, системные предикаты write и nl детерминированные и они пропускаются, и результат их обработки всегда дает значение ИСТИНА. Обращение будет происходить до тех пор пока предикат rukovodit будет возвращать результат из своей процедуры. При работе с предметной областью может возникнуть ситуация когда нужно прекратить поиск решения предоставляемого не детерминированным предикатом, либо нужно прекратить поиск по условию. Для этого используется системный предикат «отсечение». Такой предикат обозначается как «!» . При наличии отсечения в правиле оно выполняется до тех пор пока не будет выполнен предикат «отсечение», затем обработка правила продолжается до его завершения символом «.» Если в рассмотренной выше программе изменить правило, так как это показано ниже, вывод информации о руководителях прекратиться после обнаружения фамилии «Петров О.И.». vyvod:- rukovodit(Rukov,Otdel),write(Rukov,"\t",Otdel),nl, Rukov="Петров О.И",!. vyvod. Отсечение используется также совместно с логической связкой «ИЛИ» для вывода сообщений об ошибке поиска данных. Пример. Правило поиска отдела по фамилии руководителя с выводом сообщения об ошибке поиска. poisk:-write("Руководитель="),readln(Rukov), rukovodit(Rukov,Otdel),write(Otdel),!; write("Нет данных !"). 3.4.3 Использование рекурсии В VIP допускается использование рекурсивных правил. Рекурсия – вызов в теле правила самого. Рекурсивные вызовы используются для организации циклического выполнения определенных действий в программах. В программах написанных на VIP существует понятие оптимизированной хвостовой рекурсии. Если рекурсия не оптимизирована, то при вызове правила резервируется дополнительная стековая оперативная память ЭВМ, в результате возникает ошибка – отсутствие свободной оперативной памяти. Причины возникновения не оптимизированной рекурсии: Рекурсивный вызов не последний в теле правила; Наличие условия перед рекурсивным вызовом; Если в теле правила вызывается предикат, содержащий условия. Рекурсивные вызов может понадобится для зацикливания работы программы. Такая необходимость может возникнуть при программировании опроса меню программы. Пример. Составить программу для опроса клавиатуры. Программа реагирует на нажатие клавиш «1», «2» и «3». При нажатии клавиши «ESC» (код 27) программа завершает свою работу. predicates action(char) repeat clauses repeat. %рекурсивное правило repeat:- repeat.%рекурсия оптимизирована action('1'):- write("\nКлавиша 1"),readchar(_). action('2'):- write("\nКлавиша 2"),readchar(_). action('3'):- write("\nКлавиша 3"),readchar(_). action('\27'):- write("\nКонец работы\n"). goal %меню, зацикливание repeat, write("\n1-Певый пежим”),write(“\n2-Второй режим”), write(“\n3-Третий режим\nВведите цифру”), readchar(Num),action(Num),Num='\27',!. Для прекращения работы программы использовано отсечение в целевом утверждении программы. 3.4.4. Управление потоком ввода–вывода При программировании задач, в которых требуется выполнение операций сравнения нужно учитывать особенность использования операции =. В отличии от процедурных языков программирования такая операция трактуется по следующему правилу. Если в левой части операции находится свободная переменная, то она соответствует оператору присваивания, в противном случае это логическая операция проверки на равенство левой и правой части выражения. Пример. Написать программу для вычисления по условиям. Дано: Программа: domains a,b,c,d,e,f=integer predicates getE(a,b,e)-(i,i,o) getF(e,f) -(i,o) clauses %Правила сравнения чисел getE(A,B,E):- A getE(A,B,E):- A>B,E=B. %Правила получения итогового значения getF(E,F):- E<=0,F=0. getF(E,F):- E>0,F=1. goal A=9,B=10,C=8,D=-89, getE(A,B,X),getE(C,D,Y),X1=X,Y1=Y, getE(X1,Y1,Z),write("Emin=",Z),nl, getF(Z,F), write("F=",F),nl. В программе использованы промежуточные переменные X1 и Y1 для хранения временных значений результата сравнения исходных чисел. При составлении программ для правильного обращения к предикатам рекомендуется выполнить спецификацию входных и выходных параметров (переменных). Для этого используются ключевые символы o – означает, что аргумент возвращает значение, i – аргумент принимает значение. Тогда описание предикатов примет вид: predicates getE(a,b,e)-(i,i,o)%первые аргументы принимают %значение, а тритий его %возвращает getF(e,f) -(i,o)%первый аргумент принимает %значение, а втораой возвращает Для контроля потока параметров, в процессе работы программы, используются системные предикаты bound(X) – контроль задания исходного значение, и free(X) – проверка отсутствия значения в переменной. Первый предикат возвращает значение ИСТИНА, если аргумент – связанная переменная, а второй возвращает значение ИСТИНА, если аргумент – свободная переменная. Пример предиката с контролем потока параметров getE(A,B,E):- %(i,i,o) bound(A),bound(B),free(E), A Для более точного и гибкого описания предметной области VIP предлагает технологию описания связей в виде структур и альтернативных доменов. 3.4.5. Особенности составления описания предметной области Чтобы поучить более гибкое описание предметной области используют структуры и альтернативные домены. Структуры используются для отображения в информационных системах составных информационных единиц. Для задания домена составной информационной единицы нужно в программу ввести составной домен в виде: struct_domen=name(перечень_доменов) struct_domen – имя структурного домена; name – наименование структуры. Пример. Программа, фиксирующая даты рождения. domains d,y = integer name,m = string birth_day = day(d,m,y) % дата рождения predicates person(name,birth_day) clauses %факты person(“Зотова О.П.”,day(20,”февраль”,1980)). person(“Хватова А.И”,day(16,”март”,1970)). goal person(N,day(Ch,Mes,Gr)), write(N,"\t",Ch,"\t",Mes,"\t",Gr),nl,fail. Альтернативные домены используются для создания модели предметной с различными вариантами ее информационного содержания. Альтернативный домен в общем виде имеет структуру: domen_namе=domen1(перечень доменов); domen2(перечень доменов); … domeni(перечень доменов) Пример. Известно, что некое лицо может обладать различными предметами. Такими предметами могут быть: книги, аудио альбому, либо произвольный предмет как одушевленный, так и неодушевленный. Программа примет вид: domains thing =misc(whatever); book(author,title); record(artist,album,type) person,whatever, author,title, artist,album,type=symbol predicates owns(person,thing) disp clauses owns("Ольга",misc("собака")). owns("Ирина",misc("кошка")). owns("Ирина",record("Моцарт","Requiem",classic)). owns("Ольга",book("Толстой Л.Н","Война и мир")). disp:- owns(P,misc(T)),write(P," ",T),nl,fail. goal disp. 3.4.6. Особенности работы с базой фактов При работе с предметной областью можно сохранить результаты ее обработки в текстовом файле, использовать динамическую базу данных фактов и использовать внешние базы данных. В VIP используется потоковая технология ввода – вывода информации. Для вывода информации в текстовый файл служит специальный системный домен file . В программу нужно ввести файловый домен в виде: file=file_domen Если требуется выполнить вывод содержания предметной области в файл, то для этого нужно создать специальный файловый поток. Файловый поток содается с помощью предикатов: openwrite(file_domen,”имя файла на диске”) writedevice(file_domen) Первый предикат выполняет связывания файлового потока с физическим файлом на диске, а второй предикат инициализирует поток вывода. После завершения вывода поток должен быть закрыт, переадресован на консоль. Для этого используется системный предикат closefile(file_domen) Восстановление вывода на консоль выполняется предикатом writedevice, в качестве аргумента следует указать системное имя консоли screen. Вывод строк текстового файла на экран производится с помощью системных предикатов: openread(file_domen,”имя файла”) readdevice(file_domen) eof(file_domen) Первый предикат создает входной поток данных, связанный с физическим файлом на диске, второй предикат активизирует поток ввода, третий используется при чтении строк файла для фиксации служебного кода EOF – конец файла. После завершения чтения строк файла нужно файловый поток ввода закрыть, и переадресовать ввод на консоль. Пример программы записи фактов предметной области в текстовый файл с последующим контрольным выводом содержимого файла на экран. domains id,name = symbol zip = integer file = outfile predicates employee(id,name,zip) prnlst getlst clauses %факты предметной области employee("100","Иванова",12). employee("200","Петров",15). employee("300","Антонова",12). %запись фактов на диск prnlst:- %запись в файл openwrite(outfile,"employ.lst"), writedevice(outfile), employee(Id,N,Z),write(Id," ",N," ",Z),nl,fail. prnlst:- %закрыть в файл writedevice(screen), closefile(outfile), write("Done !"),nl,readchar(_). getlst:- %читать строки readdevice(outfile),not(eof(outfile)), readln(Bufer),write(Bufer),nl, getlst. getlst:- %закрыть файл writedevice(screen),closefile(outfile), readchar(_). goal %печать и открытие файла prnlst,openread(outfile,"employ.lst"),getlst. Описание предметной области, построенное в разделе clauses программы – статическое. Для получения динамического описания нужно использовать базу данных фактов. Такая база данных – модель предметной области, размещенная в оперативной памяти ЭВМ. В оперативной памяти можно разместить только факты. После помещения фактов в оперативную память предметную область можно изменять: добавлять и удалять факты. Контроль за наличие в оперативной памяти повторяющихся фактов возлагается на разработчика программы. Для создания такой базы фактов нужно в программу поместить раздел facts – name. Здесь name – необязательный параметр для присвоения имени динамической базе фактов. По умолчанию используется база фактов с именем dbasedom. Обслуживание динамических фактов выполняется системными предикатами: asserta(fact) – добавление факта перед имеющимся; asserta(fact,name) – добавление факта перед имеющимся; assertz(fact) – добавление факта после последнего; assertz(fact,name) – добавление факта после последнего; retract(fact) – удаление факта по образцу; retract(fact,name) – удаление факта по образцу; retractall(fact) – удаление всех фактов по образцу; retractall(fact,name) – удаление всех фактов по образцу. При работе с динамической базой данных фактов удаление фактов выполняется по определенному шаблону, ненужные данные в шаблоне помечаются специальным символом «_». Примеры. В предметной области хранится информация об отделах и служащих. Для этого используется два предиката: otdel(integer kodotdela,string nazvotdela, integer kodrukov) sotrudniki(integer kodsotr,string familya, integer kodotdela) Факты размещаются в двух динамических базах. Для хранения информации об отделах используется база по умолчанию, а для хранения информации о сотрудниках служит база фактов fsotrudniki. Примеры использования предикатов: %Добавление факта: assertz(otdel(10,“Бухгалтерия”,100)). %удаление сотрудника: retract(sotrudniki(_,”Иванова О.И.”,_),fsotrudniki). %удаление сотрудников отдела с кодом 10 retractall(sotrudniki(_,_,10),fsotrudniki). %удаление всех фактов из БД сотрудники: retractall(_,fsotrudniki). Предикат retract может использоваться с переменными, в этом случае перед удалением происходит связывание соответствующей переменной со значением из предметной области: pr:- retract(sotrudniki(Kod,Fam,KodOtd),fsotrudniki), write(Kod,”\t”,Fam,”\t”,KodOtd),nl,fail. Запись содержимого предметной области в текстовый файл выполняется предикатом save, а чтение данных в базу из ранее созданного факта предикатом consult. Пример. dbsave:- save("C:\\temp\\persons.dat"). dbconsult:- consult("C:\\temp\\persons.dat"). Для записи именованного набора фактов, вторым аргументом нужно указать имя набора. Дополнительные возможности по созданию динамического описания предметной области предоставляют внешние базы данных. Они позволяют хранить факты и обрабатывать их в оперативной памяти, либо в дисковых файлах. Факт в динамической базе данных можно заменить на новый. Информация во внешней базе данных хранится в виде цепочки (chain). Цепочка это последовательность термов – фактов связанных между собой адресом, который хранится в адресном поле терма. Адрес формируется системно в процессе помещения факта в цепочку. Термы цепочки хранят информацию, которая обладает одинаковой структурой, но разным содержанием. Например, цепочка, в которой хранится информация о товарах, будет представлена последовательностью термов со структурой: Tovar(integer Kod,string Naimenovanie,integer KodPostavshika) Для работы с внешней базой данных нужно объявить в разделе доменов селектор. Селектор – указатель на внешнюю базу данных. Если в программе несколько баз данных селекторы задают с помощью альтернативного домена. Общий формат задания селекторного домена имеет вид: db_selector=s1;s2;…si db_selector – домен селекторов Visual Prolog. Пример: domains db_selector=dbp Работа с базами данных требует использования определенных системных предикатов. Создание базы данных выполняется предикатом db_create(Dbase,Name,Place) Где: Name – имя базы данных, либо имя файла. Place — размещение базы данных: in_memory (оперативная память), in_file(дисковый файл). Пример создания базы в оперативной памяти: db_create(dbp,"persons_list",in_memory). Закрытие базы данных и ее удаление выполняется с помощью предикатов: db_close(Dbase) db_delete(Name,Place). Пример: db_close(dbp), db_delete("persons_list",in_memory). Если база данных находилась в дисковом файле, удаление базы приводит к уничтожению файла. Работа с цепочками термов выполняется путем обращения к следующим предикатам: chain_inserta(Dbase,Chain,Domain,Term,Ref)%(i,i,i,i,o) chain_insertz(Dbase,Chain,Domain,Term,Ref)%(i,i,i,i,o) chain_terms(Dbase,Chain,Domain,Term,Ref)%(i,i,i,o,o) term_delete(Dbase,Chain,Ref)%(i,i,i) term_replace(Dbase,Domain,Ref,Term)%(i,i,i,i) Назначение предикатов в порядке следования: добавления терма в начало цепочки, добавление в конец, вывод информационного содержания терма, удаление терма, замена терма на новый. Таблица 3.3. Аргументы предикатов.
Использование предикатов требует учета спецификации потока ввода – вывода. Назначение аргументов предикатов сведены в таблицу 3.3. |