Экспертная система по предметной области "Грибы"

Разработка базы данных с применением выбранной модели представления знаний и системы пользовательского интерфейса. Определение системы логического вывода. Спецификация составных частей программы. Обзор основных используемых приёмов и методов обработки.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.05.2013
Размер файла 765,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://allbest.ru/

Министерство общего и профессионального образования РФ

Пензенский Государственный Университет

Кафедра: «Математическое Обеспечение и применение ЭВМ».

Пояснительная записка

к курсовой работе

по дисциплине: «Системы искусственного интеллекта»

на тему: «Экспертная система по предметной области “Грибы”»

Выполнил: студентка Фирсова В.В.

Проверил: Ханов П.В.

2002 г.

Задание

Исходные данные

Разработать базу данных с применением выбранной модели представления знаний, систему логического вывода и систему пользовательского интерфейса, составляющего базовый вариант экспертной системы по предметной области «Грибы». Кроме этого разрабатываемая экспертная система должна обеспечивать наиболее удобный интерфейс, иметь возможность просмотра диалога с пользователем, возможность редактирования базы данных, выдачу ответов с некоторой вероятностью.

Все стадии работы и диалога с пользователем отображать в отдельных окнах и снабжать необходимыми пояснениями.

Используемый язык - Турбо-Пролог 2.0.

Используемые технические средства - IBM PC AT.

Расчётная часть

Выбор модели представления знаний. Определение системы логического вывода. Разработка структур данных. Краткие спецификации составных частей программы (число аргументов предикатов, их назначение, связь с другими предикатами). Основные используемые приёмы и методы обработки.

Экспериментальная часть

Разработка на языке Турбо-Пролог 2.0 программы, реализующей поставленную задачу, её отладка, демонстрация её работоспособности.

Реферат

Область применения - грибы.

Цель работы - согласно заданию необходимо разработать экспертную систему по предметной области «Грибы», используя среду программирования Турбо-Пролог 2.0.

Информационная система должна быть разработана в среде Турбо-Пролог 2.0. и функционировать в операционной системе MS-DOS 7.0.

Содержание

  • Введение
  • 1. Разработка экспертной системы “ Грибы”
    • 1.1 Постановка задачи
      • 1.2 Проектирование
      • 1.3 Спецификация области
      • 1.4 Структура логической программы
  • 2. Кодирование
  • Заключение
  • Список литературы
  • Приложения
  • Введение

Экспертная система - это программа, которая ведёт себя подобно эксперту в некоторой проблемной области. Она должна иметь способность к объяснению своих решений и тех рассуждений, на основе которых эти решения были приняты.

Часто от экспертной системы требуют, чтобы она могла работать с неточной и неполной информацией.

Для того, чтобы построить экспертную систему необходимо создать механизмы, обеспечивающие выполнение следующих функций: решение задач, взаимодействие с пользователем и работа в условия неопределённости. Типичные применения экспертных систем включает в себя такие задачи, как медицинская диагностика, локализация неисправностей в оборудовании и интерпретация результатов измерений.

Часто к экспертным системам предъявляют дополнительное требование - способность иметь дело с неопределённостью и неполнотой. Информация о поставленной задаче может быть неполной или ненадёжной; отношения между объектами предметной области могут быть приближёнными.

Например, может не быть полной уверенности в том, какой цвет гриба (белый или серый, а может он просто грязный): гриб может быть ложным и вызвать отравление. В этом случае необходим вероятностный подход.

При разработке экспертной системы принято делить её на три основных модуля:

База знаний

Машина логического вывода,

Интерфейс с пользователем.

База знаний содержит данные, относящиеся к конкретной прикладной области, в том числе отдельные факты, правила, методы. Она отличается от базы данных тем, что в последней информация пассивна (она либо есть, либо ее нет). База знаний, напротив, активно пытается пополнить недостающую информацию.

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

Интерфейс с пользователем отвечает за бесперебойный обмен информацией между пользователем и системой.

Экспертную систему легко реализовать на Прологе так как, пролог обладает такими качествами как рекурсия, динамическая база данных, отсечение, подключение модулей, предикаты для работы с файлами и многое другое.

Анализ требований

Согласно заданию, необходимо разработать на языке Turbo Prolog экспертную систему по предметной области « Грибы.

Разработанная программа должна:

- содержать базу данных;

выдавать вероятность полученного гриба;

содержать удобный и понятный интерфейс.

Информационная система должна быть разработана в среде Turbo- Prolog 2.0. и функционировать в операционной системе MS-DOS 7.0.

Основными программно-техническими требованиями для нормального функционирования разработанной системы являются:

ЭВМ с процессором не ниже Pentium 75.

ОЗУ - не менее 8 Mb.

Цветной монитор с разрешением экрана не менее 640 на 480 точек.

ОС MS-DOS 7.0.

1. Разработка экспертной системы “ Грибы

1.1 Постановка задачи

Требуется разработать программу, отвечающую некоторым требованиям экспертной системы. Программа выступает в роли эксперта - грибника. Программа должна реализовать опрос консультирующегося человека по данной теме при помощи вопросов и предлагая следующий состав ответов на поставленный вопрос(1-“да”;2-“нет”;3-“не уверен”). Все характеристики гриба разделены по признакам или типам:

Где растёт.

Каков размер шляпки гриба.

Каков цвет шляпки.

Вопрос на уточнение: гриб с мякотью или нет.

Какова форма ножки.

Каков цвет ножки.

Какая длина ножки.

К требованию также относится то, что одинаковые грибы могут иметь разный набор характеристик, а разные грибы не могут иметь одинаковый набор характеристик. Не должно быть повторяемости вопросов, а также не должен задаваться вопрос того же типа, на который уже было отвечено “да”.

При ответе на вопрос “да” программа продолжает опрашивать характеристики текущего гриба. При ответе “нет” программа переходит на следующий гриб. И начинает опрашивать его характеристики, пропуская те, на которые уже были даны ответы “да”, до первого вопроса, на который было отвечено “нет” или до вопроса который ещё не задавался. При ответе “не уверен” программа уменьшает вероятность конечного выбора и подразумевает этот ответ как “да” и “нет” и продолжает опрос характеристик этого гриба, при других ответах (“да”, “нет”) вероятность не изменяется.

1.2 Проектирование

Экспертная система состоит из оболочки и базы знаний реализованной на фактах турбо-пролога.

База знаний программы представляет собой 2 файла:

1)Файл с описанием гриба с его списком характеристик(Baza.pro)

2)Файл с вопросами или с характеристиками(Vopros.pro).

Ниже приведены эти файлы:

Файл Baza.pro

Domains

Cond=integer*

GATE=Symbol

Predicates

rule(RNO,GATE,GATE,Cond)

Clauses

rule(1,"Гриб","Рыжик сосновый",[10,20,90,120,160,190,200,210,230,250,310,340]).

rule(211,"Гриб","Рыжик",[30,90,120,160,190,200,210,230,250,310,340]).

rule(2,"Гриб","Рыжик еловый",[10,15,90,120,160,180,200,225,230,250,310,340]).

rule(3,"Гриб", "Груздь настоящий(Сырой)", [30,50,90,130,155,175,190,205,220,230,280,310,340]).

rule(4,"Гриб","Груздь желтый", [30,50,90,110,155,175,190,205,220,230,280,310,340]).

rule(5,"Гриб","Груздь дубовый", [30,55,90,110,155,170,190,205,220,230,290,310,330]).

rule(6,"Гриб","Груздь осиновый", [30,58,90,130,155,175,190,205,220,230,260,280,310,340]).

rule(7,"Гриб","Груздь черный(Чернуха или цыган)",[30,50,90,140,155,175,190,205,220,230,300,310,340]).

rule(8,"Гриб","Лисичка настоящая", [10,15,70,110,160,190,230,260,300,310,330]).

rule(9,"Гриб","Лисичка настоящая", [30,70,110,160,190,230,260,300,310,330]).

rule(10,"Гриб","Лисичка настоящая", [10,15,70,110,160,190,230,260,300,325,330]).

rule(11,"Гриб","Лисичка настоящая", [30,70,110,160,190,230,260,300,325,330]).

rule(12,"Гриб","Лисичка желтеющая", [10,20,65,140,160,190,230,260,290,325,330]).

rule(13,"Гриб","Волнушка розовая(волжанка)",[30,50,80,100,155,170,180,220,230,260,290,310,340]).

rule(14,"Гриб","Волнушка розовая(волжанка)",[40,80,100,155,170,180,220,230,260,290,310,340]).

rule(15,"Гриб","Волнушка белая(Белянка)(Белянка пушистая)",[30,50,80,130,155,170,180,220,230,260,290,310,340]).

rule(16,"Гриб","Волнушка белая(Белянка)(Белянка пушистая)",[40,80,130,155,170,180,220,230,260,290,310,340]).

rule(17,"Гриб","Сыроежка сереющая",[10,20,70,120,170,205,230,270,290,320,330]).

rule(18,"Гриб","Сыроежка сереющая",[10,20,70,140,170,205,230,270,290,320,330]).

rule(19,"Гриб","Сыроежка родственная",[10,70,130,170,205,230,270,300,320,330]).

rule(20,"Гриб","Сыроежка родственная",[10,70,140,170,205,230,270,300,320,330]).

Файл Vopros.pro

Domains

BNO,RNO,Nom=integer

Predicates

Cond(BNO,STRING,Nom)

Clauses

Cond(10,"Растет в хвойных лесах",1).

