Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лабораторная работа №6 - файл 1.doc


Лабораторная работа №6
скачать (60 kb.)

Доступные файлы (1):

1.doc60kb.15.12.2011 07:03скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
«ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»

ЛАБОРАТОРНАЯ РАБОТА №6

«Разработка экспертных систем (с демонстрацией поиска с возвратом, использованием БД и предиката not)

Теория:

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

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

  1. ^ Объявление внутренней БД

Объявление предикатов, описывающих соответствующую внутреннюю базу фактов (ВБФ), производится в разделе facts (в ранних версиях Prolog использовали database):

domains

name, address = string

age = integer

gender = male; female

facts

person(name,address,age,gender)

predicates

male(name,address,age)

female(name,address,age)

child(name,address,age)

clauses

male(Name,Address,Age):- person(Name,Address,Age,male).



Отличие person о других предикатов в том, что для него можно добавлять и удалять факты (но не правила!!!), которые не могут содержать свободных переменных. Нельзя использовать одинаковые имена предикатов в разделах facts и predicates.

  1. ^ Использование ВБФ

  • Доступ к ВБФ

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

  • Обновление ВБФ

  • Занесение фактов во время работы программы

Во время выполнения факты могут быть добавлены в ВБФ посредством предикатов assert, asserta, assertz, или путем загрузки фактов из файла с помощью consult.

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

assertz (person(“Suzanne”,”New Haven”,35)).

asserta (person(“Michael”,”New Haven”,26)).

assertz (likes(“John”,”money”,likeDatabase)).

asserta (person(“Shannon”,”hard work”, likeDatabase)).

Первый предикат вставит факт о Suzanne, описанный предикатом person, после всех фактов person, хранящихся в данный момент в памяти. Второй – факт о Michael перед всеми имеющимися фактами предиката person. Третий – факт о John после всех других фактов likes в базе данных фактов likesDatabase, а четвертый вставит факт о Shannon в той же базе данных фактов перед всеми другими фактами likes

  • Считывание фактов из файла

Предикат consult считывает из файла fileName факты, описанные в разделе facts, и вставляет их в программу в конец соответствующей базы фактов. Предикат имеет 1 или 2 аргумента.

consult (fileName)

consult (fileName,databaseName)

В отличие от assert, если вызвать consult с одним аргументом (без имени базы фактов), то будут считаны лишь факты, которые были описаны в разделе без имени. Считываемые файлы не должны содержать символов верхнего регистра, пробелов, комментариев, пустых срок, идентификаторов (symbol) без “”

  • Удаление фактов во время работы программы

Предикат retract унифицирует факты и удаляет их из внутренней базы фактов.

retract (<the fact>)

retract (<the fact>,databaseName)

В первом случае раздел фактов может быть неименованным, тогда при выполнении предиката retract будут удаляться все записи, совпавшие c <the fact>.

facts

person (string,string,integer)

clauses

person(“Ann”,”Orsk”,23).

person(“Den”,”Omsk”,24).

retract(person(“Ann”,_,_)),



Во втором случае будут удаляться все записи, совпавшие по правилу c <the fact> и принадлежащие ВБФ с именем dbaseName. Тогда раздел фактов следует описать

facts – dbaseTutty

likes (string,string)

clauses

person(“Ann”,”money”).

like(“Den”,”computer”).

retract(person(“Ann”,_,_),dbaseTutty),



  • Удаление нескольких фактов сразу

Предикат retractall удаляет из ВБф все факты, совпадающие с образцом <the fact> из именованной и неименованной ВБФ. Выходные значения их не получить нельзя.

retractall(_,dbaseTutty).%удаляет все факты базы dbaseTutty

retractall(person(_,_,23)).%удаляет все факты о 23-хлетних людях базы фактов с фактами person

  • Сохранение ВБФ во время работы программы

Предикат save сохраняет факты из указанной базы фактов в файле. Имеет 1 или 2 аргумента:

save (fileName)

save (fileName,databaseName)

Пример построения ЭС «Животные»

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

