Смекни!
smekni.com

Разработка оболочки экспертной системы (стр. 3 из 4)

Формат

(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 ((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 #&bsol;1) (menufiles))

((eq? ch #&bsol;2) (menudb))

((eq? ch #&bsol;3) (menucons))

((eq? ch #&bsol;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 ((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 #&bsol;1) (loading))

((eq? ch #&bsol;2) (saving))

((eq? ch #&bsol;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 ((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 #&bsol;1)

(adding) (menudb))

((eq? ch #&bsol;2)

(deleting) (menudb))

((eq? ch #&bsol;3)

(redacting) (menudb))

((eq? ch #&bsol;4)

(viewing) (menudb))

((eq? ch #&bsol;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! 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) #&bsol;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 #&bsol;1) (Window-Set-Position! addiw 6 10)

(Window-Set-Size! addiw 17 57)

(Window-Clear addiw) (add_ill)

(window-delete addiw))

((eq? ch #&bsol;2) (Window-Set-Position! addsw 6 10)

(Window-Set-Size! addsw 17 57)

(Window-Clear addsw) (add_sym)

(window-delete addsw))

((eq? ch #&bsol;ESCAPE))

(t (adding)) ))

(define ill)

(define sym)

;Добавление болезни

(define (add_ill)

(define n)