Cond(20,"Растет в сосновых лесах",2).

Cond(15,"Растет в еловых лесах",2).

Cond(30,"Растет в лиственных лесах",1).

Cond(40,"Растет в смешанных лесах",1).

Cond(50,"Растет в березняках",2).

Cond(55,"Растет в дубравах",2).

Cond(58,"Растет в осиновых или тополевых лесах",2).

Cond(65,"2 < шляпка < 5 см",4).

Cond(70,"5 < шляпка < 10 см",4).

Cond(80,"10 < шляпка < 15 см",4).

Cond(90,"15 < шляпка < 20 см",4).

Cond(100,"Цвет шляпки розоватый",5).

Cond(110,"Цвет шляпки желтый или желтовато - золотистый",5).

Cond(120,"Цвет шляпки оранжево красный",5).

Cond(130,"Цвет шляпки белый или грязновато белый",5).

Cond(140,"Цвет шляпки бурый, коричневатый или серый",5).

Cond(150,"Шляпка покрыта серыми хлопьями",6).

Cond(155,"Шляпка с мохнатым краем",6).

Cond(160,"Внутри ножки есть мякоть",7).

Cond(170,"Внутри ножка полая",7).

Cond(175,"Ножка плотная (сплошная) ",7).

Cond(180,"Мякоть гриба рыхлая",8).

Cond(190,"Мякоть гриба плотная, мясистая",8).

Cond(200,"Мякоть внутри ножки белая",9).

Cond(205,"Мякоть гриба белая",91).

Cond(210,"Млечный сок желтоватый",10).

Cond(220,"Млечный сок белый",10).

Cond(225,"Млечный сок красноватого цвета",10).

Cond(230,"Есть пластинки, приросшие к ножке",11).

Cond(240,"Без пластинок ",11).

Cond(250,"Ножка цилиндрическая (ровный цилиндр) без явных утолщения ",13).

Cond(260,"Ножка цилиндрическая, утолщенная сверху",13).

Cond(270,"Ножка цилиндрическая, утолщенная снизу",13).

Cond(280,"Ножка толстая",14).

Cond(290,"Ножка очень узкая 0.8-2см толщины",14).

Cond(300,"Ножка узкая от 2 до 4 см толщины",14).

Cond(310,"Ножка примерно одного цвета со шляпкой",15).

Cond(320,"Ножка белая",15).

Cond(325,"Ножка желтая",15).

Cond(330,"Ножка длинная от 6 см ",16).

1.3 Спецификация области

Исследуемая область - грибы.

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

Все грибы разделены по признакам. Главные из которых - это места их роста, размер шляпки, а также цвет гриба. Все оставшиеся характеристики только для уточнения гриба.

Вопросы также разделены на группы. Их разделяют при помощи типа. Тип указан последним параметром в предикате Cond(). Так, например первый тип вопросов выясняет, где растёт гриб, четвёртый тип вопросов выясняет размер шляпки.

1.4 Структура логической программы

пользовательский интерфейс логический спецификация

Метод подсчета вероятности реализован следующим образом:

Сначала определяется тип вопроса, на который был получен ответ “не уверен”. Затем подсчитывается количество вопросов данного типа(K). Результирующая вероятность(R) равна: предыдущая вероятность(P) минус результат от деления предыдущей вероятности (P) на количество вопросов данного типа(K).

Формула:

R=P-P/K.

Рассмотрим случаи вычисления вероятностей:

Допустим, мы ответили “не уверен” на вопрос типа N, кол-во вопросов которого равно двум. Тогда вероятность ответа будет равна 50% . Если мы на остальные вопросы ответим “да”, то эта вероятность будет конечной.

Если мы ответили “не уверен” на вопрос типа N, кол-во вопросов которого равно десяти, то вероятность будет равна 90%. Если мы ответим ещё раз “не уверен” на вопрос типа M, кол-во вопросов которого равно 10, то вероятность будет равна 81%. Эта вероятность окажется конечной, если мы на оставшиеся вопросы ответим “да”.

Получилось, что вероятность, полученная во втором случае, больше вероятности полученной в первом случае.

Почему же так получилось: ведь мы во втором случае сомневались больше чем в первом. Ответ на данный вопрос можно сформулировать таким образам: чем больше кол-во вопросов определённого типа, тем меньшую роль они играют в определении гриба. Например, кол-во вопросов, которые уточняют - где растёт гриб равно трём.(1.“Растёт в хвойных лесах?” 2. “Растёт в лиственных лесах?” 3. “Растёт в смешанных лесах?”)

Кол-во вопросов, которые уточняют цвет гриба равно пяти.

И получается вопросы, которые уточняют - где растёт гриб, играют более важную роль в определении гриба, чем вопросы, которые уточняют цвет гриба.

Как исключается повторение вопросов одного типа:

