Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
ЛАБОРАТОРНАЯ РАБОТА № 8
“Реализация нечеткого логического вывода”
Цель работы. Целью работы является изучение механизма нечеткого логического вывода в системе программирования Пролог.
Краткие теоретические сведения. Рассмотрим следующее предложение языка Пролог:
suit (peter, X): -
big_salary (X,_)),
good_conditions (X,_).
big_salary(mailer, 0.4).
big_salary(officer, 0.7).
big_salary(bob, 0.8).
big_salary(artist, 1.0).
good_conditions(mailer, 0.7).
good_conditions(officer, 0.3).
good _conditions(bob, 0.6).
В нечетком Прологе вывод осуществляется таким образом, чтобы либо найти ответ с максимальной правдоподобностью, либо “ обычным образом”, но учитывая, что значение 0.5 и ниже в качестве меры истинности рассматривается как ложное. Рассмотрим , как реализовать два этих подхода.
Подход по принципу 0.5 и ниже ложь.
В этом случае наша программа должна быть переписана следующим образом:
Suit (peter, X): -
Big_salary (X,Y)),
Y>=0.5,
Good_conditions (X,Z),
Z>=0.5.
Big_salary(mailer, 0.4).
Big_salary(officer, 0.7).
Big_salary(bob, 0.8).
Big_salary(artist, 1.0).
Good_conditions(mailer, 0.7).
Good_conditions(officer, 0.3).
Good _conditions(bob, 0.6).
Как видим, изменения в этом случае в тексте программы минимальные.
Теперь рассмотрим второй подход: поиск ветви с наибольшим значением степени истинности. Для реализации второго подхода нам потребуется воспользоваться командой fail следующим образом:
database - mydb
job(string)
predicates
nondeterm suit(string,integer)
nondeterm big_salary(string,real)
nondeterm good_conditions(string,real)
clauses
suit("peter",R):-
big_salary (X,Y),
good_conditions (X,Z),
T=Y*Z,
T>R,
retractall(_), !,
assert(job(X)),
suit(peter,T).
suit ("peter",_):-
job(X),
write ("VYBRANA RABOTA:",X).
big_salary("mailer", 0.4).
big_salary("officer", 0.7).
big_salary("bob", 0.8).
big_salary("artist", 1.0).
good_conditions("mailer", 0.7).
good_conditions("officer", 0.3).
good_conditions("bob", 0.6).
Здесь мы используем предикат базы данных job, в котором хранится в конце-концов выбранная работа. Цель данной программы должна быть записана в следующем виде
goal
suit("peter",0).
Объясним наиболее сложный участок данной программы :
suit("peter",R):-
big_salary (X,Y),
good_conditions (X,Z),
T=Y*Z,
T>R,
retractall(_,mydb), !,
assert(job(X),mydb),
suit(peter,T).
Сначала последовательно выполняются предикаты :
big_salary (X,Y)),
good_conditions (X,Z),
T=Y*Z.
Здесь по порядку выбирается работа, а затем выбирается соответствующая ей зарплата и условия. Вычисляется величина T=Y*Z. После этого выполняется проверка
T>R, (*)
которая в случае удачи вызовет смену содержимого предиката базы данных job, записав в него выбранную работу и снова вызвав предикат suit (peter, T), где T новая оценка степени истинности правила. Заметим, что хотя бы одна работа всегда будет выбрана. Если нет уже ни одной работы, для которой выполняется условие (*), то осуществляется выход в правило :
suit (peter, _): -
job(X),
write (“VYBRANA RABOTA:”,X).
Для вывода найденной работы на экран.
ЗАДАНИЕ НА ВЫПОЛНЕНИЕ. Надлежит заменить критерий T=Y*Z на критерий T= min (Y,Z), возвращающий в переменной T наименьшее из чисел Y,Z.
Если значение T у двух и более работ совпадает, то программа должна останавливать свой выбор на той работе, у которой сумма Y+Z наибольшая. Для реализации этого требуется изменить фрагмент,
T=Y*Z.
T>R,
retractall(_),
assert(job(X)),
………………
дополнив его новым предикатом change(X,T,Y,Z), который и осуществляет проверку оценок T, например:
change (X,T,Y,Z):-
job(X1,T,Y1,Z1),
A=Y+Z,
A>Y1+Z1, и т.д.