Разработка фрагментов оболочки экспертной системы icon

Разработка фрагментов оболочки экспертной системы



НазваниеРазработка фрагментов оболочки экспертной системы
Дата конвертации26.07.2012
Размер217,87 Kb.
ТипРеферат
Разработка фрагментов оболочки экспертной системы


Государственный комитет Российской Федерации по Высшему Образованию Московский Государственный институт радиотехники, электроники и автоматики Факультет: Кибернетики Кафедра: ИТС Курсовой проект Дисциплина: Фунциональное программирование Тема: Разработка фрагментов оболочки экспертной системы Задание: Л.10 Студент: Рыбина М. А. Группа: АИ-1-93 Руководитель: Холкин И.И. МОСКВА 1996 СодержаниеЗадание.........................................................................................................3Введение.......................................................................................................4 1. Название программы и ееавтор..........................................................5 2. Анализ предметнойобласти.................................................................5 3. Выбор способа представлениязнаний................................................6 4. Разработка меню экспертнойсистемы...............................................10 5. Разработка процедуроболочки..........................................................12 6. Описание программы на micro-LISP..................................................20 7. Краткое описание встроенных предикатов и функций micro-LISP, используемых впрограмме................................21 8. Отладкапрограммы...............................................................................23 9. Инструкция пользователю и примервыполнения.............................23Заключение...................................................................................................24 Библиографическийсписок........................................................................26ПриложениеА..................................................................................................27ПриложениеВ..................................................................................................35 Задание № л.10 на курсовое проектирование по дисциплине "Функциональное программирование" студенту: Рыбиной Марине Анатольевне группа АИ-1-93 1. Тема исследования: Разработка фрагментов оболочки экспертной системы. 2. Исходные данные 2.1 Предметная область - заболевания гортани: ларингит острый,ларингит хронический катаральный, ларингит хронический гипертрофический,ларингит хронический атрофический 2.2 Язык программирования microLISP 3. Перечень вопросов, подлежащих разработке 3.1 Провести анализ предметной области и выбрать способ представления знаний 3.2 Разработать меню, обеспечивающее взаимодействие пользователя с системой, предусмотрев режимы: 3.2.1 Добавления в БЗ 3.2.2 Загрузки БЗ 3.2.3 Просмотра 3.2.4 Корректировки 3.2.5 Сохранения 3.2.6 Удаления 3.2.7 Логического вывода 3.2.8 Объяснения логического вывода 4. Перечень графических материалов 4.1 Структура меню 4.2 Структурная схема программы 5. Календарный план-график 5.1 Получение задания 12.03.96 5.2 Анализ задания, постановка задачи, подбор литературы 19.03.96 5.3 Анализ предметной области и проектирование БЗ 26.03.96 5.4 Разработка меню и структуры программы 2.04.96 5.5 Разработка процедур оболочки экспертной системы 16.04.96 5.6 Отладка программы 30.04.96 5.7 Оформление пояснительной записки и сдача на проверку 14.05.96 8. Защита 21.05.96 Руководитель /Холкин И.И.: _____________ Студент /Рыбина М.А: _____________ Введение Сегодня всем, кто работает в области информатики или интересуетсяэтой новой областью науки, известен термин "экспертные системы".Экспертная система (expert system, knowledge based system) - этопрограммная система, знания и умения которой сравнимы с умением и знаниямиспециалистов в какой-нибудь специальной области знаний. Экспертные системывместе с системами обработки естественных языков являются наиболееважными в коммерческом плане областями использования искусственногоинтеллекта. В рамках исследования искусственного интеллекта созданы многочисленныеэкспертные системы для разных областей знания, таких, например, какмедицинская диагностика и обследование пациентов, генные и молекулярныеисследования, составление конфигурации вычислительных машин,образование, поиск неисправностей в устройствах и системах и многие другиепрактические приложения. В этой работе разрабатывается экспертная система,связанная с диагностикой заболеваний. 1. Название программы и ее автор Данная программа (FUN.LSP) написана на языке microLISP в текстовомредакторе NortonEdit. Программа работает с базой знаний, находящейся вотдельном файле. В данном случае - BD2.LSP. Программу разработали студенты группы АИ-1-93 Частухин Виталий и РыбинаМарина. Необходимо отметить, что в работе использованы материалысоответствующих разработок студентов группы АИ-1-92. 2. Анализ предметной области В данной курсовом проекте предметную область составляют заболеваниягортани, а именно: ларингит острый, ларингит хронический катаральный,ларингит хронический гипертрофический, ларингит хронический атрофический. У каждой болезни имеется набор признаков или, выражаясь медицинскимитерминами, симптомов. Для удобства восприятия анализ предметной области сведен в таблицу 1.В ней в столбцы обозначены названиями болезней, а строки - названиямисимптомов. На пересечении соответствующих столбцов и строк стоит знак "+",если симптом действительно принадлежит исследуемой болезни. Одни и те жесимптомы могут являться признаками одной и той же болезни, поэтомунекоторые из них (симптомов) перекрываются. таблица1| симптом ( |ларингит |ларингит |ларингит |ларингит || |острый |хроническ|хронически|хронический ||болезнь( | |ий |й |атрофический || | |катаральн|гипертрофи| || | |ый |ческий | ||1. общее недомогание |+ |+ |+ |+ ||2. сухость першение, саднение |+ |+ | |+ ||3. кашель сначала сухой, затем |+ | | | ||с мокротой | | | | ||4. голос хриплый или беззвучный|+ |+ | |+ ||5. иногда боль при глотании |+ | | | ||6. головная боль |+ | | | ||7. повышение температуры тела |+ | | | ||8. быстрая утомляемость голоса | |+ | | ||9. периодический кашель с | |+ | | ||мокротой | | | | ||10. охриплость с афонией | | |+ | ||11. ощущение неловкости | | |+ | ||12. жжение в горле | | |+ | ||13. кашель при обострении | | |+ | ||14. сухой кашель | | | |+ ||15. слизистая покрыта густой | | | |+ ||слизью | | | | ||16. откашливание с прожилками | | | |+ ||крови | | | | |Следующим этапом проектирования будет являться разработка (выбор) способапредставления этих знаний. 3. Выбор способа представления знаний Чтобы проводить эспертизу, компьютерная программа должна бытьспособна решать задачи посредством логического вывода и получатьпри этом достаточно надежные результаты. Программа должна иметьдоступ к системе фактов, называемой базой знаний. Программа такжедолжна во время консультации выводить заключения изинформации, имеющейся в базе знаний. Некоторые экспертные системымогут также использовать новую информацию, добавляемую во времяконсультации. Экспертную систему, таким образом, можно представлятьсостоящей из трех частей: 1. База знаний (БЗ) 2. Механизм вывода (МВ) 3. Система пользовательского интерфейса (СПИ) База знаний - центральная часть экспертной системы. Она содержитправила, описывающие отношения или явления, методы и знания для решениязадач из области применения системы. Можно представлять базузнаний состоящей из фактических знаний и знаний, которые используются длявывода других знаний. Утверждение "Джон Ф. Кеннеди был 35-м президентомСоединенных Штатов" - пример фактического знания. "Если у вас болит голова,то примите две таблетки цитрамона" - пример знания для вывода. Сама база знаний обычно располагается на диске или другом носителе. Механизм вывода содержит принципы и правила работы.Механизм вывода "знает", как использовать базу знаний так, чтобыможно было получать разумно согласующиеся заключения (выводы) изинформации, находящейся в ней. Когда экспертной системе задается вопрос, механизм вывода выбирает способ применения правил базы знаний для решениязадачи, поставленной в вопросе. Фактически, механизм вывода запускаетэкспертную систему в работу, определяя какие правила нужно вызвать иорганизуя к ним доступ в базу знаний. Механизм вывода выполняет правила,определяет когда найдено приемлемое решение и передает результатыпрограмме интерфейса с пользователем. Когда вопрос должен быть предварительно обработан, то доступ кбазе знаний осуществляется через интерфейс с пользователем. Интерфейс - эточасть экспертной системы, которая взаимодействует с пользователем. Как правило, пользователи мало знают об организации базы знаний, поэтому интерфейс может помочь им работать с экспертнойсистемой даже, если они не знают, как она организована. Интерфейс можеттакже объяснить пользователю , каким образом экспертная система выводитрезультат. Система интерфейса с пользователем принимает информацию от пользователя и передает ему информацию. Просто говоря, системаинтерфейса должна убедиться, что, после того как пользовательописал задачу, вся необходимая информация получена. Интерфейс,основываясь на виде и природе информации, введенной пользователем, передаетнеобходимую информацию механизму вывода. Когда механизм выводавозвращает знания, выведенные из базы знаний, интерфейс передает ихобратно пользователю в удобной форме. Интерфейс с пользователем и механизмвывода могут рассматриваться как "приложение" к базе знаний. Онивместе составляют оболочку экспертной системы. Для базы знаний,которая содержит обширную и разнообразную информацию, могут бытьразработаны и реализованы несколько разных оболочек. Хорошо разработанныеоболочки экспертных систем обычно содержат механизм для добавления иобновления информации в базе знаний. Как видим , экспертная система состоит из трех основных частей. Взаимосвязь между частями может быть сложной, зависящей отприроды и организации знаний, а также от методов и целей вывода. Базы знаний и способы представления Продукционная модель Это один из наиболее часто используемых в экспертных системахспособов представления знаний. Основная идея заключается в ассоциировании с соответствующими действиями набора условий в виде правил типа "если-то",называемых также продукциями: ЕСЛИ условие ТО действия "Если-то"-правила обычно оказываются весьма естественнымвыразительным средством представления знаний. Кроме того, они обладаютследующими привлекательными свойствами: - модульность: каждое правило описывает небольшой, относительнонезависимый фрагмент знаний; - возможность инкрементного наращивания: добавление новых правилв базу знаний происходит относительно независимо от других правил; - удобство модификации (как следствии модульности): старые правила можноизменять и заменять на новые относительно независимо от других правил; - применение правил способствует прозрачности системы, т.е.способности к объяснению принятых решений и полученных результатов. Однако продукционные системы не свободны от недостатков: - процесс вывода менее эффективен, чем в других системах, посколькубольшая часть времени при выводе затрачивается на непроизводительнуюпроверку применимости правил; - этот процесс трудно поддается управлению; - сложно представить родовидовую иерархию понятий.Фреймы Представление знаний, основанное на фреймах, является альтернативнымпо отношению к системам продукций: оно дает возможность хранитьродовидовую иерархию понятий в базе знаний в явной форме. Фреймомназывается структура для описания стереотипной ситуации, состоящая изхарактеристик этой ситуации и их значений, характеристики называютсяслотами, а значения - заполнителями слотов. Слот может содержать не толькоконкретное значение, но и имя процедуры, позволяющей вычислить его позаданному алгоритму, а также одну или несколько продукций (эвристик), спомощью которых это значение можно найти. В слот может входить не одно, анесколько значений. Иногда слот включает компонент, называемый фасетом,который задает диапазон или перечень его возможных значений. Фасетуказывает также граничные значения заполнителя слота. Совокупность фреймов, моделирующая какую-нибудь предметнуюобласть, представляет собой иерархическую структуру, в которую фреймысоединяются с помощью родовидовых связей. На верхнем уровне иерархиинаходится фрейм, содержащий наиболее полную информацию, истинную длявсех остальных фреймов. Фреймы обладают способностью наследоватьзначения характеристик своих родителей, находящихся на более высоком уровне иерархии. Значения характеристик фреймов могут передаваться по умолчаниюфреймам, находящимся ниже них в иерархии, но если последние содержатсобственные значения данных характеристик, то в качестве истинныхпринимаются именно они. Наиболее ярко достоинства фреймовых систем представления знанийпроявляются в том случае, если родовидовые связи изменяются нечасто ипредметная область насчитывает немного исключений. Во фреймовых системахданные о родовидовых связях хранятся явно, т.е. так же, как и значения всех других типов. Значения слотов представляются в системе в единственномэкземпляре, поскольку включаются только в один фрейм, описывающий наиболее общее понятие из всех тех, которые содержат слот с данным именем. Такоесвойство систем фреймов дает возможность уменьшить объем памяти,необходимый для их размещения в компьютере. Еще одно достоинство фреймовсостоит в том, что значение любого слота при необходимости может бытьвычислено с помощью соответствующих процедур или найдено эвристическимиметодами. Как недостаток фреймовых систем следует отметить их относительновысокую сложность, что проявляется в снижении скорости работы механизмавывода и в увеличении трудоемкости внесения изменений в родовидовуюиерархию. Кроме того, во фреймовых системах затруднена обработкаисключений.Семантические сети Семантическая сеть, по мнению специалистов, - наиболее общий способпредставления знаний, причем она появилась, по-видимому, ранее других. Вней понятия и классы, а также отношения и связи между ними представлены ввиде сети. Семантическая сеть отображает совокупность объектов предметнойобласти и отношений между ними, при этом объектам соответствуют вершины(или узлы) сети, а отношениям - соединяющие их дуги. В качестве объектовмогут выступать события, действия, обобщенные понятия или свойстваобъектов. Свойства представляются в сети также в виде вершин и служат для описания классов объектов. Вершины сети соединяются дугой, еслисоответствующие объекты предметной области находятся в каком-либоотношении. Как и в системе, основанной на фреймах, в семантической сети могутбыть представлены родовидовые отношения, которые позволяют реализоватьнаследование свойств от объектов-родителей. Это обстоятельство приводит ктому, что семантические сети приобретают большинство недостатков идостоинств представления знаний в виде фреймов. Но основное преимуществосемантических сетей заключается в их наглядности и непосредственнойсвязанности понятий через сеть, которая позволяет быстро находить связипонятий и на этой основе управлять принимаемыми решениями. Именно этотформализм был использован в данной работе в качестве формализма дляпредставления знаний в БЗ. Основной недостаток сетей - сложностьобработки исключений. Таким образом, используя данные понятия, наша ПО наязыке microLISP представляется следующим образом:((1 "общее недомогание") (2 "сухость, першение, саднение") (3 "кашель сначала сухой, затем с мокротой") (4 "голос хриплый или беззвучный") (5 "иногда боль при глотании") (6 "головная боль") (7 "повышение температуры тела") (8 "быстрая утомляемость голоса") (9 "периодический кашель с мокротой") (10 "охриплость с афонией") (11 "ощущение неловкости") (12 "жжение в горле") (13 "кашель при обострении") (14 "сухой кашель") (15 "слизистая покрыта густой слизью ") (16 "откашливание с прожилками крови"))(("ларингит острый" (1 2 3 4 5 6 7)) ("ларингит хронический катаральный" (1 2 4 8 9)) ("ларингит хронический гипертрофический" (1 10 11 12 13)) ("ларингит хронический атрофический" (1 2 4 14 15 16))) 4. Разработка меню экспертной системы обеспечивающего заданные режимы Для обеспечения наиболее понятной работы с программой разработанаиерархическая структура меню.Система пользовательского интерфейса обеспечивает взаимодействие междуэкспертной системой и пользователем. Это взаимодействие обычно включаетнесколько функций: 1. Обработка данных, полученных с клавиатуры, и высвечивание водимыхи выводимых данных на экране. 2. Поддержка диалога между пользователем и системой. 3. Распознавание ситуации непонимания между пользователем исистемой. 4. Обеспечение "дружественности" по отношению кпользователю. Система интерфейса с пользователем должна эффективнообрабатывать ввод и вывод. Для этого необходимо обрабатыватьвводимые и выводимые данные быстро, в ясной и выразительнойформе. Необходимо также включить возможность работы сдополнительными средствами такими, как магнитные диски и дополнительныефайлы данных. Кроме того, система интерфейса должна поддерживатьсоответствующий диалог между пользователем и системой. Диалог -это общая форма консультации с экспертной системой. Консультация должна завершаться ясным утверждением, выдаваемымсистемой, и объяснением последовательности вывода, приведшей к этомуутверждению. Структурная схема системы меню представлена на рис.1 Главное меню 1.Files 2.DataBase 3.Diagnosticka4.Quit 1. LOAD 2. SAVE 1. ADD 2. DELETE 3.REDACT 4. VIEW Добавление Добавление Удаление Удаление Редактирование Редактированиесимптомов болезней симптомов неисправностей симптомов неисправностей Объяснение логического вывода рис.1 Структурная схема меню 5. Разработка процедур оболочки 1. Процедура "Загрузка" (loading): загрузка БД производится путемзагрузки файла с именем, указанным пользователем, в оперативную памятьдля использования его содержимого в программе. Вход Ввод имени файла для загрузки Загрузка файла с этим именем Выход 2. Процедура "Сохранение" (saving): сохранение БД означает записьее содержимого из оперативной памяти в файл с именем, указаннымпользователем. Эта процедура позволяет сохранить изменения, произведенныес БД во время работы. Вход Ввод имени файла для записи Запись БД в файл с этим именем Выход 3. Процедура "Добавление" (adding): добавление делится на добавлениесимптомов и добавление болезней. В первом случае запрашивается названиеболезни, к которой нужно добавить симптом, затем вводится симптом, ипроисходит добавление.Имеется возможность добавить сразу несколько симптомов. Вход Ввод названия болезни Ввод симптома Добавление симптома к введенной ранее болезни - Еще + Выход Добавление болезни осуществляется путем введения с клавиатуры новогоназвания болезни и ее симптомов (для окончания ввода симптомов необходимонабрать 'end'). Добавление происходит в конец БД. Вход Ввод названия болезни Ввод симптома _ end + Добавление болезни и всех ее симптомов Выход4. Процедура "Просмотр" (viewing): осуществляется просмотр всей БД,содержащейся в данный момент в оперативной памяти. Вход Вывод названия болезни Вывод симптомов этой болезни + Пуста БД? _ Выход5. Процедура "Логический вывод" (expert): консультация осуществляетсяследующим образом: с помощью задания вопросов пользователю о том, есть лиу него какой-то симптом, программа определяет диагноз. В процессе работыпроцедура в оперативной памяти формирует временные динамические базыданных: БД-YES (БД, содержащая симптомы, на которые пользователь ответил"Да") и БД-NO (БД, содержащая симптомы, на которые пользователь ответил"Нет"). Для того, чтобы процедура вывела диагноз, необходимо, чтобыпользователь ответил "Да" на все вопросы о симптомах, характеризующих этуболезнь. Схема алгоритма данной процедуры представлена ниже. Вход конец Выбор болезни из БД Выход Выбор конец симптома этой болезни Выводэтойболезни Он _ Выход есть в БД- YESОн + +есть вБД-NO _ Вывод вопроса отом, есть ли упользователя этот симптом Добавить его в Добавить его БД-YES в БД-NO _Да? +6. Процедура "Объяснение логического вывода" (logout): данная процедуравыводит список симптомов болезни, которая была получена с помощью процедурылогического вывода, объясняя этим ее диагноз. Вход Выбор определенной болезни из БД Вывод симптомов этой болезни Выход7. Процедура "Удаление" (deleting): удаление делится на удаление симптомови удаление болезней. При удалении симптома необходимо ввести названиеболезни, которой принадлежит симптом, подлежащий удалению, а такженазвание самого симптома. Имеется возможность удалить несколько симптомову болезни (для окончания ввода удаляемых признаков необходимо набрать'end'). Вход Ввод названия болезни Ввод симптома, под- лежащего удалению + End Выход - При удалении болезни запрашивается ее название. Вместе с ней из БДудаляются и все ее симптомы. Вход Ввод названия болезни Удаление этой болезни и всех ее симптомов Выход 8. Процедура "Редактирование" (redacting): редактирование делится наредактирование симптомов и редактирование болезней. В первом случаевводится название болезни, симптом которой нужно исправить, сам симптоми его отредактированное значение.Из БД удаляется старое значение симптома и добавляется новое. Вход Ввод названия болезни Ввод симптома для исправления Удаление этого симптома Ввод исправленного симптома Добавление нового значения Выход При редактировании болезни необходимо ввести ее название и затем новоеисправленное значение. Процедура удалит старое значение и добавит новое. Вход Ввод названия болезни Удаление этой болезни Ввод исправленного значения Добавление нового значения Выходрис. 2 Структурная схема программы Start mainmenumenufiles menubd menuconsquit log_out loading saving adding deleting viewing redacting plus plussym delill delsym redill redsym 6. Описание программы на micro-LISP Структурная схема программы на Лиспе изображена на рис.2. Обосновных процедурах написано в разделе "Разработка процедур оболочки", в котором представлены схемы алгоритмов их работы. Текст программынаходится в Приложении А, текст базы знаний - в Приложении В. Теперь перейдем непосредственно к описанию программы. Главнаяпроцедура start запускает процедуру mainmenu (она представлена в видебесконечного цикла do, также представлены и все подменю: menufiles, menubdи т.д.). Mainmenu рисует главное меню и здесь же с помощью выражения cond иeq? организованно получение выбора и запуск выбранной процедуры. Процедура saving осуществляет запись БД в файл с помощью встроенноговыражения with-output-to-file и функции write (все это организованно ввиде lambda-выражения). Загрузка файла (процедура loading) происходит с помощью встроенныхwith-input-from-file и read (причем БД болезней представлена в виде списка*it_is*, а симптомов в виде списка *simptom*). Постановка диагноза осуществляется с помощью функции experting. Из БДвыбирается болезнь ill, берется список ее симптомов spis_num и с помощьюфункции exp_ill (spis_num,ill) определяется, есть ли у пользователя этисимптомы. Если эта функция будет ложной (на запрос пользователь ответилотрицательно), то произойдет рекурсивный вызов функции experting от концасписка болезней (т.е. в дальнейшем будет выбрана следующая и т.д.).Впроцессе работы функции с помощью функции set! формируются спискиположительных и отрицательных ответов пользователя *yes* и *no*. Еслифункция experting выполнила свою работу и диагноз поставлен успешно, тофункция log_out (объяснение логического вывода) выводит на экранназвание определенной болезни и ее симптомы (функция использует для этогофункцию cond и рекурсию). В режиме просмотра списка болезней и симптомов (view_ill)используется cond и рекурсивный вызов функции от хвоста списка, чтопозволяет вывести все содержимое БД на экран. В режиме добавления болезней (add_ill) и симптомов (add_sym)используется встроенная функция append (для соединения списков), арекурсивный вызов функции addsyms обеспечивает возможность добавления кболезни нескольких симптомов. При редактировании болезней (red_ill) исимптомов (red_sym) старое значение удаляется с помощью функции delete!(удаление элемента из списка), а новое обавляется с помощью append. Удаление болезней (del_ill) осуществляется с помощью функции delete!.При удалении болезни автоматически удаляются и все ее симптомы(рекурсивно вызывая сама себя от конца удаляемого списка признаковфункция delsyms последовательно удаляет все симптомы этой болезни). Удаление симптома (del_sym) также осуществляется с помощью delete!,но при этом с помощью функции append формируется новый списоксимптомов болезни, симптом которой удаляется. Затем происходит удалениеболезни со старым списком симптомов (set! *it_is* (delete! (list illspis_nums) *it_is)) и добавление к списку *it_is* этой же болезни сновым списком. 7. Краткое описание встроенных предикатов и функций microLISP, используемых в программеОкна Окна являются объектами, подобными "портам", которые представляютсобой прямоугольные области на экране. Предикат WINDOW? определяет,действительно ли заданный объект является портом, представляющим окно наэкране. Все интерактивные окна ввода-вывода представляются посредствомокон, включая ввод-вывод, обеспечиваемый портами STANDARD-INPUT иSTANDARD-OUTPUT. Новые окна-порты создаются и открываются с помощью MAKE-WINDOW; их атрибуты доступны с помощью WINDOW-GET-ATTRIBUTE имодифицируются WINDOW-SET-ATTRIBUTE! Окна до тех пор не выводятся на экран, пока область для них неочистится с помощью WINDOW-CLEAR. WINDOW-DELETE очищает область экрана, занятого окном. WINDOW-POPUP и WINDOW-POPUP-DELETE выдают несколькоперекрывающихся окон. Позиция окна на экране и размер его строк и столбцов устанавливаютсяWINDOW-GET-POSITION и WINDOW-GET-SIZE, соответственно; модификациявыполняется WINDOW-SET-POSITION! и WINDOW-SET-SIZE!. Модификация позиции и размеров окна может быть выполнена перед тем,как окно изначально выводится на экран по WINDOW-CLEAR. Позициякурсора устанавливается с помощью WINDOW-GET-CURSOR и изменяется WINDOW-SET-CURSOR!. Курсор появляется на экране только тогда, когда вводпроизводится с клавиатуры.FLUSH-INPUT Процедура FLUSH-INPUT чистит буфер вводного порта. Формат (FLUSH-INPUT port) Параметр port- вводной порт (необязательный аргумент).Объяснение: FLUSH-INPUT отбрасывает любые литеры и включает следующую"последовательность конца строки" (end-of-line) в буфер ввода, которыйсвязан с port, если он задан, или с текущим вводным портом. Выдаетсянеопределенное значение.LAST-PAIRВозвращает последнюю пару непустого списка.LISTКомпозиции пар, связанных через их cdr-компоненты, называются списками.Пустой список, обозначаемый как (), также является списком. Когдацепочка cdr-связей в паре оканчивается пустым списком, тогда параназывается "собственным списком". Процедура LIST обеспечивает такой список,состоящий из значений его аргументов. LIST* обеспечивает похожий список,но имеющий значение его последнего аргумента в cdr-компоненте последнейпары цепочки.MEMBERMEMBER, MEMQ, MEMVПроцедураДанные процедуры выдают подсписок, начинающийся с некоторого специфическогообъекта в собственном списке. Формат (MEMBER оbj list) (MEMQ оbj list) (MEMV оbj list) Параметры obj - любой объект в "ЛИСП-МИКРО"; list - собственный списокОбъяснение: Данные процедуры ищут первое появление obj в list, используя EQVAL?для сравнения (в случае MEMBER); при MEMQ используется EQ?; при MEMV -EQV? Если obj найден, подсписок, содержащий obj как первый элемент,выдается как результат. Если obj не найден в list, выдается "ложь".DOСпециальное выражениеDO обеспечивает наиболее общую возможность вычисления итераций. Формат (DO ((var (init step)...)(test exp ...) stmt ...) Параметры var - любой идентификатор "ЛИСП-МИКРО"; init - любые выражения в "ЛИСП-МИКРО". Вычисляется каждое init; результат используется как значениесоответствующего var. Этот аргумент необязательный; step... - любые выражения "ЛИСП-МИКРО". Вычисляется каждое init; результат используется как значениесоответствующего var для следующей итерации. Этот необязательный аргумент может быть описан, только если описан init; test - любое выражение "ЛИСП-МИКРО". Этовыражение является условием, по которому итерация останавливается; exp... - любые выражения "ЛИСП-МИКРО". Эти выражения вычисляются перед выходом из цикла; stmt... - любые выражения "ЛИСП-МИКРО". Эти выражения вычисляются по порядку каждый раз как test возвращает "ложь". 8. Отладка программы Для удобства отладки программа писалась не вся сразу, а постепенно,отдельными процедурами. Каждая процедура сначала отлаживалась ипроверялась, а потом разрабатывалась следующая. После проверки каждойпроцедуры в отдельности отлаживалась вся программа целиком и устранялисьпоследние недоработки и ошибки. 9. Инструкция пользователю и пример выполнения программы Необходимые аппаратные средства Для работы данной программы необходимо: - компьютер : желательно IBMPC AT или XT; - оперативная память - не менее 512 Кb; - места навинчестере (или любом другом запоминающем устройстве)- не менее 100 Kb (взависимости от размера базы данных); - дисплей с любой графической картой;- операционная среда - MS-DOS версии 3.0 и выше.Состав носителей данных: Для нормальной работы программы необходимо наличие следующих файлов: fun.lsp - файл запуска (файл содержащий всю программу); bd2.lsp - файл базы данных (или любой другой файл, содержащий базуданных пользователя); Для запуска программы нужно войти в Лисп, загрузить файлfun.lsp, набрать start и нажать клавишу ENTER.Описание работы с программой После запуска программы Вы попадаете в ее интегрированную среду. Дляработы с ней нужно знать, что: - для выбора нужного пункта меню/подменю нужно набрать номер этогопункта; - для перехода из нижнего подменю в исходное меню/подменю нужнонажать клавишу ESC; - для выхода из программы нужно выбрать пункт главного меню <Выход>. Работа с подменю <Файлы>: - для работы с пунктом <Загрузка>: - наберите на клавиатуре название нужного вам файла базы данных инажмите клавишу ENTER; - для работы с пунктом <Сохранить> : - наберите имя файла и нажмите ENTER. Работа с подменю <БазаДанных>: - для работы с пунктом <Редактирование> нужно: - выбрать будете ли Вы редактировать названия неисправностей илипризнаков (нажать соответственно цифру 1 или 2); - ввести название неисправности или признака для редактирования; - ввести новые исправленные значения; - для работы с пунктом <Добавление> нужно: - выбрать будете ли Вы добавлять названия неисправностей или признаков (нажать соответственно цифру 1 или 2); - путем ввода информации с клавиатуры внести новую запись; - для работы с пунктом <Удаление> нужно: - выбрать будете ли Вы удалять названия неисправностей или признаков (нажать соответственно цифру 1 или 2); - ввести название удаляемой неисправности или признака; - для работы с пунктом <Просмотр> необходимо знать, что: - информацию на экране можно менять, нажимая клавишу ESC. Работая с подменю <Консультация>, нужно: - отвечать на вопросы (набирать соответственно 'Д' или 'Н' и нажиматьклавишу ENTER). Заключение В данной работе была реализована идея создания фрагмента оболочкиэкспертной системы. В результате разработки КПР была полученаинтегрированная среда по диагностике заболеваний. К плюсам даннойпрограммы можно отнести довольно поверхностные знания пользователя поработе с компьютером, которые требуются для работы с ней. Среди возможных пожеланий можно сказать о разработке системы помощипри работе с программой. Можно также усложнить программу, переписав ее так,чтобы она работала на основе рассуждений с использованием вероятностногоподхода. Часто к экспертным системам предъявляют дополнительноетребование - способность иметь дело с неопределенностью и неполнотой.Информация о поставленной задаче может быть неполной или ненадежной;отношения между объектами предметной области могут быть приближенными.Например, может не быть полной уверенности в наличии у пользователянекоторого симптома или в том, что данные, полученные при определении,верны. Во всех этих случаях как раз и необходимы рассуждения сиспользованием вероятностного подхода. Библиографический список1. Ин Ц., Соломон Д. Использование Турбо-Пролога: Пер. с англ. -Мир, 1993.-608 с.2. Таусенд К., Фохт Д. Проектирование и программная реализацияэкспертных систем на персональных ЭВМ: Пер. с англ. - М.: Финансы истатистика, 1990.- 320 с.3. Хювенен Э., Сеппянен Й. Мир Лиспа. В 2-х т. Пер. с финск. - М.: Мир,1990. Приложение А Полный текст программы на языке micro-LISP (файл "FUN.LSP):(define mainw(make-window "ДОКТОР" #!true))(define mmenuw(make-window "МЕНЮ" #!true))(define menufw(make-window "__ФАЙЛЫ" #!true))(define menudbw(make-window "БазаДанных" #!true))(define menucw(make-window "_____________________________ДИАГНОСТИКА"#!true))(define vieww(make-window "____________ПРОСМОТР" #!true))(define addiw(make-window "____________ДОБАВЛЕНИЕ БОЛЕЗНИ" #!true))(define addsw(make-window "__________ДОБАВЛЕНИЕ СИМПТОМОВ" #!true))(define rediw(make-window "________РЕДАКТИРОВАНИЕ БОЛЕЗНИ" #!true))(define redsw(make-window "_______РЕДАКТИРОВАНИЕ СИМПТОМА" #!true))(define deliw(make-window "______________УДАЛЕНИЕ БОЛЕЗНИ" #!true))(define delsw(make-window "_____________УДАЛЕНИЕ СИМПТОМА" #!true))(define submenuw(make-window "___Работа с:" #!true))(define menulw(make-window "Введите ИМЯ ФАЙЛА :" #!true))(define f)(define *symptom*)(define *it_is*)(define *yes* '())(define *no* '())(define (start) (window-set-position! mainw 1 1) (window-set-size! mainw 23 78) (window-clear mainw) (mainmenu)); Главное меню(define (mainmenu) (define ch) (Window-Set-Position! mmenuw 3 15) (Window-Set-Size! mmenuw 1 47) (Window-Clear mmenuw) (display " 1.Files 2.DataBase 3.Diagnosticka 4.Quit" mmenuw) (do ((i 0 (+ i 0))) ((> i 5)i) (Window-Set-Cursor! mainw 22 30) (display "Ваш выбор :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (cond ((eq? ch #) (menufiles)) ((eq? ch #) (menudb)) ((eq? ch #) (menucons)) ((eq? ch #) (exit)) ))); Меню Файлов(define (menufiles) (define ch) (Window-Set-Position! menufw 5 16) (Window-Set-Size! menufw 4 8) (Window-Clear menufw) (Window-Set-Cursor! menufw 1 1) (display "1.LOAD" menufw) (Window-Set-Cursor! menufw 2 1) (display "2.SAVE" menufw) (do ((i 0 (+ i 0))) ((> i 5)i) (Window-Set-Cursor! mainw 22 30) (display "ВАШ ВЫБОР :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (cond ((eq? ch #) (loading)) ((eq? ch #) (saving)) ((eq? ch #) (Window-Delete menufw) (mainmenu)) ))); Меню БазыДанных(define (menudb) (define ch) (Window-Set-Position! menudbw 5 26) (Window-Set-Size! menudbw 6 10) (Window-Clear menudbw) (Window-Set-Cursor! menudbw 1 1) (display "1.ADD " menudbw) (Window-Set-Cursor! menudbw 2 1) (display "2.DELETE" menudbw) (Window-Set-Cursor! menudbw 3 1) (display "3.REDACT" menudbw) (Window-Set-Cursor! menudbw 4 1) (display "4.VIEW" menudbw) (do ((i 0 (+ i 0))) ((> i 5)i) (Window-Set-Cursor! mainw 22 30) (display "ВАШ ВЫБОР :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (cond ((eq? ch #) (adding) (menudb)) ((eq? ch #) (deleting) (menudb)) ((eq? ch #) (redacting) (menudb)) ((eq? ch #) (viewing) (menudb)) ((eq? ch #) (Window-Delete menudbw) (mainmenu)) ))); Загрузка файла(define (loading) (Window-Set-Position! menulw 20 20) (Window-Set-Size! menulw 1 40) (Window-Clear menulw) (Window-Set-Cursor! menulw 1 3) (set! f (read-line menulw)) (Window-Delete menulw) (with-input-from-file f (lambda () (set! *symptom* (read)) (set! *it_is* (read)) (flush-input) ))); Запись файла(define (saving) (Window-Set-Position! menulw 20 20) (Window-Set-Size! menulw 1 40) (Window-Clear menulw) (Window-Set-Cursor! menulw 2 3) (set! f (read-line menulw)) (Window-Delete menulw) (with-output-to-file f (lambda () (write *symptom*) (write *it_is*) )));Меню диагностики(define (menucons) (Window-Set-Position! menucw 6 10) (Window-Set-Size! menucw 17 57) (Window-Clear menucw) (experting *it_is*) (window-delete menucw) )(define (experting spis_ill) (cond ((null? spis_ill) (board) (display " НЕВОЗМОЖНО ОПРЕДЕЛИТЬ ДИАГНОЗ "menucw) (wait menucw) (set! *yes* '()) (set! *no* '())) ((exp_ill (cadar spis_ill) (caar spis_ill))) (t (experting (cdr spis_ill))) ))(define (exp_ill spis_num ill) (define nums) (define s) (cond ((null? spis_num) (window-clear menucw) (window-set-cursor! menucw1 1) (display " У ВАС " menucw) (display illmenucw) (display "." menucw) (set! nums (find_sym ill *it_is*)) (set! *yes* '()) (set! *no* '()) (log_out nums)) (t (set! s (find_sym (car spis_num) *symptom*)) (yesno? s spis_num ill)) ))(define (into y a) (cond ((eq? a 'д) (set! *yes* (append *yes* (list y)))) (t (set! *no* (append *no* (list y)))) ))(define (yesno? y spis_num ill) (define ans) (cond ((member y *no*) nil) ((member y *yes*) (exp_ill (cdr spis_num) ill)) (t (and (board) (display " СИМПТОМ: " menucw) (display y menucw) (display " [Д/Н] ? " menucw) (set! ans (read menucw)) (into y ans) (eq? 'д ans) (exp_ill (cdr spis_num) ill))) ))(define (log_out nums) (cond ((null? nums) (wait menucw)) (t (newline menucw) (display " " menucw) (display (find_sym (car nums) *symptom*) menucw) (log_out (cdr nums))) ))(define (board) (define gr) (set! gr (window-get-cursor menucw)) (if (< (car gr) 18) (newline menucw) (begin (window-clear menucw) (window-set-cursor! menucw 1 1))))(define (find_sym n spis_sym) (if (equal? (caar spis_sym) n) (cadar spis_sym) (find_sym n (cdr spis_sym)) ))(define (wait wname) (cond ((eq? (read-char wname) #) t) (t (wait wname)) ));Просмотр(define (viewing) (Window-Set-Position! vieww 11 15) (Window-Set-Size! vieww 12 47) (Window-Clear vieww) (view_ill *it_is*) (window-delete vieww) )(define (view_ill spis_ill) (cond ((null? spis_ill) t) (t (window-set-cursor! vieww 1 2) (display "БОЛЕЗНЬ: " vieww) (display (caar spis_ill) vieww) (view_sym (cadar spis_ill)) (view_ill (cdr spis_ill))) ))(define (view_sym spis_num) (cond ((null? spis_num) (wait vieww) (window-clear vieww)) (t (newline vieww) (display " " vieww) (display (find_sym (car spis_num) *symptom*) vieww) (view_sym (cdr spis_num))) ));Вспомогательное подменю(define (submenu) (Window-Set-Position! submenuw 11 25) (Window-Set-Size! submenuw 4 14) (Window-Clear submenuw) (window-set-cursor! submenuw 1 1) (display "1.БОЛЕЗНЯМИ" submenuw) (window-set-cursor! submenuw 2 1) (display "2.СИМПТОМАМИ" submenuw) );Добавление(define (adding) (define ch) (submenu) (Window-Set-Cursor! mainw 22 30) (display "ВАШ ВЫБОР :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (window-delete submenuw) (cond ((eq? ch #) (Window-Set-Position! addiw 6 10) (Window-Set-Size! addiw 17 57) (Window-Clear addiw) (add_ill) (window-delete addiw)) ((eq? ch #) (Window-Set-Position! addsw 6 10) (Window-Set-Size! addsw 17 57) (Window-Clear addsw) (add_sym) (window-delete addsw)) ((eq? ch #)) (t (adding)) ))(define ill)(define sym);Добавление болезни(define (add_ill) (define n) (window-set-cursor! addiw 1 1) (display "Введите название новой БОЛЕЗНИ: " addiw) (set! ill (read-line addiw)) (display " Чтобы ЗАКОНЧИТЬ вводить симптомы НАБЕРИТЕ: end" addiw) (newline addiw) (set! n (caar (last-pair *symptom*))) (set! *it_is* (append *it_is* (list (list ill (addsyms (+ n 1) '() '() addiw))) )) );Добавление симптомов(define (add_sym) (define n) (define nums) (window-set-cursor! addsw 1 2) (display "БОЛЕЗНЬ: " addsw) (set! ill (read-line addsw)) (display " Чтобы ЗАКОНЧИТЬ вводить симптомы НАБЕРИТЕ: end" addsw) (newline addsw) (set! n (caar (last-pair *symptom*))) (set! nums (find_sym ill *it_is*)) (set! *it_is* (delete! (list ill nums) *it_is*)) (set! *it_is* (append *it_is* (list (list ill (addsyms (+ n 1) '() nums addsw))) )) )(define (addsyms nn spis_num nums nwin) (display " СИМПТОМ: " nwin) (set! sym (read-line nwin)) (if (equal? sym "end") (append nums spis_num) (begin (set! *symptom* (append *symptom* (list (list nn sym)))) (addsyms (+ nn 1) (append spis_num (list nn)) nums nwin))));Редактирование(define (redacting) (define ch) (submenu) (Window-Set-Cursor! mainw 22 30) (display "ВАШ ВЫБОР :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (window-delete submenuw) (cond ((eq? ch #) (Window-Set-Position! rediw 11 10) (Window-Set-Size! rediw 6 57) (Window-Clear rediw) (red_ill) (window-delete rediw)) ((eq? ch #) (Window-Set-Position! redsw 11 10) (Window-Set-Size! redsw 8 57) (Window-Clear redsw) (red_sym) (window-delete redsw)) ((eq? ch #)) (t (redacing)) ));Редактирование болезни(define (red_ill) (define nums) (define ill1) (window-set-cursor! rediw 1 1) (display " Введите БОЛЕЗНЬ, название которой хотите" rediw) (newline rediw) (display " ИСПРАВИТЬ: " rediw) (set! ill (read-line rediw)) (newline rediw) (display " Введите ИСПРАВЛЕННОЕ название: " rediw) (set! ill1 (read-line rediw)) (set! nums (find_sym ill *it_is*)) (set! *it_is* (delete! (list ill nums) *it_is*)) (set! *it_is* (append *it_is* (list (list ill1 nums)) )) );Редактирование симптома(define (red_sym) (define n1) (define nums) (define sym1) (window-set-cursor! redsw 1 1) (display " Введите БОЛЕЗНЬ, СИМПТОМ которой хотите" redsw) (newline redsw) (display " ИСПРАВИТЬ: " redsw) (set! ill (read-line redsw)) (newline redsw) (display " Введите СИМПТОМ, который хотите" redsw) (newline redsw) (display " ИСПРАВИТЬ: " redsw) (set! sym (read-line redsw)) (display " Введите ИСПРАВЛЕННОЕ ЗНАЧЕНИЕ: " redsw) (set! sym1 (read-line redsw)) (set! nums (find_sym ill *it_is*)) (set! n1 (sub sym *symptom* nums)) (set! *symptom* (delete! (list n1 sym) *symptom*)) (set! *symptom* (append *symptom* (list (list n1 sym1)) )) )(define (sub x spis spis_x) (let ((n (find_index x spis))) (cond ((memb? n spis_x) n) (t (sub x (cdr spis) spis_x)) )))(define (find_index x spis) (cond ((equal? (cadar spis) x) (caar spis)) (t (find_index x (cdr spis))) ))(define (memb? a l) (cond ((null? l) nil) ((equal? a (car l)) t) (t (memb? a (cdr l))) ));Удаление(define (deleting) (define ch) (submenu) (Window-Set-Cursor! mainw 22 30) (display "ВАШ ВЫБОР :" mainw) (set! ch (read-char mainw)) (Window-Set-Cursor! mainw 22 30) (display " " mainw) (window-delete submenuw) (cond ((eq? ch #) (Window-Set-Position! deliw 11 10) (Window-Set-Size! deliw 4 57) (Window-Clear deliw) (del_ill) (window-delete deliw)) ((eq? ch #) (Window-Set-Position! delsw 6 10) (Window-Set-Size! delsw 17 57) (Window-Clear delsw) (del_sym) (window-delete delsw)) ((eq? ch #)) (t (deleting)) ));Удаление болезни(define (del_ill) (define nums) (window-set-cursor! deliw 1 2) (display "Введите название БОЛЕЗНИ, которую хотите" deliw) (newline deliw) (display " УДАЛИТЬ: " deliw) (set! ill (read-line deliw)) (set! nums (find_sym ill *it_is*)) (set! *it_is* (delete! (list ill nums) *it_is*)) (delsyms nums) )(define (delsyms spis_nums) (cond ((null? spis_nums) t) (t (set! *symptom* (delete! (list (car spis_nums) (find_sym (car spis_nums) *symptom*)) *symptom*)) (delsyms (cdr spis_nums))) ));Удаление симптомов(define (del_sym) (define nums) (window-set-cursor! delsw 1 2) (display "Введите название БОЛЕЗНИ, СИМПТОМЫ которой хотите" delsw) (newline delsw) (display " УДАЛИТЬ: " delsw) (set! ill (read-line delsw)) (display " Чтобы ЗАКОНЧИТЬ вводить симптомы НАБЕРИТЕ: end" delsw) (newline delsw) (set! nums (find_sym ill *it_is*)) (subdel nums ill) )(define n0)(define (subdel spis_nums ill) (display " СИМПТОМ: " delsw) (set! sym (read-line delsw)) (if (equal? sym "end") t (begin (set! n0 (sub sym *symptom* spis_nums)) (set! *symptom* (delete! (list n0 sym) *symptom*)) (set! *it_is* (delete! (list ill spis_nums)*it_is*)) (set! *it_is* (append *it_is* (list (list ill (del n0 spis_nums))) )) (subdel (del n0 spis_nums) ill)) ))(define (del x l) (cond ((null? l) nil) ((equal? x (car l)) (cdr l)) (t (cons (car l) (del x (cdr l)))) )) Приложение ВЛистинг файла базы знаний "BD2.LSP":((1 "общее недомогание") (2 "сухость, першение, саднение") (3 "кашель сначала сухой, затем с мокротой") (4 "голос хриплый или беззвучный") (5 "иногда боль при глотании") (6 "головная боль") (7 "повышение температуры тела") (8 "быстрая утомляемость голоса") (9 "периодический кашель с мокротой") (10 "охриплость с афонией") (11 "ощущение неловкости") (12 "жжение в горле") (13 "кашель при обострении") (14 "сухой кашель") (15 "слизистая покрыта густой слизью ") (16 "откашливание с прожилками крови"))(("ларингит острый" (1 2 3 4 5 6 7)) ("ларингит хронический катаральный" (1 2 4 8 9)) ("ларингит хронический гипертрофический" (1 10 11 12 13)) ("ларингит хронический атрофический" (1 2 4 14 15 16)))-----------------------Главная процедураВывод главного меню, получение выбора и запуск выбранного режимаВывод подменю "Файлы", получение выбора, запуск выбранной процедурыВыходЛогический вывод, режим консультацииВывод подменю "БазаДанных", получение выбора, запуск выбранной процедурыОбъяснение логического выводаЗапись БДРедактирование симптомов и болезнейПросмотр содержимого БДУдаление симптомов и болезней из БД, получнение выбора, запуск выбраннойпроцедурыДобавление симптомов и болезней в БД, получение выбора, запуск выбраннойпроцедурыЗагрузка БДРедактирование симптомовРедактирование болезниУдаление симптомовУдаление болезни с ее симптомамиДобавление новых симптомовДобавление новой болезни




Нажми чтобы узнать.

Похожие:

Разработка фрагментов оболочки экспертной системы icon«Поволжская государственная социально-гуманитарная академия»
Отбор и структурирование речевого, дидактического, наглядного и другого материала к конкретному занятию. Разработка моделей (фрагментов)...
Разработка фрагментов оболочки экспертной системы iconКазпотребсоюза Карагандинский экономический университет Кафедра ивс тематика курсовых работ по курсу «Базы данных и экспертные системы»
Разработка экспертной системы с применением субд производства продукции промышленного класса
Разработка фрагментов оболочки экспертной системы iconКазпотребсоюза Карагандинский экономический университет Кафедра ивс тематика курсовых работ по курсу «Базы данных и экспертные системы»
Разработка экспертной системы с применением субд производства продукции промышленного класса
Разработка фрагментов оболочки экспертной системы iconРазработка экспертной системы с использованием программы vр-ехреrt
Данная система позволяет выявить и устранить неполадки, возникающие в процессе работы ЭВМ. 14
Разработка фрагментов оболочки экспертной системы iconРазработка экспертной системы с использованием программы vр-ехреrt
Данная система позволяет выявить и устранить неполадки, возникающие в процессе работы ЭВМ. 14
Разработка фрагментов оболочки экспертной системы iconКурсовая работа по дисциплине: «Интеллектуальные системы» на тему: «Разработка экспертной системы» «Роликовые коньки помощь чайнику»
Аналитические технологии это методики, которые на основе каких-либо моделей, алгоритмов, математических теорем позволяют по известным...
Разработка фрагментов оболочки экспертной системы iconКоличество фрагментов
Таблица «Классификация фрагментов сосудов на стоянке «Джингельды» (Количество фрагментов сосудов в файле и наличие орнамента)»
Разработка фрагментов оболочки экспертной системы iconУчебно-методические указания к лабораторным работам по курсу: «Базы данных» Тема №5 Разработка экспертной системы с использованием
Данная система позволяет выявить и устранить неполадки, возникающие в процессе работы ЭВМ. 14
Разработка фрагментов оболочки экспертной системы iconУчебно-методические указания к лабораторным работам по курсу:«Базы данных» Тема №5 Разработка экспертной системы с использованием
Данная система позволяет выявить и устранить неполадки, возникающие в процессе работы ЭВМ. 14
Разработка фрагментов оболочки экспертной системы iconПрограммы-оболочки. Операционные системы windows
Они преобразуют неудобный командный пользовательский интерфейс в дружественный графический интерфейс или интерфейс типа "меню". Оболочки...
Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©rushkolnik.ru 2000-2015
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы