Задание: Создать экспретную систему по породам дерева

 Теория:

  Структура экспертных систем
 
 Чтобы проводить эспертизу, компьютерная программа должна быть способна решать задачи посредством логического вывода и получать при этом достаточно надежные результаты. Программа должна иметь доступ к системе фактов, называемой базой знаний.
 Программа также должна во время консультации выводить заключения из информации, имеющейся в базе знаний. Некоторые экспертные системы могут также использовать новую информацию, добавляемую во время консультации. Экспертную систему, таким образом, можно представлять состоящей из трех частей:
 	1. База знаний (БЗ).
2. Механизм вывода (МВ).
3. Система пользовательского интерфейса (СПИ).

 База знаний - центральная часть экспертной системы. Она содержит правила, описывающие отношения или явления, методы и знания для решения задач из области применения системы. Можно представлять базу знаний состоящей из фактических знаний и зна ний, которые используются для вывода других знаний. Утверждение "Джон Ф. Кеннеди был 35-м президентом Соединенных Штатов" - пример фактического знания. "Если у вас болит голова,то примите две таблетки цитрамона" - пример знания для вывода. Сама база знаний обычно располагается на диске или другом носителе.
 Механизм вывода содержит принципы и правила работы. Механизм вывода "знает", как использовать базу знаний так, чтобы можно было получать разумно согласующиеся заключения (выводы) из информации, находящейся в ней.
 Когда экспертной системе задается вопрос, механизм вывода выбирает способ применения правил базы знаний для решения задачи, поставленной в вопросе. Фактически, механизм вывода запускает экспертную систему в работу, определяя какие правила нужно вызвать и организуя к ним доступ в базу знаний. Механизм вывода выполняет правила, определяет когда найдено приемлемое решение
 и передает результаты программе интерфейса с пользователем.
  Когда вопрос должен быть предварительно обработан, то доступ к базе знаний осуществляется через интерфейс с пользователем. Интерфейс - это часть экспертной системы, которая взаимодействует с пользователем.
  Система интерфейса с пользователем принимает информацию от пользователя и передает ему информацию. Просто говоря, система интерфейса должна убедиться, что, после того как пользователь описал задачу, вся необходимая информация получена. Интерфейс, основываясь на виде и природе информации, введенной пользователем, передает необходимую информацию механизму вывода. Когда
 механизм вывода возвращает знания, выведенные из базы знаний, интерфейс передает их обратно пользователю в удобной форме. Ин терфейс с пользователем и механизм вывода могут рассматриваться как "приложение" к базе знаний. Они вместе составляют оболочку экспертной системы. Для базы знаний, которая содержит обширную и разнообразную информацию, могут быть разработаны и  реализованы несколько разных оболочек. 
 Хорошо разработанные оболочки экспертных систем обычно содержат механизм для добавления и обновления информации в базе знаний.
 Как видем , экспертная система состоит из трех основных частей. Взаимосвязь между частями может быть сложной, зависящей от природы и организации знаний, а также от методов и целей вывода. Следующие разделы описывают эти аспекты экспертных сис тем. Сначала описывается представление знаний вместе с некоторыми простыми примерами. Это описание применимо как к системам, основанным на правилах,так и к системам, базирующимся на логике. Затем рассматриваются методы вывода. Далее следует описание систем интерфейса с пользователем вместе с примерами обработки ввода и вывода. Затем предполагается, что читатель готов к рассмотрению двух конкретных методик проектирования экспертных систем: систем, базирующихся на правилах, и систем, базирующихся на логике.
 
 Представление знаний
 
Представление знаний - это множество соглашений по синтаксису и семантике, согласно которым описываются объекты. Хорошее правило при проектировании представления знаний - это организация знаний в такой форме, которая позволяет легко осуществлять доступ с помощью естественных и простых механиз мов. "Чем проще, тем лучше" - правило, которое нужно помнить, при работе с представлением знаний.
 Экспертные системы часто создаются "инженером по знаниям"(или проектировщиками экспертных систем), которые работают с человеком-экспертом, чтобы закодировать знания эксперта в базе знаний.
 Первый способ - это классификация и помещение фактов и чисел (фрагментов фактического знания) в правила Турбо-Пролога.
 Это представление подходит для использования в экспертных системах, базирующихся на правилах. Другой способ - это организация фактов и числовой информации в утверждениях, которые образуют базу знаний на утверждениях.
 Представление знаний в утверждениях подходит для использования в экспертных системах, базирующихся на логике.

 Система пользовательского интерфейса
 
 Система пользовательского интерфейса обеспечивает взаимодействие между экспертной системой и пользователем. Это взаимодействие обычно включает несколько функций:
 1. Обработка данных, полученных с клавиатуры, и высвечивание вводимых и выводимых данных на экране.
 2. Поддержка диалога между пользователем и системой.
 3. Распознавание ситуации непонимания между пользователем и системой.
 4. Обеспечение "дружественности" по отношению к пользователю.
  Система интерфейса с пользователем должна эффективно обрабатывать ввод и вывод. Для этого необходимо обрабатывать вводимые и выводимые данные быстро, в ясной и выразительной форме. Необходимо также включить возможность работы с дополнительными средствами такими, как печатающие устройства, магнитные диски и дополнительные файлы данных.
 Кроме того, система интерфейса должна поддерживать соответствующий диалог между пользователем и системой. Диалог - это общая форма консультации с экспертной системой.
 Консультация должна завершаться ясным утверждением, выдаваемым системой, и объяснением последовательности вывода, приведшей к этому утверждению.
 Система пользовательского интерфейса должна также распознавать непонимание, между пользователем и системой, возникшее либо из-за ошибки, либо на принципиальной основе . Система должна реагировать соответствующим образом на эту ситуацию. Например, не должно произойти сбоя системы, если пользователь вводит 1, когда ожидается "да" или "нет", или когда пользователь задает бессмысленный вопрос.
 Способность экспертной системы моделировать человека эксперта может меняться от простых познавательных процессов до включения новых знаний или новых способов решения задачи. Система интерфеса должна информировать пользователя о методике работы системы и ее развитии, если такое развитие предусмотрено в системе.
 Наконец, система пользовательского интерфейса должна быть "дружелюбной" к пользователю. Например, последовательность меню, показывающая задачи, которые пользователь может выбрать, является необходимой чертой экспертной системы.
Пользователь также должен иметь возможность взаимодействовать с экспертной системой естественным образом. В идеале пользователь должен иметь возможность использовать естественный язык
 
 Экспертная система на правилах
    
 Во всех экспертных системах существует зависимость между входным потоком данных и данными в базе знаний. Во время консультации входные данные сопоставляются с данными в базе знаний. Результатом сопоставления является отрицательный или ут вердительный ответ. В системе, базирующейся на правилах утвердительный результат является действием одного из продукционных правил. Эти продукционные правила определяются входными данными.
 Таким образом, экспертная система, базирующаяся на правилах (на Турбо-Прологе) содержит множество правил, которые вызываются посредством входных данных в момент сопоставления. Экспертная система также содержит интерпретатор в механизме вывода, который выбирает и активизирует различные модули системы.
 Работу этого интерпретатора можно описать последовательностью трех шагов:
 1. Интерпретатор сопоставляет образец правила с элементами данных в базе знаний.
 2. Если можно вызвать более одного правила,то интерпретатор использует механизм разрешения конфликта для выбора правила.
 3. Интерпретатор применяет выбранное правило , чтобы найти ответ на вопрос.
 Этот трехшаговый процесс интерпретации является циклическим и называется циклом "распознавание-действие".
 В системе, базирующейся на правилах, количество продукционных правил определяет размер базы знаний. Некоторые наиболее сложные системы имеют базы знаний с более чем 5000 продукционных правил.
 1. Использовать минимально достаточное множество условий при определении продукционного правила.
 2. Избегать противоречащих продукционных правил.
 3. Конструировать правила, опираясь на структуру присущую предметной области.

 	Экспертные системы, базирующиеся на логике
 
 В экспертных системах, базирующихся на логике, база знаний состоит из утверждений в виде предложений логики предикатов.
 Такие предложения могут группироваться, образуя базу данных Турбо-Пролога. Правила могут либо описывать данные либо управ лять процессом внутренней унификации Турбо-Пролога.
 Так же как и в системе на правилах экспертная система, базирующаяся на логике, имеет множество правил, которые могут вызываться с помощью данных из входного потока. Система имеет также интерпретатор, который может выбирать и активизировать модули, включаемые в работу системы.
 Интерпретатор выполняет различные функции внутри системы на основе следующей схемы:
 1. Система имеет предложения в базе знаний, которые управляют поиском и сопоставлением. Интерпретатор сопоставляет эти предложения с элементами данных в базе данных.
 2. Если может быть вызвано более одного правила , то система использует возможности Турбо-Пролога для разрешения конфликта. Следовательно пользователю/программисту не нужно рассматривать потенциально возможные конфликты.
 3. Система получает результаты унификационного процесса автоматически, поэтому они могут направляться на нужное устройство вывода информации.
 Так же как и в системе, базирующейся на правилах, данный циклический процесс является процессом распознавание-действие.
 Красота и большие возможности системы, основанной на логике, заключаются в том, что она отражает структуру самого Турбо-Пролога. Этим объясняется тот факт, что она очень эффективна в работе.
 Наиболее важным аспектом для базы знаний в системе, осно ванной на логике, является проектирование базы знаний, ее утверждений и их структуры. База знаний должна иметь недвусмысленную логическую организацию, и она должна содержать минимум избыточной информации. Так же как и в системе, базирующейся на правилах, минимально достаточное количество данных образуют наиболее эффективную систему. 

 Структура базы знаний экспертной системы для выбора породы дерева.
 
 Для идентификации породы внутри каждого подмножества можно использовать список атрибутов. Количество характеристик будет определять степень точности классификации. Различающей не обязательно является какая-нибудь единственная характеристика - все множество атрибутов используется для достижения целей в
 строящихся правилах. 
