LINUX.ORG.RU

Не могу настроить


0

0

Здрасть, вот такая вот проблема. Поставили задание написать ЕС, кое как вспомнив азы С++ написал(с трудом)эту систему.В эинете нашел похожую тему только написано все на Лиспе.Сижу пол часа уже запустить никак не могу(помогите настроить програмульку или обьясните что икак мне сделать.Заранее спасибо. Ниже текст самой программы Полный текст программы на языке 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 #\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 ((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 #\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 ((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 #\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! 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) #\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)) ))

Do_It_2_Night
() автор топика
Ответ на: комментарий от Do_It_2_Night

;Редактирование

(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)) ))

Do_It_2_Night
() автор топика
Ответ на: комментарий от Do_It_2_Night

;Удаление болезни

(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 6 8 9 12)) («ангина» (1 2 5 8 9 10 11)) («грипп» (1 2 4 5 7 8 9 14)) («переутомление» (1 8 9 10 13 15)) («мигрень» (1 9 12 13 14 16)))

ПЫ.СЫ сори за флуд...

Do_It_2_Night
() автор топика

(«ангина» (1 2 5 8 9 10 11)

ненене... так систему диагностики не делают, необходимо

(«ангина» ((1 0.9) (2 0.7) (5 0.5) (8 0.6) (9 0.6) (10 0.7) (11 0.7))

второе число это вероятность встретить симптом при данном заболевании

естественно по баесу считаем какая болезн[ьи] вероятнее получаются...

рассказ как построить есть на http://lib.rus.ec/b/156597 там apl, но как пример поэтапное построение экспертной системы написано.

где взять вероятности?

1) по каждому диагнозу просмотреть 10000 историй болезни

2) опросить экспертов правильно опросить их можно получив сразу численные оценки вот таким образом http://cran.r-project.org/web/packages/expert/index.html

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

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

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.