При ответе “да” в динамическую базу данных yes() помещается номер вопроса, на который был получен ответ “да”, а в динамическую базу данных no() помещаются номера вопросов, типы которых совпадают с типом вопроса, на который было отвечено “да”. И затем при откате производится проверка наличия номеров в базах yes() и no() и neuveren(). При ответе на вопрос “не уверен” в динамическую базу данных neuveren() помещаются номера всех вопросов данного типа, а в базы данных

no() и yes() ничего не заносится.

Рассмотрим на примере 2-ух грибов реализацию программы:

Возьмём для примера 2 первых гриба “Рыжик сосновый” и “Рыжик”.

Мы запустили программу и выбрали пункт меню “консультация”. Система задает первый вопрос следующим образом: вызывая предикат rule, пролог берёт первый попавшийся гриб в файле Baza.pro, т.е. начинается уточнение гриба “Рыжик сосновый” с номером 1. В список Cond возвращен список характеристик или вернее их числовые значения. Мы отделяем голову и по этому номеру вызываем правило Cond из модуля Vopros.pro. В переменную Text возвращается текст вопроса или по-другому характеристика.

Так система задала первый вопрос и ждёт, когда пользователь ответит на него. В нашем случае это вопрос “Растет в хвойных лесах”. Рядом с вопросом находится подсказка, как отвечать, она выглядит так(1-да,2-нет,3-не уверен). Допустим, мы согласны, и должны ответить “да” тогда мы вводим 1 и нажимаем Enter.

Далее система анализирует введённый символ. Если 0 то на выход, если 1, то она помещает номер вопроса в динамическую базу в виде yes(номер) и одновременно все вопросы из этой области помещает в базу в виде no(номер). Это означает, что если мы выбрали хвойные леса, то лиственные нас не интересуют. Если 2, то система помещает номер данного вопроса в базу в виде no(номер) и производит откат назад.

Если 3, то система помещает номер вопроса в базу в виде neuveren(номер), а также номера всех вопросов этого типа и вычисляет вероятность следующим образом: сначала подсчитывается кол-во вопросов данного типа K, затем берётся предыдущее значение вероятности P и от него отнимается результат от деления P/K и передается новая вероятность далее в программу, в уже рассмотренных случаях вероятность просто сохраняется.

Мы ответили “да” т.е. 1 значит, мы выполнили все действия, описанные далее и, продолжаем опрос: берём хвост списка наших характеристик и от него отделяем голову.

Проверяем на наличие номера вопроса в динамических базах no(), yes(), neuveren() если там его нет, то задаём вопрос и всё пошло заново. В нашем случае вопрос будет таким - “Растёт в сосновых лесах”. Идёт уточнение, где именно растёт гриб.

Если мы будем на все вопросы отвечать “да”, то нам будет выдан результат “Рыжик сосновый” и вероятность 100%.

Рассмотрим другой случай: если мы ответим на 1 и 2 вопрос “неуверен” то программа выдаст результат ““Рыжик сосновый” и вероятность 34%.” и “Рыжик” с вероятностью 67%. Как это произошло? После того как мы ответили на первые 2 вопроса “неуверен” мы номера 10, 20 поместили в базу neuvren() а также номера вопросов этих же типов в данном случае 1 тип - 30, 40; 2 тип - 15, 50, 55, 58. А на остальные вопросы мы ответили “да”, т.е. поместили их номера в базу yes().

После опроса всего списка или всех характеристик первого гриба программа продолжает искать гриб, у которого 1 и 2 характеристики того типа что 10 и 20, а конец списка характеристик должен совпадать с уже опрошенными, что мы и видим в нашем случае.

Если мы ответим “нет” на первый вопрос, то программа откатится от первого гриба и начнёт опрос характеристик 2 гриба. Если ответим на все вопросы “да” то получим ответ “Рыжик”.

Если мы ответим “нет” на вопрос 3 или 4, то система станет опрашивать характеристики других грибов, а может ответить, что такого гриба не знает.

2. Кодирование

Классификация разработанных предикатов представлена на рис. 1

Краткая спецификация предикатов:

Nachalo - главный предикат он предназначен для вызова предиката реализующего меню.

My_menu - предикат предназначен для прорисования меню и ждет, какой пункт меню выбран

ReadKey, ReadKey 1, ReadKey 2 - предикаты анализа нажатой клавиши

KeySelect - в зависимости от нажатой клавиши выделяет активный пункт меню

Nach_cur - устанавливает курсор в исходное положение (1-й пункт меню)

Proces(integer) - реализует выбранный пункт меню. Параметр его показывает, какой пункт меню выбран (выход или консультация).

Consultat(GATE) - промежуточный предикат реализации самого процесса выбора решения. Параметр задает, по какой предметной области будем работать, если их несколько. В нашем случае предметная область одна.

Clear - предикат очистки баз знаний.