Все перечисленные ниже атрибуты являются необходимыми, так как ни один из них не характерен для всех пород одновременно.
 1) лиственная;
 2) хвойная;
 3) мягкая;
 4) твердая;
 5) очень твердая;
 6) серо-коричневая;
 7) светло-красная;
 8) светлая;
 9) темная;
10) смолистая;
11) очень смолистая;
12) Крупная текстура;
13) Мелкая текстура.
 
 Каждая характеристика для конкретной породы либо верна, либо не верна. Для каждой породы справедливы следующие характеристики:
 
     Порода  		Характеристики	
  Дуб			1,4,6,13
  Бук			1,4,7,12
  Осина		1,3,8,13
  Тис			1,5,9
  Ель			2,3,8,10
  Сосна		2,3,8,11

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

 Сначала необходимо сделать декларации базы данных. База данных будет хранить ответы пользователя на вопросы системы пользовательского интерфейса (СПИ). Эти данные являются утвердительными или отрицательными ответами. 
 Далее нужно объявить предикаты для выполнения вывода (машина вывода) и для взаимодействия с пользователем (система пользовательского интерфейса).
 Все вместе это следующие декларации:
 
 database
 
  xpositive(symbol,symbol)
  xnegative(symbol,symbol)
  
 predicates
 
  do_expert_job
  do_consulting
  ask(symbol,symbol)
  dog_is(symbol)
  it_is(symbol)
  positive(symbol,symbol)
  negative(symbol,symbol)
  remember(symbol,symbol,symbol)
  clear_facts
 
 Предикаты базы данных xpositive и xnegative используются для хранения утвердительных и отрицательных ответов пользователя. Первые четыре предиката нужны для взаимодействия с пользователем, а остальные шесть - для механизма вывода.
 Должны быть составлены восемь продукционных правил : по одному для каждой породы. Каждое правило должно идентифицировать породу по признаку принадлежности к группе длинношерстных или короткошерстных.
 Правило it_is производит эту идентификацию. Затем правило positive идентифицирует характеристики собаки в каждом случае.
 И it_is и positive используются механизмом вывода. Ниже приведено полное продукционное правило для дуба:
 
tree_is("Дуб"):-
 positive(tree,"Лиственная"),
 positive(tree,"Твердая"),
 positive(tree,"Серо_Коричневая"),
 positive(tree,"Мелкая_текстура"),!.

  Механизм вывода должен иметь правила для управления данными вводимыми пользователем, для сопоставления их с продукционными правилами и сохранения "трассы" (или запоминания) отрицательных и утвердительных ответов. Правила positive и negative используются для сопоставления данных пользователя с данными в продукционных правилах. Правило remember (запоминание) производит добавление предложений с ответами yes (да) и no (нет), для использования при сопоставлении с образцом:
 
 positive(X,Y) :-
  xpositive(X,Y),!.
 positive(X,Y) :-
  not(negative(X,Y)),!,
  ask(X,Y).
  
 negative(X,Y) :-
  xnegative(X,Y),!.
  
 remember(X,Y,yes) :-
  asserta(xpositive(X,Y)).
 remember(X,Y,no) :-
  asserta(xnegative(X,Y)),
  fail.
  
 clear_facts :-
  retract(xpositive(_,_)),
  fail.
 clear_facts :-
  retract(xnegative(_,_)),
  fail.
   
 Назначение системы пользовательского интерфейса (СПИ) - связь вводимых пользователем данных с системой логического вывода. Главный модуль do_expert_job (выполни экспертную работу) и модуль do_consulting (выполни консультацию)
 осуществляют эту связь. Модуль ask(X,Y) (спроси) запрашивает данные у пользователя и сохраняет ответы в базе знаний. Кроме того, окно обеспечивает дополнительное удобство во время консультации. Система пользовательского интерфейса полностью приведена ниже:
   
 do_expert_job :-
  setup_window,
  do_consulting,
  write("Press space bar."),nl,
  readch(_),
  removewindow,
  exit.
  
 setup_window :-
  makewindow(1,7,7,"AN EXPERT SYSTEM",1,16,22,58),
  nl,write("* * * * * * * * * * * * * * * * * * * *"),
  nl,write(" A Tree Expert "),
  nl,write("   "),
  nl,write("This is a tree identification system. "),
  nl,write("Please answer the question about "),
  nl,write("the dog you would like by typing in "),
  nl,write("'yes' or 'no'.  "),
  nl,write("* * * * * * * * * * * * * * * * * * * *"),
  nl,nl.
  
 do_consulting :-
  dog_is(X),!,nl,
  write("the tree you have indicated is a(n)",X,"."),nl,
  clear_facts.
 do_consulting :-
  nl,write("Sorry I can't help you ! "),
  clear_facts.
  
 ask(X,Y) :-
 write(" Question :- ",X," it ",Y," ?"),
 readln(Reply),
 remember(X,Y,Reply).
   
   Заметьте, что главный модуль do_expert_job вызывает модули setup_window (установи окно) и do_consulting (выполни консультацию). Консультирующий модуль имеет две альтернативные формы. Первая взаимодействует с механизмом вывода; если результат цикла "распознавание - действие" положительный, то результат сообщается пользователю. Вторая форма сообщает о негативном результате.

 Теперь можно соединить отдельные компоненты и сформировать полную экспертную систему на правилах для выбора породы дерева.
 Эта программа просит пользователя выбрать режим консультации или выход из программы. Затем экспертная система выбирает породу собаки на основании ответов пользователя на вопросы, или в конце неудачного поиска выдает сообщение “Sorry!”

Реализация:

domains

database
 xpositive(symbol,symbol)
 xnegative(symbol,symbol)

predicates
 do_expert_bird.
 do_consulting
 ask(symbol,symbol)
 tree_is(symbol)
 positive(symbol,symbol)
 negative(symbol,symbol)
 remember(symbol,symbol,symbol)
 clear_facts

goal
 do_expert_bird.

clauses
 do_expert_bird:-
  makewindow(1,7,7,"Expert System",1,3,22,71),
  nl,write(" ---------------------------------------------------"),
  nl,write(" A Tree Expert "),
  nl,write("   "),
 nl,write(" Please answer the questions 'yes' or 'no'."),
 nl,write(" ---------------------------------------------------"),
 nl,nl,
 do_consulting,
 write("Press space bar."),nl,
 readchar(_),
 removewindow,
 exit. 
 do_consulting:-
 tree_is(X),!,nl,
 write("Tree ",X,"."),nl,
 clear_facts.
 do_consulting:-
 nl,write("Sorry !"),
 clear_facts.
 ask(X,Y):-
 write(" expert> ",X," ",Y," ?"),
 readln(Reply),
 remember(X,Y,Reply).
 positive(X,Y):-
 xpositive(X,Y),!.
 positive(X,Y):-
 not(negative(X,Y)),!,
 ask(X,Y).
 negative(X,Y):-
 xnegative(X,Y),!.
 remember(X,Y,yes):-
 asserta(xpositive(X,Y)).
 remember(X,Y,no):-
 asserta(xnegative(X,Y)),
 fail.
 clear_facts:-
 retract(xpositive(_,_)),
 fail.
 clear_facts:-
 retract(xnegative(_,_)),
 fail.
tree_is("Дуб"):-
 positive(tree,"Лиственная"),
 positive(tree,"Твердая"),
 positive(tree,"Серо_Коричневая"),
 positive(tree,"Мелкая_текстура"),!.
tree_is("Бук"):-
 positive(tree,"Лиственная"),
 positive(tree,"Твердая"),
 positive(tree,"Светло_Красная"),
 positive(tree,"Крупная_текстура"),!.
tree_is("Осина"):-
 positive(tree,"Лиственная"),
 positive(tree,"Мягкая"),
 positive(tree,"Светлая"),
 positive(tree,"Мелкая_текстура"),!.
tree_is("Тис"):-
 positive(tree,"Лиственная"),
 positive(tree,"Очень_твердая"),
 positive(tree,"Темная"),!.
tree_is("Ель"):-
 positive(tree,"Хвойная"),
 positive(tree,"Мягкая"),
 positive(tree,"Светлая"),
 positive(tree,"Смолистая"),!.
tree_is("Сосна"):-
 positive(tree,"Хвойная"),
 positive(tree,"Мягкая"),
 positive(tree,"Светлая"),
 positive(tree,"Очень_Смолистая"),!.
tree_is("Столб"):-
 positive(tree,"Не_дерево"),
 positive(tree,"Очень_Твердый"),!.