Разработка оболонки експертної системы
Exp… — будь-які висловлювання «ЛИСП-МИКРО «. Ці висловлювання обчислюються до виходу. Працювати з невизначеністю і неповнотою. Інформації про поставленому завданню може. Для зручності налагодження програма писалася не вся відразу, а поступово, окремими. Механізм виведення містить принципи і правил роботи. Механізм виведення «знає «, як. Виведення повертає знання, виведені з убозівської бази… Читати ще >
Разработка оболонки експертної системы (реферат, курсова, диплом, контрольна)
Разработка фрагментів оболонки експертної системы.
Сьогодні всім, хто працює у області інформатики чи цікавиться нової.
областю науки, відомий термін «експертні системи ». Експертна система (expert.
system, knowledge based system) — це програмна система, знання й уміння.
якої можна з умінням і знаннями фахівців у який-небудь спеціальної.
області знань. Експертні системи разом із системами обробки природних.
мов є найважливішими в комерційному плані областями використання.
штучного интеллекта.
У межах дослідження штучного інтелекту створено численні.
експертні системи до різних областей знання, таких, наприклад, як медична.
діагностика, і обстеження пацієнтів, генні і молекулярні дослідження,.
складання конфігурації обчислювальних машин, освіту, пошук несправностей.
в пристроях і системах і ще практичне використання. У роботі.
розробляється експертна система, що з діагностикою заболеваний.
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. Забезпечення «приязності «стосовно пользователю.
Система інтерфейсу з користувачем повинна ефективно обробляти введення та виведення.
І тому необхідно обробляти запроваджувані і виведені дані швидко, в ясною та.
виразної формі. Слід також включити можливість роботи з.
додатковими засобами такі як магнітні диски та створює додаткові файли.
данных.
З іншого боку, система інтерфейсу повинна підтримувати відповідний діалог між.
користувачем і жорсткою системою. Діалог — це «спільна форма консультації із засідання експертної.
системой.
Консультація повинна завершуватися ясним твердженням, видаваним системою, і.
поясненням послідовності виведення, що привів його до цього утверждению.
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 ill spis_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-компоненте останньої пари цепочки.
MEMBER.
MEMBER, 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. Інструкція користувачеві й приклад виконання программы.
Необхідні апаратні средства.
Робота даної програми необхідно: — комп’ютер: бажано IBM PC 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}).
Заключение
.
У цьому роботі реалізували ідея створення фрагмента оболонки експертної.
системи. Через війну розробки КПР отримали інтегрована середовище по.
діагностиці захворювань. До плюсів даної програми можна віднести досить.
поверхневі знання користувача роботи з комп’ютером, потрібних для.
роботи з ней.
Серед можливих побажань можна сказати про розробку системи допомоги під час роботи з.
програмою. Можна ще ускладнити програму, переписавши її те щоб вона.
працювала з урахуванням міркувань з допомогою вероятностного підходу. Часто до.
експертним системам пред’являють додаткове вимога — здатність мати.
працювати з невизначеністю і неповнотою. Інформації про поставленому завданню може.
бути неповної чи ненадійною; відносини між об'єктами предметної області не можуть.
бути наближеними. Наприклад, може бути цілковитої певності щодо у.
користувача деякого симптому чи тому, що ці, отримані при.
визначенні, вірні. В усіх цих випадках таки необхідні міркування з.
використанням вероятностного подхода.
Додаток А.
Повний текст програми мовою 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 ((і 0 (+ і 0))).
((> і 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 #1) (menufiles)).
((eq? ch #2) (menudb)).
((eq? ch #3) (menucons)).
((eq? ch #4) (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 ((і 0 (+ і 0))).
((> і 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 #1) (loading)).
((eq? ch #2) (saving)).
((eq? ch #ESCAPE).
(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 ((і 0 (+ і 0))).
((> і 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 #1).
(adding) (menudb)).
((eq? ch #2).
(deleting) (menudb)).
((eq? ch #3).
(redacting) (menudb)).
((eq? ch #4).
(viewing) (menudb)).
((eq? ch #ESCAPE).
(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! menucw 1 1).
(display «У ВАС «menucw) (display ill menucw).
(display ". «menucw).
(set! nums (find_sym ill *it_is*)).
(set! *yes* «()).
(set! *no* «()).
(log_out nums)).
(t (set! p. s (find_sym (car spis_num) *symptom*)).
(yesno? p. 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) #ESCAPE) 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 #1) (Window-Set-Position! addiw 6 10).
(Window-Set-Size! addiw 17 57).
(Window-Clear addiw) (add_ill).
(window-delete addiw)).
((eq? ch #2) (Window-Set-Position! addsw 6 10).
(Window-Set-Size! addsw 17 57).
(Window-Clear addsw) (add_sym).
(window-delete addsw)).
((eq? ch #ESCAPE)).
(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 #1) (Window-Set-Position! rediw 11 10).
(Window-Set-Size! rediw 6 57).
(Window-Clear rediw) (red_ill).
(window-delete rediw)).
((eq? ch #2) (Window-Set-Position! redsw 11 10).
(Window-Set-Size! redsw 8 57).
(Window-Clear redsw) (red_sym).
(window-delete redsw)).
((eq? ch #ESCAPE)).
(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 #1) (Window-Set-Position! deliw 11 10).
(Window-Set-Size! deliw 4 57).
(Window-Clear deliw) (del_ill).
(window-delete deliw)).
((eq? ch #2) (Window-Set-Position! delsw 6 10).
(Window-Set-Size! delsw 17 57).
(Window-Clear delsw) (del_sym).
(window-delete delsw)).
((eq? ch #ESCAPE)).
(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)))))).