Init(integer,integer,integer,integer) - предикат для инициализации, какая клавиша нажата и если это клавиша вверх или вниз, то выполнение соответствующих действий. Первый параметр содержит код нажатой клавиши, второй содержит текущий пункт, третий возвращает следующий пункт, последний параметр содержит количество пунктов в меню.

Readkey(integer,integer,integer,integer) - предназначен для возврата, какой пункт меню выбран и для перерисовки выделенного пункта меню. Первый пункт содержи код нажатой клавиши, второй содержит текущий пункт, третий содержит количество пунктов меню, и последний возвращает результат выбора.

No_Zap(BNO) - промежуточный предикат для вызова, следующего предиката. Параметр содержит номер вопроса, на который было отвечено “да”.

Zap(Nom,BNO) - предикат предназначен, для того чтобы поместить в динамическую базу yes () номера вопросов типа nom кроме вопроса с номером BNO. Параметр первый содержит тип вопроса, на который отвечено “да”, второй параметр содержит номер вопроса, на который отвечено “да”.

Neuveren_Zap(BNO) - промежуточный предикат для вызова, следующего предиката. Параметр содержит номер вопроса, на который было отвечено “неуверен”.

Zap_n(Nom) - предикат предназначен, для того чтобы поместить в динамическую базу neuveren() номера вопросов типа nom. Параметр содержит тип вопроса, на который отвечено “неуверен”.

Rabota(Cond,GATE,real) - начинает работать с базой знаний и перебирает все возможные варианты ответа, а также выводит результат поиска и опроса на экран. Параметр первый содержит список перебранных вариантов, но в данном случае он содержит только один номер ответа, второй содержит ответ или название гриба, третий вероятность ответа.

Proverka(RNO,Cond,Cond,real,real) - проверяет, был ли задан вопрос с текущим номером и в какой базе он находится и делает соответствующие действия если его ни водной базе, то он задаёт это вопрос. Первый параметр содержит номер текущего варианта ответа, второй должен содержать список перебранных вариантов, но в данном случае не задействован, третий содержит список оставшихся не выясненных характеристик,4 и 5 содержит вероятности, причём 4 текущую, а 5 результирующую.

Vopros(Cond,RNO,BNO,String,real,real) - выводит текст вопроса на экран и ждет выбора ответа и передаёт свои полномочия предикату OTVET(). Первый параметр содержит список перебранных вариантов ответов, второй номер текущего варианта ответа, третий номер текущего вопроса, четвёртый текст вопроса, 5 и 6 содержит вероятности, причём 5 текущую, а 6 результирующую.

Otvet(Cond,RNO,String,BNO,integer,real,real) - проверят какой выбран ответ и в соответствии с этим выполнят некоторые действия. Первый параметр содержит список перебранных вариантов ответов, второй номер текущего варианта ответа, третий текст вопроса, четвёртый номер текущего вопроса, пятый номер варианта ответа, 5 и 6 содержит вероятности, причём 5 текущую, а 6 результирующую.

Opred_Kolva_Cond(integer,integer) - промежуточный предикат для подсчёта количества вопросов одного типа. Первый параметр номер текущего вопроса, второй возвращает количество вопросов.

Kolvo(Cond,integer,integer) - подсчитывает количество вопросов заданного типа. Первый параметр содержит список вопросов одного типа, второй текущее количество, третий возвращает результат.

Vivod_Yes - предикат помещает в данных базу данных OTV() едницу если был выбран хотя бы один вариант ответа.

Заключение

В ходе курсовой работы была разработана экспертная система по предметной области «Грибы» на языке программирования TurboProlog.

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

- выдаёт промежуточное значение вероятности;

выдаёт результат опроса и вместе с ним конечную вероятность.

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

Список литературы

1. Малпас Дж. Реляционный язык Пролог и его применение.- М.: Наука, 1990.-464 с.

2. Братко И. Программирование на языке Пролог для искусственного интеллекта. - .: Мир, 1990.-560 с.

3. Курс лекций по предмету “Системы искусственного интеллекта” Михалев А.Г.

4. «Встроенные предикаты Турбо- Пролога»: методические указания часть 1,2,3/ Б.В. Казаков, И.А. Казакова, А.Г. Михалёв, О.С. Дорофеева; под редакцией проф. Б.Г. Хмелевского. - Пенза: издательство ПГУ, 1998 г.

Приложения

Приложение А

Листинг программы)

Файл Menu.pro

%trace

code=4000

include "ex.pro"

Domains

P=integer

KEY = other; esc; up ; down; enter; fkey(integer); char(integer)

Predicates

Nachalo

My_menu

Nach_cur(integer)

KeySelect(KEY,integer,integer)

Vozwrat(integer,integer)

Default(integer)

ReadKey(KEY)

ReadKey1(KEY,char,integer)