Каждое животное описывается рядом признаков, которым оно обладает или нет. Ответы на вопросы пользователя описываются через предикаты positive (X,Y) и negative (X,Y). Следовательно, система может задать, например, такой вопрос: Does it have hair? (У него есть шерсть?)

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

В пример включены только положительные и отрицательные ответы. Для их использования в БД включены два предиката:

facts

xpositive(symbol,symbol)

xnegative(symbol,symbol)

Факт, что животное не имеет шерсти будет записан так: xnegative(has,hair). Правила negative и positive используются для контроля ответов пользователя и задания новых вопросов.

positive(X,Y):- xpositive(X,Y),!.

positive(X,Y):- not(xnegative(X,Y)), ask(X,Y,yes).
negative(X,Y):- xnegative(X,Y),!.

negative(X,Y):- not(xpositive(X,Y)), ask(X,Y,no).

Второе правило как для positive, так и для negative гарантирует, что при задании вопроса пользователю не возникнет противоречие.

Предикат ask служит для формулирования вопросов, он же запоминает ответы. Если ответ начинается с буквы у, то система предполагает, что ответом является «да», если с n, то «нет».

Программа:

facts

xpositive(symbol,symbol)

xnegative(symbol,symbol)

predicates

animal_is(symbol)

it_is(symbol)

ask(symbol,symbol,symbol)

remember(symbol,symbol,symbol)

positive(symbol,symbol)

negative(symbol,symbol)

clear_facts

run

clauses

animal_is(cheetah):- it_is(mammal), it_is(carnivore),

positive(has,tawny_color), positive(has,dark_spots).

animal_is(tiger):- it_is(mammal), it_is(carnivore),

positive(has, tawny_color), positive(has, black_stripes).

animal_is(giraffe):- it_is(ungulate),

positive(has,long_neck),рositive(has,long_legs),

positive(has, dark_spots).

animal_is(zebra):- it_is(ungulate),

positive(has,black_stripes).

animal_is(ostrich):- it_is(bird),

negative(does,fly),

positive(has,long_neck), positive(has,long_legs),

positive(has, black_and_white_color).

animal_is(penguin):-

it_is(bird),

negative(does,fly),

positive(does,swim),

positive(has,black_and_white_color).
animal_is(albatross):-

it_is(bird),positive(does,fly_well).
it_is(mammal):-

positive(has,hair).

it_is(mammal):-

positive(does,give_milk).
it_is(bird):-

positive(has,feathers).

it_is(bird):-

positive(does,fly),

positive(does,lay_eggs).
it_is(carnivore):-

positive(does,eat_meat).
it_is(carnivore):-

positive(has,pointed_teeth),

positive(has, claws),

positive(has,forward_eyes).
it_is(ungulate):-

it_is(mammal),

positive(has,hooves).
it_is(ungulate):-

it_is(mammal),

positive(does,chew_cud).
positive(X,Y):-

xpositive(X,Y),!.

positive(X,Y):-

not(xnegative(X,Y)),

ask(X,Y,yes).
negative(X,Y):-

xnegative(X,Y),!.

negative(X,Y):-

not(xpositive(X,Y)),

ask(X,Y,no).

/*задание вопросов и анализ ответов*/

ask(X,Y,yes):-

!,

write(X," it ",Y,'\n'),

readln(Reply),nl,

frontchar(Reply,'y',_),

remember(X,Y,yes).

ask(X,Y,no):-

!,

write(X," it ",Y,'\n'),

readln(Reply),nl,

frontchar(Reply,'n',_),

remember(X,Y,no).
remember(X,Y,yes):-

assertz(xpositive(X,Y)).

remember(X,Y,no):-

assertz(xnegative(X,Y)).

/*уничтожение всех старых фактов*/

clear_facts:-

write("\n\nPlease press the space bar to exit\n"),

retractall(_,dbasedom),

readchar(_).
run:-

animal_is(X),!,

write("\nYour animal may be a (an) ",X),

nl,

clear_facts.

run:-write("\nUnable to determine what"), write("your animal is.\n\n"),clear_facts.

goal

run.


Скачать файл (60 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru