БНТУ
Расчетно-пояснительная записка
«Оболочка экспертной системы»
по курсу «Функциональное и логическое программирование»
Выполнил: студент гр. 107219
Проверил:
Содержание
Введение……………………………………………………………..3
Постановка задачи……………… ……………………….………..5
Описание предикатов…………………………………....………….6
Текст программы…………………………………………………….7
Тестирование программы…………………………………….……10
Выводы……………………………………………………….……..12
Литература…………………………………………………………..13
Введение:
Турбо-Пролог является компиляторно-ориентированным языком программирования высокого уровня; разработан фирмой Borland International и предназначен для программирования задач из области искусственного интеллекта. Как язык программирования ИИ Турбо-Пролог особенно хорош для создания экспертных систем, динамических баз данных, программ с применением естественно-языковых конструкций; он также может быть использован и для других задач общего характера. Турбо-Пролог имеет окна, цветную графику и интерактивные средства ввода-вывода, что свидетельствует о его максимальном удобстве для пользователя прикладных программ.
В экспертных системах, базирующихся на логике, база знаний состоит из утверждений в виде предложений логики предикатов. Такие предложения могут группироваться, образуя базу данных
Турбо-Пролога. Правила могут либо описывать данные, либо управлять процессом внутренней унификации Турбо-Пролога. Так же как и в системе на правилах экспертная система, базирующаяся на логике, имеет множество правил, которые могут вызываться с помощью данных из входного потока. Система имеет также интерпретатор, который может выбирать и активизировать модули, включаемые в работу системы. Интерпретатор выполняет различные функции внутри системы на основе следующей схемы:
1. Система имеет предложения в базе знаний, которые управляют поиском и сопоставлением. Интерпретатор сопоставляет эти предложения с элементами данных в базе данных.
2. Если может быть вызвано более одного правила, то система использует возможности Турбо-Пролога для разрешения конфликта. Следовательно, пользователю/программисту не нужно рассматривать потенциально возможные конфликты.
3. Система получает результаты унификационного процесса автоматически, поэтому они могут направляться на нужное устройство вывода информации. Так же как и в системе, базирующейся на правилах, данный циклический процесс является процессом распознавание-действие. Красота и большие возможности системы, основанной на логике, заключаются в том, что она отражает структуру самого Турбо-Пролога. Этим объясняется тот факт, что она очень эффективна в работе.
Наиболее важным аспектом для базы знаний в системе, основанной на логике, является проектирование базы знаний, ее утверждений и их структуры. База знаний должна иметь недвусмысленную логическую организацию, и она должна содержать минимум
избыточной информации. Так же как и в системе, базирующейся на
правилах, минимально достаточное количество данных образуют наиболее эффективную систему. В экспертных системах, базирующихся на логике, база знаний состоит из утверждений в виде предложений логики предикатов. Такие предложения могут группироваться, образуя базу данных Турбо-Пролога. Правила могут либо описывать данные либо управлять процессом внутренней унификации Турбо-Пролога. Так же как и в системе на правилах экспертная система, базирующаяся на логике, имеет множество правил, которые могут вызываться с помощью данных из входного потока. Система имеет также интерпретатор, который может выбирать и активизировать модули, включаемые в работу системы.
Интерпретатор выполняет различные функции внутри системы на основе следующей схемы:
1. Система имеет предложения в базе знаний, которые управляют поиском и сопоставлением. Интерпретатор сопоставляет
эти предложения с элементами данных в базе данных.
2. Если может быть вызвано более одного правила, то система использует возможности Турбо-Пролога для разрешения конфликта. Следовательно, пользователю/программисту не нужно рассматривать потенциально возможные конфликты.
3. Система получает результаты унификационного процесса
автоматически, поэтому они могут направляться на нужное устройство вывода информации.
Так же как и в системе, базирующейся на правилах, данный циклический процесс является процессом распознавание-действие. Красота и большие возможности системы, основанной на логике, заключаются в том, что она отражает структуру самого Турбо-Пролога. Этим объясняется тот факт, что она очень эффективна в работе. Наиболее важным аспектом для базы знаний в системе, основанной на логике, является проектирование базы знаний, ее утверждений и их структуры. База знаний должна иметь недвусмысленную логическую организацию, и она должна содержать минимум избыточной информации. Так же как и в системе, базирующейся на правилах, минимально достаточное количество данных образуют наиболее эффективную систему.
Постановка задачи:
Отладить и модифицировать программу 10.11:
– все сообщения, выдаваемые на экран, должны быть на русском языке,
– выполнить требования упражнений 10.1 и 10.2,
– модифицировать экспертную систему в соответствии с требованием упражнения 10.3.
Упражнения.
10.1. Вызовите экспертную систему, базирующуюся на логике, для выбора породы собаки. Введите различные последовательности ответов "yes"( да) и "no"(нет), наблюдая как работает программа.
10.2. Пронаблюдайте, что происходит, когда ваши ответы подобраны так, что их нельзя сопоставить с породами, характеристики которых хранятся в базе знаний. Вы увидите, что внутренние программы унификации Турбо-Пролога производят исчерпывающее сопоставление. Только когда никакое сопоставление не возможно, система
выдает соответствующее сообщение.
10.3 Модифицируйте базирующуюся на логике экспертную систему для выбора породы собаки, добавив гипотетическую породу. Проверьте программу и убедитесь, что она идентифицирует породу, которую вы "спроектировали". Заметьте, что ваши характеристики собаки должны быть комбинацией характеристик уже существующих в программе, но комбинация должна отличаться от комбинаций для других пород.
Описание предикатов:
repeat – организация в программе цикла.
make_menu – создание меню и графического интерфейса.
process(Key)(char): (i) –создание системы запросов в меню.
load_basa – загрузка базы знаний из файла.
save_basa – сохранение базы знаний в файл.
clear_basa – очистка базы знаний.
expert– главный предикат
consulting (Poroda, Cond, Ans)(string, str(integer, string)*,integer*):
(i, i, o) – консультация пользователя с оболочкой ЭС, где Poroda – порода собаки, Cond – список структуры Номер-Характеристика, Ans – список положительных ответов пользователя.
transform (C1, C2)(char, char): (i, o) – преобразование символа С1 в символ С2.
add_list (C, El, List1, List2)(char, integer, integer*, integer*): (i, i, i, o) –добавление элемента El к списку List1, которое зависит от параметра C, где List2 – полученный список.
find_poroda (Poroda, Cond)(string, integer*): (o, i) – поиск породы собаки Poroda, в зависимости от списка ответов пользователя Cond.
ravno (List1, List2)(integer*, integer*): (i, i) – проверка равенства списков List1 и List2.
belong (El, List)(integer, integer*): (i, i) – проверка принадлежности элемента El списку List.
Текст программы:
DOMAINS
% Список элементов типа INTEGER
l_i=integer*
% Список элементов типа STRING
l_s=string*
i=integer
s=string
c=char
% Структура Порода-Параметры и ее список
struct=str(i, s)
l_str=struct*
file=myfile
DATABASE
rule(s, l_i)
cond(struct)
PREDICATES
% Создание цикла
repeat
% Главный предикат
expert
% Создание меню
make_menu
process(c)
% Загрузка базы знаний
load_basa
% Сохранение базы знаний
save_basa
% Очистка базы знаний
clear_basa
% Консультация
consulting(s, l_str, l_i)
% Преобразование символов
transform(c, c)
% Добавление элемента к списку
add_list(c, i,l_i, l_i)
% Поиск породы собаки
find_poroda(s, l_i)
% Проверка равентсва списков
ravno(l_i, l_i)
% Проверка принадлежности элемента списку
belong(i, l_i)
CLAUSES
expert:-
makewindow(2,15,4," Курсовой проект студента гр. 107219 ",
2,2,15,60),
load_basa,
make_menu,
save_basa,
clear_basa,
removewindow.
make_menu:-
repeat,
clearwindow, nl,
write(" Выберите один из пунктов меню:"),nl, nl,
write(" 1. Консультация."),nl,
write(" 2. Просмотр базы знаний."),nl,
write(" 3. Добавление нового знания."),nl,
write(" 4. Удаление знания."),nl,
write(""),nl,
write(""),nl,
write(" Esc - Выход."),nl, nl,
readchar(C),
process(C),
C=27,!.
process('1'):-
makewindow(2,15,1," Консультация. ",5,5,10,70),
shiftwindow(2),
nl, write(" "),nl,
findall(Str, cond(Str),List),
consulting(" Искомая порода собаки",List, Cond),
find_poroda(Poroda, Cond),
nl, write(" ",Poroda),
readchar(_),
removewindow,!.
process('2'):-
makewindow(2,15,5," Просмотр базы знаний. ",5,5,20,70),
shiftwindow(2),
existfile("basa. exp"),
file_str("basa. exp",Str),
display(Str),nl,
readchar(_),
removewindow,!.
process('3'):-
makewindow(2,15,2," Добавление нового знания. ",5,5,6,70),
shiftwindow(2),
nl, write(" Введите название породы собаки для добавления: "),
readln(Poroda),nl,
findall(Str, cond(Str),List),
consulting(Poroda, List, Cond),
assertz(rule(Poroda, Cond)),
write(" Добавление прошло успешно."),nl,
readchar(_),
removewindow,!;
nl, write(" Ошибка при вводе !!!"),
readchar(_),
removewindow.
process('4'):-
makewindow(2,15,2," Удаления знания. ",5,5,6,70),
shiftwindow(2),
nl, write(" Введите название породы собаки для удаления: "),
readln(Poroda),nl,
retract(rule(Poroda,_)),
write(" Удаление прошло успешно!"),
readchar(_),
removewindow,!;
nl, write(" Ошибка при вводе !!!"),
readchar(_),
removewindow.
process(27):-!.
process(_):-
write(" Ошибка при вводе."),
readchar(_),!.
repeat.
repeat:-repeat.
load_basa:-consult("basa. exp"),!.
load_basa:-write(" Ошибка при загрузке правил из файла!").
save_basa:-save("basa. exp").
clear_basa:-
retractall(rule(_,_)),
retractall(cond(_)).
consulting(_,[],[]).
consulting(Poroda,[str(N, Cond)|T1],List1):-
clearwindow, nl,
write(" ",Poroda," имеет ",Cond,"? (д/н)"),nl,
readchar(Answer1),
transform(Answer1,Answer2),
consulting(Poroda, T1,List2),
add_list(Answer2,N, List2,List1).
transform('д','y').
transform('Д','y').
transform('Y','y').
transform('y','y').
transform('1','y').
transform(_,'n').
add_list('y',H, T,[H|T]):-!.
add_list(_,_,List, List).
find_poroda(Str, Cond1):-
rule(Poroda, Cond2),
ravno(Cond1,Cond2),
ravno(Cond2,Cond1),
concat(Poroda," является искомой породой собаки.",Str),!.
find_poroda("Извините, но соответствующей параметрам породы не найдено.",_).
ravno([],_).
ravno([H|T],L):-
belong(H, L),
ravno(T, L).
belong(El,[El|_]).
belong(El,[H|T]):-
El<>H,
belong(El, T).
GOAL
expert
Тестирование программы:
Первоначальное меню, появляющееся при запуске программы.
---- Курсовой проект студента гр. 107219 ---
Выберите один из пунктов меню:
1. Консультация.
2. Просмотр базы знаний.
3. Добавление нового знания.
4. Удаление знания.
Esc - Выход.
При выборе первого пункта меню ЭС будет проводить консультацию с пользователем для опознания породы собаки.
---- Консультация. ---
Искомая порода собаки имеет короткая шерсть? (д/н)
д
Искомая порода собаки имеет длинная шерсть? (д/н)
н
Искомая порода собаки имеет рост меньше 22 дюймов? (д/н)
д
Искомая порода собаки имеет рост меньше 30 дюймов? (д/н)
н
Искомая порода собаки имеет низкопосаженный хвост? (д/н)
н
Искомая порода собаки имеет длинные уши? (д/н)
д
Искомая порода собаки имеет хороший характер? (д/н)
д
Искомая порода собаки имеет вес больше 100 фунтов? (д/н)
н
Полученный ответ ЭС при данной комбинации ответов пользователя.
Гончая является искомой породой собаки.
Если породы, соответствующей ответам пользователя, не найдено, тогда выдается следующее сообщение.
Извините, но соответствующей параметрам породы не найдено.
При выборе пункта меню Просмотр базы знаний все данные о породах собак будут считаны из файла basa.exp и выведены на экран.
- Просмотр базы знаний.
rule("Английский бульдог",[1,3,5,7])
rule("Американская гончая",[1,5,6,7])
rule("Дог",[1,4,6,7,8])
rule("Коккер спаниэль",[2,3,5,6,7])
rule("Ирландский сеттер",[2,4,6])
rule("Сенбернар",[2,5,7,8])
rule("Гончая",[1,3,6,7])
rule("Колли",[2,4,5,7])
rule("Лайка",[2,3,6,7])
cond(str(1,"короткая шерсть"))
cond(str(2,"длинная шерсть"))
cond(str(3,"рост меньше 22 дюймов"))
cond(str(4,"рост меньше 30 дюймов"))
cond(str(5,"низкопосаженный хвост"))
cond(str(6,"длинные уши"))
cond(str(7,"хороший характер"))
cond(str(8,"вес больше 100 фунтов"))
При добавлении нового знания ЭС проводит консультацию с пользователем, запрашивая породу собаки и ее характеристики.
Добавление нового знания. -------
Введите название породы собаки для добавления: Такса
Такса имеет короткая шерсть? (д/н)
д
Такса имеет длинная шерсть? (д/н)
н
Такса имеет рост меньше 22 дюймов? (д/н)
д
Такса имеет рост меньше 30 дюймов? (д/н)
н
Такса имеет низкопосаженный хвост? (д/н)
д
Такса имеет длинные уши? (д/н)
д
Такса имеет хороший характер? (д/н)
д
Такса имеет вес больше 100 фунтов? (д/н)
н
Добавление прошло успешно.
Для удаления знания достаточно ввести породу собаки.
Введите название породы собаки для удаления: Такса
Удаление прошло успешно!
Выводы:
Разработанная экспертная система является хорошим примером того типа задач, который наиболее приемлем для языка программирования ТурбоПролог. Полученная программа была протестирована и дала корректные результаты. При незначительной модификация программы может быть оболочкой для экспертной системы любой другой тематики.
Литература.
Использование ТурбоПролога в сжатом изложении.
Москва << Мир >> 1991.
Программирование на языке Пролог для искусственного интеллекта. Москва << Мир >> 1990.
Ин Ц., Использование ТурбоПролога. Москва <<Мир>> 1993.