ReadKey2(KEY,integer)

Proces(integer)

Clauses

%--------------------------------------------------------------

Nachalo :-

makewindow(1,7,32,"Экспертная система",0,0,25,80),

My_menu,

clear,

exit.

%--------------------------------------------------------------

My_menu:-

makewindow(4,30,47," КОНСУЛЬТАНТ ПО ГРИБАМ ",9,21,9,38),nl,

write(" 1 Консультация"),nl,

write(" 2 Редактирование (Vopros.pro)"),nl,

write(" 3 Редактирование (Baza.pro)"),nl,

write(" 4 Помощь"),nl,

write(" 5 Выход"),

Default(1).

%--------------------------------------------------------------

Default(Pos):-

Nach_cur(Pos),

ReadKey(KEY),

KeySelect(KEY,Pos,Pos_a),

Default(Pos_a).

%--------------------------------------------------------------

Nach_cur(Pos):-

Pos=1,

field_attr(1,1,33,112),

cursor(1,1); Pos<>0,!.

%--------------------------------------------------------------

Vozwrat(A,B):- A>4,B=0,!;A<1,B=5,!;B=A,!.

%--------------------------------------------------------------

ReadKey(KEY):-

readchar(T),

char_int(T,VAL),

ReadKey1(KEY,T,VAL).

%--------------------------------------------------------------

ReadKey1(KEY,_,0):-

!,readchar(T),

char_int(T,VAL),

ReadKey2(KEY,VAL).

ReadKey1(esc,_,27):-!.

ReadKey1(enter,_,13):-!.

ReadKey1(char(T),T,_).

%--------------------------------------------------------------

ReadKey2(up,72):-!.

ReadKey2(down,80):-!.

ReadKey2(other,77):-!.

ReadKey2(other,75):-!.

%--------------------------------------------------------------

KeySelect(KEY,P,P):-

KEY=esc,

clear,

exit.

KeySelect(KEY,P,P):-

KEY=enter,

Proces(P),!.

KeySelect(KEY,Pos_e,Pos_a):-

KEY=down,

field_attr(Pos_e,1,33,30),

Vozwrat(Pos_e,S),

M=S+1,

cursor(M,1),

field_attr(M,1,33,112),

Pos_a=M,!.

KeySelect(KEY,Pos_e,Pos_a):-

KEY=up,

field_attr(Pos_e,1,33,30),

Stop=Pos_e-1,

Vozwrat(Stop,S),

cursor(S,1),

field_attr(S,1,33,112),

Pos_a=S,!.

KeySelect(_,P,P):- !.

%--------------------------------------------

Proces(1):-

removewindow,

Consultat("Гриб"), %ex.pro

clear,

asserta(otv(2)),

readchar(_),

clearwindow,

My_menu.

Proces(2):-

removewindow,

file_str("Vopros.pro", S),

edit(S,A,"","Vopros.pro","",1,"",1,0,1,0,_,_),

openwrite(myfile,"Vopros.pro"),

writedevice(myfile),

write(A),

closefile(myfile),

clearwindow,

My_Menu.

Proces(3):-

removewindow,

file_str("Baza.pro", S),

edit(S,A,"","Baza.pro","",1,"",1,0,1,0,_,_),

openwrite(myfile,"Baza.pro"),

writedevice(myfile),

write(A),

closefile(myfile),

clearwindow,

My_menu.

Proces(4):-

removewindow,

makewindow(4,75,47," ПОМОЩЬ ",1,5,23,70),nl,

file_str("Help.txt",S),

display(S),

removewindow,

My_menu.

Proces(5):-

clear,

exit.

%======================

Goal

Clear,

asserta(otv(2)),

Nachalo.

Файл EX.pro

include "Baza.pro"

Domains

file = myfile

Database

yes(BNO)

no(BNO)

veroyat(Integer)

neuveren(BNO)

otv(Integer)

grib(String)

%==============================================

Predicates

Consultat(GATE)

Clear

No_Zap(BNO)

Zap(Nom,BNO)

Neuveren_Zap(BNO)

Zap_n(Nom)

Rabota(Cond,GATE,integer)

Proverka(RNO,Cond,Cond,integer,integer)

Vopros(Cond,RNO,BNO,String,integer,integer)

Otvet(Cond,RNO,String,BNO,integer,integer,integer)

Opred_Kolva_Cond(integer,integer)

Kolvo(Cond,integer,integer)

Vivod_Yes

%==============================================

Clauses

Consultat(X):-not(Rabota([],X,100)),otv(1),!.

Consultat(_):-nl,Write("К сожалению я не могу удовлетворить ваше любопытство,"),nl,

Write("но рекомендую не употреблять этот гриб в пищу без"),nl,

Write("дополнительных консультаций."),nl,

Write(" Всего доброго!!! "),nl,clear.

