52. Язык программирования ПРОЛОГ. Факты, правила, запросы. Структура ПРОЛОГ-программы. Пример экспертной системы на ПРОЛОГЕ

 

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

  • описать знания;
  • рассмотреть методы вывода;
  • описать систему интерфейса с пользователем.

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

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

 Структура базы знаний экспертной системы для выбора породы дерева
Для идентификации породы внутри каждого подмножества можно использовать список атрибутов. Количество характеристик будет определять степень точности классификации. Различающей не обязательно является какая-нибудь единственная характеристика - все множество атрибутов используется для достижения целей в  строящихся правилах.
Для пород деревьев характерны следующие атрибуты:
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
плюс_ответ(symbol,symbol)
минус_ответ(symbol,symbol)

Далее нужно объявить предикаты для выполнения вывода (машина вывода) и для взаимодействия с пользователем (система пользовательского интерфейса).

predicates
старт
вопрос(symbol,symbol)
дерево(symbol)
положительно(symbol,symbol)
отрицательно(symbol,symbol)
удалить_факты
запомнить(symbol,symbol,symbol)

Предикаты базы данных плюс_ответ и минус_ответ используются для хранения утвердительных и отрицательных ответов пользователя. Первые три предиката нужны для взаимодействия с пользователем, а остальные - для механизма вывода.
Для каждой породы дерева должны быть составлены продукционные правила. Каждое правило должно идентифицировать породу деревьев по следующим признакам:

  • принадлежности к группе «Лиственных» или «Хвойных»;
  • принадлежности к группе «Мягких» или «Твердых» пород;
  • определение цвета и текстуры дерева.

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

дерево(дуб) if
положительно(Дерево,лиственное),
положительно(Дерево,твердое),
положительно(Дерево,серо_коричневое),
положительно(Дерево,имеет_мелкую_текстуру),!.

  Механизм вывода должен иметь правила для управления данными вводимыми пользователем, для сопоставления их с продукционными правилами и сохранения "трассы" (или запоминания) отрицательных и утвердительных ответов. Правила положительно и отрицательно  используются для сопоставления данных пользователя с данными в продукционных правилах. Правило запомнить производит добавление предложений с ответами «да» и «нет», для использования при сопоставлении с образцом:

положительно(X,Y) if плюс_ответ(X,Y),!.
положительно(X,Y) if not(отрицательно(X,Y)),! and вопрос(X,Y).
отрицательно(X,Y) if минус_ответ(X,Y),!.

    вопрос(X,Y):-
write(" Вопрос: ",X," ",Y,"?\n"),
readln(Reply),
запомнить(X,Y,Reply).

    запомнить(X,Y,да):-
asserta(плюс_ответ(X,Y)).

    запомнить(X,Y,нет):-
asserta(минус_ответ(X,Y)),fail.

    удалить_факты:-
retract(плюс_ответ(_,_)),fail.

    удалить_факты:-
retract(минус_ответ(_,_)),fail.

    удалить_факты:-
write("\n\nНажмите пробел для завершения"),
readchar(_).

Назначение системы пользовательского интерфейса - связь вводимых пользователем данных с системой логического вывода. За эту связь отвечает модуль программы - старт.  
Модуль вопрос запрашивает данные у пользователя и сохраняет ответы в базе знаний. Система пользовательского интерфейса имеет вид:

старт:-
makewindow(1,7,7,"expert system",1,16,22,58),
write("     ***********************************************\n\n"),
write("     Введите 'да' или 'нет'в ответ на заданный вопрос.\n\n"),
write("     ***********************************************\n\n"),
дерево(X),!,
write("\nЭто дерево может быть ",X),
nl,nl,удалить_факты.

    старт:-
write("\nНельзя определить какое "),
write(" это дерево. \n\n"),
удалить_факты.

дерево(дуб) if
положительно(Дерево,лиственное),
положительно(Дерево,твердое),
положительно(Дерево,серо_коричневое),
положительно(Дерево,имеет_мелкую_текстуру),!.

 

 

 

Конструктор сайтов - uCoz