
Лабораторная работа №4 / Лабораторная №4
.docМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №4
«Создание экспертной системы на языке Prolog с использованием прямой цепочки рассуждений»
по дисциплине
«Системы искусственного интеллекта»
|
Студент |
|
|
|
Бутаков В.В. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Махлышев М.А. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2012
Задание
1. Сформировать собственную базу правил (не менее 20 правил) в произвольной предметной области на основе собственных знаний или знаний эксперта.
2. Написать программный модуль на языке Prolog, реализующий вышеприведенный алгоритм.
База правил
ЕСЛИ уровень цен=растет, ТО реальный доход=падает.
ЕСЛИ реальный доход=падает, ТО потребительские расходы=падают.
ЕСЛИ потребительские расходы=падают, ТО савокупный спрос=падает.
ЕСЛИ уровень цен=падает, ТО спрос на деньги=падает.
ЕСЛИ спрос на деньги=падает, ТО процентная ставка=падает.
ЕСЛИ процентная ставка=падает, ТО инвестиции=растут.
ЕСЛИ инвестиции=растут, ТО савокупный спрос=растет.
ЕСЛИ уровень цен=растет, ТО экспорт=сокращается.
ЕСЛИ экспорт=сокращается И импорт=увеличивается, ТО чистый экспорт=сокращается.
ЕСЛИ реальный доход=растет, ТО савокупный спрос=растет.
ЕСЛИ налоги=растут И трансферты=падают, ТО реальный доход=падает.
ЕСЛИ трансферты=растут И налоги=падают, ТО реальный доход=растет.
ЕСЛИ реальный доход=растет, ТО потребительские расходы=растут.
ЕСЛИ спрос на деньги=растет, ТО процентная ставка=растет.
ЕСЛИ процентная ставка=растет, ТО инвестиции=падают.
ЕСЛИ экспорт=увеличивается И импорт=сокращается, ТО чистый экспорт=увеличивается.
ЕСЛИ трансферты=падают, ТО потребительские расходы=падают.
ЕСЛИ налоги=падают, ТО потребительские расходы=растут.
ЕСЛИ экспорт=увеличивается, ТО савокупный спрос=растет.
Код программы
domains
database
have_found(symbol,symbol)
db_identify(symbol,symbol)
db_denied(symbol,symbol)
predicates
identify(symbol,symbol,integer)
identify_end(symbol,symbol,integer)
identify_first(symbol,symbol)
identify_que(symbol,symbol)
denied(symbol,symbol)
check_if(symbol,symbol)
remember(symbol,symbol,symbol)
find(symbol,symbol)
goal
identify_first(X,Y),
not(find(X,Y)),
have_found(XA,YA),
write("Вывод экспертной системы: ",XA," ",YA,"."),
nl,
!.
clauses
find(X,Y):-
identify(X,Y,1),!.
find(X,Y):-
identify(X,Y,2),!.
find(X,Y):-
identify(X,Y,3),!.
find(X,Y):-
identify(X,Y,4),!.
find(X,Y):-
identify(X,Y,5),!.
find(X,Y):-
identify(X,Y,6),!.
find(X,Y):-
identify(X,Y,7),!.
find(X,Y):-
identify(X,Y,8),!.
find(X,Y):-
identify(X,Y,9),!.
find(X,Y):-
identify(X,Y,10),!.
identify("уровень цен","падает",N):-
N1=N-1,
identify("спрос на деньги","падает",N1),!.
identify("спрос на деньги","падает",N):-
N1=N-1,
identify("процентная ставка","падает",N1),!.
identify("процентная ставка","падает",N):-
N1=N-1,
identify("инвестиции","растут",N1),!.
identify("инвестиции","растут",N):-
N1=N-1,
identify_end("савокупный спрос","растет",N1),!.
identify("экспорт","увеличивается",N):-
N1=N-1,
identify_end("савокупный спрос","растет",N1),!.
identify("экспорт","увеличивается",N):-
N1=N-1,
identify_que("импорт","сокращается"),
identify_end("чистый экспорт","увеличивается",N1),!.
identify("экспорт","увеличивается",N):-
not(identify_que("импорт","сокращается")),
identify_end("экспорт","увеличивается",N),!.
identify("спрос на деньги","растет",N):-
N1=N-1,
identify("процентная ставка","растет",N1),!.
identify("процентная ставка","растет",N):-
N1=N-1,
identify_end("инвестиции","падают",N1),!.
identify("трансферты","растут",N):-
N1=N-1,
identify_que("налоги","падают"),
identify("реальный доход","растет",N1),!.
identify("трансферты","растут",N):-
not(identify_que("налоги","падают")),
identify_end("трансферты","растут",N),!.
identify("реальный доход","растет",N):-
N1=N-1,
identify_end("савокупный спрос","растет",N1),!.
identify("реальный доход","растет",N):-
N1=N-1,
identify_end("потребительские расходы","растут",N1),!.
identify("уровень цен","растет",N):-
N1=N-1,
identify("экспорт","сокращается",N1),!.
identify("экспорт","сокращается",N):-
N1=N-1,
identify_que("импорт","увеличивается"),
identify_end("чистый экспорт","сокращается",N1),!.
identify("экспорт","сокращается",N):-
not(identify_que("импорт","увеличивается")),
identify_end("экспорт","сокращается",N),!.
identify("налоги","падают",N):-
N1=N-1,
identify_end("потребительские расходы","растут",N1),!.
identify("уровень цен","растет",N):-
N1=N-1,
identify("реальный доход","падает",N1),!.
identify("реальный доход","падает",N):-
N1=N-1,
identify("потребительские расходы","падают",N1),!.
identify("потребительские расходы","падают",N):-
N1=N-1,
identify_end("савокупный спрос","падает",N1),!.
identify("налоги","растут",N):-
N1=N-1,
identify_que("трансферты","падают"),
identify("реальный доход","падает",N1),!.
identify("налоги","растут",N):-
not(identify_que("трансферты","падают")),
identify_end("налоги","растут",N),!.
identify("трансферты","падают",N):-
N1=N-1,
identify("потребительские расходы","падают",N1),!.
identify_first("уровень цен","падает"):-
identify_que("уровень цен","падает"),!.
identify_first("уровень цен","растет"):-
identify_que("уровень цен","растет"),!.
identify_first("экспорт","увеличивается"):-
identify_que("экспорт","увеличивается"),!.
identify_first("спрос на деньги","растет"):-
identify_que("спрос на деньги","растет"),!.
identify_first("налоги","растут"):-
identify_que("налоги","растут"),!.
identify_first("налоги","падают"):-
identify_que("налоги","падают"),!.
identify_first("трансферты","растут"):-
identify_que("трансферты","растут"),!.
identify_first("трансферты","падают"):-
asserta(db_identify("трансферты","падают")).
identify_end(X,Y,N):-
N=1,
asserta(have_found(X,Y)),
fail.
identify_que(X,Y):-
db_identify(X,Y),!.
identify_que(X,Y):-
not(denied(X,Y)),
check_if(X,Y),!.
identify_que(X,Y):-
not(denied(X,Y)),
write("Некорректный ввод! Введите: да или нет.\n"),
identify_que(X,Y),!.
denied(X,Y):-
db_denied(X,Y),!.
check_if(X,Y):-
write(X," ",Y,"?\n"),
readln(Reply),
remember(X,Y,Reply).
remember(X,Y,"да"):-
asserta(db_identify(X,Y)).
remember(X,Y,"нет"):-
asserta(db_denied(X,Y)),
fail.
Контрольный пример
Рисунок 1 – Рабочее окно программы в режиме диалога с пользователем