Consultat(_).

%--------------------------------------------

Rabota(_,X,Y):-

not(rule(_,X,_,_)),!,not(grib(X)),

nl,write("Ваш выбор это - ",X," с уверенностью - ",Y,"%"),

asserta(grib(X)),nl.

Rabota(History,X,_):-rule(RNO,X,Ny,Cond),

Proverka(RNO,History,Cond,100,Z),

Vivod_Yes,

Rabota([RNO|History],Ny,Z),fail.

Rabota(_,_,_):-fail.

%--------------------------------------------

Proverka(RNO,History,[BNO|Rest],P,Z):-yes(BNO),!,

Proverka(RNO,History,Rest,P,Z).

Proverka(RNO,HISTORY,[BNO|REST],P,Z):-Neuveren(BNO),!,

Opred_Kolva_Cond(BNO,I),

P1=P-P/I,

Proverka(RNO,History,Rest,P1,Z).

Proverka(_,_,[BNO|_],_,_):-No(BNO),!,fail.

Proverka(RNO,History,[BNO|Rest],P,Z):-

otv(2),Cond(BNO,TEXT,_),

P<>0,

write("Вероятность - ",P),nl,

Vopros(History,RNO,BNO,TEXT,P,P1),

Proverka(RNO,History,Rest,P1,Z).

Proverka(_,_,[],P,P):-P<>0.

%--------------------------------------------

Vopros(History,RNO,BNO,TEXT,P,P1):-Write("Вопрос: ",TEXT," ?"),

Write(" (1-да;2-нет;3-не уверен.) "),

Readint(Resp),

Otvet(History,RNO,TEXT,BNO,Resp,P,P1).

%--------------------------------------------

Otvet(_,_,_,_,0,P,P):-exit.

Otvet(_,_,_,BNO,1,P,P):-!,Asserta(yes(BNO)),No_Zap(BNO),

write("<ДА>"),nl.

Otvet(_,_,_,BNO,2,P,P):-!,Asserta(no(BNO)),

write("<НЕТ>"),nl,Fail.

Otvet(_,_,_,BNO,3,P,P1):-!,Neuveren_Zap(BNO),

Opred_Kolva_Cond(BNO,I),

write("<НЕ УВЕРЕН>"),nl,

P1=P-P/I.

Otvet(History,RNO,Text,BNO,_,P,P1):-Vopros(History,RNO,BNO,TEXT,P,P1),!.

%--------------------------------------------

Vivod_Yes:-otv(2),asserta(otv(1)),Retract(otv(2)),!.

Vivod_Yes:-!.

%--------------------------------------------

Opred_Kolva_Cond(B,K):-Cond(B,_,T),findall(X,cond(X,_,T),L),

Kolvo(L,0,I),K=I.

%--------------------------------------------

Neuveren_Zap(Bn):-Cond(BN,_,T),Zap_n(T).

%--------------------------------------------

Zap_n(T):-Cond(B,_,T),not(asserta(neuveren(B))).

Zap_n(_).

%--------------------------------------------

No_Zap(Bn):-Cond(BN,_,T),Zap(T,Bn).

%--------------------------------------------

Zap(T,Bn):-Cond(B,_,T),Bn<>B,not(asserta(no(B))).

Zap(_,_).

%--------------------------------------------

Kolvo([],I,I):-!.

Kolvo([_|T],J,I):-J1=J+1,Kolvo(T,J1,I).

%--------------------------------------------

Clear:-retract(yes(_)),fail.

Clear:-retract(no(_)),fail.

Clear:-retract(neuveren(_)),fail.

Clear:-retract(otv(_)),fail.

Clear:-retract(veroyat(_)),fail.

Clear:-retract(grib(_)),fail.

Clear.

Приложение Б

Результаты работы программы

Вариант опроса 1:

Вероятность - 100

Вопрос: Растет в хвойных лесах ? (1-да;2-нет;3-не уверен.) <НЕУВЕРЕН>

Вероятность - 67

Вопрос: Растет в сосновых лесах ? (1-да;2-нет;3-не уверен.) <НЕУВЕРЕН>

Вероятность - 34

Вопрос: 15 < шляпка < 20 см ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Цвет шляпки оранжево- красный, красноватый ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Внутри ножки есть мякоть ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Мякоть гриба плотная, мясистая ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Мякоть внутри ножки белая ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Млечный сок желтоватый ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Есть пластинки приросшие к ножке ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Ножка цилиндрическая(ровный цилиндр) без явных утолщения ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Ножка примерно одного цвета со шляпкой ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 34

Вопрос: Ножка короткая до 6 см ? (1-да;2-нет;3-не уверен.) <ДА>

Ваш выбор это - Рыжик сосновый с уверенностью - 34%

Ваш выбор это - Рыжик с уверенностью - 67%

Вариант опроса 2:

