Автор: Пользователь скрыл имя, 21 Августа 2011 в 14:30, дипломная работа
Цель работы: изучить различные виды вывода, применяемые в интеллектуальных системах; исследовать подходы к принятию решений на основе аналогии; разработать ПО, позволяющее делать выводы на основе аналогии.
Рассуждение на основе аналогий определяется как метод вывода, который позволяет обнаружить подобие между несколькими заданными объектами и, благодаря переносу фактов и знаний, справедливых для одних объектов, на основе этого подобия на другие объекты, определить способ решения задачи или предсказать неизвестные факты и знания.
Введение 3
I. Общие понятия и определения 5
1.1. Аналогия и ее значимость 5
1.2. Виды умозаключений и сравнение их с аналогией 8
1.3. Аналогия и человек 12
1.4. Виды аналогий 13
1.5. Степень достоверности выводов по аналогии 14
1.6. Обзор результатов в области исследований по аналогии, как способа принятия решений в ИС 15
1.7. Понятие логической экспертной системы
1.7.1
1.7.2
1.7.3.
1.7.4.
II. Аналогия при решении задач 19
2.1. Исследования в области формализации понятия аналогии 19
2.2. Теория аналогии 26
2.2.1. Формализация аналогии 26
2.2.2. Аналогия и дедукция 31
2.2.3. Логика первого порядка для аналогии 33
2.3. Реализация механизма аналогии 36
2.3.1. Реализация механизма аналогии 37
2.3.2. Реализация системы аналогии 38
III. Программная реализация вывода по аналогии 45
3.1. Создание базы знаний 45
3.2. Механизм логического вывода 46
3.3. Обновление базы данных 48
3.4. Интерфейс пользователя 50
Заключение 56
Список использованных источников
proverka_svoystvo(H):– /*в базе нет никакой информации о данном свойстве, получаем ее у человека*/
svoystvo(H,S),
nl,write("Оно ",S,"? (1 — да, 2 — нет)"),
proverka_klav(A),
dobavlaem_v_bazu(svoystvo_is(
proverka_svoystvo(H).
Предикат proverka_klav осуществляет проверку нажатой пользователем клавиши, и если она отлична от '1' или '2', выводит соответствующее сообщение и повторно считывает символ с клавиатуры. Реализация:
proverka_klav(C):–
readchar(C1),
proverka (C1, C).
proverka (C, C):–
'1'<=C,C<='2',!.
proverka(_,C):–
write("Нажмите 1 или 2!"),nl,
readchar(C1),
proverka(C1,C).
Предикат obnovit осуществляет добавление новой информации в базу знаний. Он читает название нового животного, с помощью предиката dobav_svoystvo формирует список номеров свойств загаданного животного, добавляет соответствующий факт в базу знаний, сохраняет базу в файл.
Реализация:
obnovit:–
nl,write("Введите название животного:"),
readln(S),
dobav_svoystvo(L), /* указываем свойства животного */
dobavlaem_v_bazu(pravilo(S,L),
save("animals.ddb",knowledge)
Предикат
dobav_svoystvo с помощью предиката print_svoystvo
выводит уже имеющуюся в базе информацию
о свойствах загаданного животного и спрашивает,
известно ли еще что-нибудь о нем. В случае
необходимости добавляет его новые характеристики,
используя предикат
read_svoystvo.
dobav_svoystvo(L):–
svoystvo_is(_,'1'),!, /* имеется информация о свойствах животного */
nl,write("О нем известно, что оно: "),
print_svoystvo(1,[],L1), /* вывод имеющейся информации о животном */
nl,write("Известно ли о нем
(1 — да, 2 — нет)"),
proverka_klav(C),
read_svoystvo(C,L1,L).
dobav_svoystvo(L):–
read_svoystvo('1',[],L).
Предикат
read_svoystvo, используя предикат ex_svoystvo,
добавляет в список номера свойств, уже
имеющихся в базе; используя предикат
new_svoystvo, добавляет в список номера
новых свойств, а также описания самих
свойств — в базу знаний.
read_svoystvo('1',L,L2):
ex_svoystvo(1,L,L1,N),
new_svoystvo(N,L1,L2),!.
read_svoystvo(_,L,L):–!.
3.4.
Интерфейс пользователя
Интерфейс
- это часть экспертной системы, которая
взаимодействует с
Интерфейс
реализован следующим образом:
DOMAINS
i=integer
s=string
c=char
li=i*
/* список целых чисел */
DATABASE — knowledge
svoystvo(i,s) /* свойства животных */
pravilo(s,li)
/* описания животных */
DATABASE — dialog
svoystvo_is(i,c)
/* номер условия; '1' — имеет место, '2'
— не имеет места у загаданного
животного */
PREDICATES
start
animals /* отгадывает животное */
check(li) /* добавляет в базу информацию о новом животном */
proverka_svoystvo(i)
/* проверяет, обладает ли
obnovit /* добавляет в базу информацию о новом животном */
dobav_svoystvo(li) /* возвращает список, состоящий из номеров свойств, имеющихся у нового животного */
print_svoystvo(i,li,li)
read_svoystvo(c,li,li) /* добавляет в список номера свойств, о которых еще не спрашивалось */
ex_svoystvo(i,li,li,i) /* добавляет в список номера имеющихся в базе свойств, которыми обладает новое животное */
wr_svoystvo(c,i,li,li)
new_svoystvo(i,li,li)
/* добавляет в список номера
новых свойств, которыми
proverka_klav(c) /* с помощью предиката proverka читает символ с клавиатуры, пока он не окажется равен '1' или '2'*/
proverka(c,c) /* добивается, чтобы пользователь нажал один из символов, '1' или '2' */
CLAUSES
start:–
consult("animals.ddb",
write ("Загадайте животное, а я попытаюсь его отгадать"),nl,
animals,
retractall(_,dialog), /* очищаем текущую информацию */
retractall(_,knowledge), /* очищаем информацию об известных животных и свойствах */
nl,nl,write("Хотите еще раз
proverka_klav(C),
C='1',!,start.
start:–
nl,nl,write("Всего доброго! До новых встреч"),
readchar(_).
animals:–
pravilo(X,L),
check(L),
nl,write("Я думаю, это ",X),
nl,write("Я прав? (1 — да, 2 — нет)"),
proverka_klav(C),C='1',!.
animals:–
nl,write("Я не знаю, что это за животное"),nl,
nl,write("Давайте добавим его
obnovit.
obnovit:–
nl,write("Введите название
readln(S),
dobav_svoystvo(L), /* указываем свойства животного */
dobavlaem_v_bazu(pravilo(S,L),
в базу знаний*/
save("animals.ddb",knowledge) /* сохраняем базу
знаний в файл */.
dobav_svoystvo(L):–
svoystvo_is(_,'1'),!, /* имеется информация
о свойствах животного */
nl,write("О нем известно, что оно: "),
print_svoystvo(1,[],L1),
/* вывод имеющейся о животном
информации */
nl,write("Известно ли о нем
(1 — да, 2 — нет)"),
proverka_klav(C),
read_svoystvo(C,L1,L).
dobav_svoystvo(L):–
read_svoystvo('1',[],L).
print_svoystvo(H,L,L):–
not(svoystvo(H,_)),!.
print_svoystvo(H,L,L1):–
svoystvo_is(H,'1'),!,
svoystvo(H,T),
H1=H+1,
nl,write(T),
print_svoystvo(H1,[HL],L1).
print_svoystvo(H,L,L1):–
H1=H+1,
print_svoystvo(H1,L,L1).
read_svoystvo('1',L,L2):
ex_svoystvo(1,L,L1,N),
new_svoystvo(N,L1,L2),!.
read_svoystvo(_,L,L):–!.
ex_svoystvo(N,L,L,N):–
not(svoystvo(N,_)),!.
ex_svoystvo(N,L,L1,N2):–
svoystvo_is(N,_),!,
N1=N+1,
ex_svoystvo(N1,L,L1,N2).
ex_svoystvo(N,L,L1,N2):–
svoystvo(N,S),
nl,write("Оно ",S,"? (1 — да, 2 — нет)"),
proverka_klav(A),
wr_svoystvo(A,N,L,L2),
N1=N+1,
ex_svoystvo(N1,L2,L1,N2).
wr_svoystvo('1',N,L,[N
wr_svoystvo('2',_,L,L):–
new_svoystvo(N,L,L1):–
nl,write("Есть еще свойства? (1 — да,
2– нет)"),
proverka_klav(A),
A='1',!,
nl,write("Укажите новое
nl,write("в виде 'оно <описание нового свойства>'"), readln(S),
dobavlaem_v_bazuz(svoystvo(N,
N1=N+1,
new_svoystvo(N1,[N L],L1).
new_svoystvo(_,L,L).
check([HT]):–
proverka_svoystvo(H),
check(T).
check([]).
proverka_svoystvo(H):-