Вероятность - 100

Вопрос: Растет в хвойных лесах ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 100

Вопрос: Растет в сосновых лесах ? (1-да;2-нет;3-не уверен.) <НЕТ>

Вероятность - 100

Вопрос: Растет в еловых лесах ? (1-да;2-нет;3-не уверен.) <НЕУВЕРЕН>

Вероятность - 50

Вопрос: 15 < шляпка < 20 см ? (1-да;2-нет;3-не уверен.) <НЕТ>

Вероятность - 50

Вопрос: 5 < шляпка < 10 см ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 50

Вопрос: Цвет шляпки желтый или желтовато - золотистый ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 50

Вопрос: Внутри ножки есть мякоть ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 50

Вопрос: Мякоть гриба плотная, мясистая ? (1-да;2-нет;3-не уверен.) <НЕУВЕРЕН>

Вероятность - 25

Вопрос: Есть пластинки приросшие к ножке ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 25

Вопрос: Ножка цилиндрическая, утолщенная сверху ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 25

Вопрос: Ножка узкая от 2 до 4 см толщины ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 25

Вопрос: Ножка примерно одного цвета со шляпкой ? (1-да;2-нет;3-не уверен.) <ДА>

Вероятность - 25

Вопрос: Ножка длинная от 6 см ? (1-да;2-нет;3-не уверен.) <НЕУВЕРЕН>

Ваш выбор это - Лисичка настоящая с уверенностью - 13%

Вариант опроса 3:

Вероятность - 100

Вопрос: Растет в хвойных лесах ? (1-да;2-нет;3-не уверен.) <НЕТ>

Вероятность - 100

Вопрос: Растет в лиственных лесах ? (1-да;2-нет;3-не уверен.) <НЕТ>

Вероятность - 100

Вопрос: Растет в смешанных лесах ? (1-да;2-нет;3-не уверен.) <НЕТ>

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

Всего доброго!!!

Размещено на Allbest.ru


Подобные документы

  • Анализ процессов диагностики повреждений трубопровода. Разработка модели продукционной базы знаний: обзор методов представления знаний, описание создания базы знаний и разработки механизма логического вывода. Экономическое обоснование концепции проекта.

    дипломная работа [3,0 M], добавлен 16.04.2017

  • Структура экспертной системы: база знаний, механизм вывода, система пользовательского интерфейса. Анализ требований, проектирование системы "Подбор сотовых телефонов". Спецификация области, кодирование. Листинг программы, результаты тестирования.

    курсовая работа [24,5 K], добавлен 12.05.2013

  • Обобщенная структура и принципы функционирования экспертных систем. Выбор модели представления знаний. Разработка логического блока программы и графического пользовательского интерфейса. Текст программы и экспериментальная оценка результатов работы.

    дипломная работа [2,4 M], добавлен 06.03.2013

  • Системный анализ предметной области. Построение концептуальной и даталогичной модели базы данных. Физическое проектирование базы данных. Описание функциональной модели системы управления базами данных. Разработка экранных форм ввода-вывода и отчета.

    курсовая работа [1,1 M], добавлен 09.12.2014

  • Анализ предметной области. Разработка генетического алгоритма для оптимизации инвестиций. Спецификация требований и прецедентов. Проектирование пользовательского интерфейса информационной системы. Модели данных, используемые в системе и их взаимодействие.

    дипломная работа [2,1 M], добавлен 24.08.2017

  • Создание и разработка информационной системы автоматизации учета книг в книжном магазине. Описание предметной области, постановка задачи и обзор методов ее решения. Модели и алгоритмы представления системы. Обоснование технических и программных средств.

    курсовая работа [1,7 M], добавлен 31.03.2012

  • Фреймовые модели представления знаний. Разработка структуры фреймов для реализации экспертной системы. Разработка экспертной системы с фреймовой моделью представления знаний. Редактирование базы фактов кандидатов и описание режима консультации.

    курсовая работа [1,3 M], добавлен 13.10.2012

  • Выделение объектов предметной области и взаимосвязей между ними. Разработка ER-модели на логическом уровне с использованием системы Erwin Data Modeler. Проектирование даталогической и реляционной модели в среде выбранной системы управления базами данных.

    курсовая работа [905,6 K], добавлен 26.12.2013

  • Анализ предметной области. Обеспечение качества проектной документации. Построение инфологической (концептуальной) модели предметной области. Проектирование физической структуры базы данных. Разработка интерфейса, организация ввода и поиска данных.

    курсовая работа [2,5 M], добавлен 10.01.2016

  • Программирование полнофункциональной системы учета для предметной области "Концертный зал": построение концептуальной и реляционной моделей базы данных, описание способов реализации запросов и вывода отчета на экран, разработка интерфейса пользователя.

    курсовая работа [1,5 M], добавлен 22.11.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.