;;; decisionFile.scm Dave Reed ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Plays an interactive guessing game with the user, based on a ;;; decision tree that is read in from a file (fname). ;;; If the traversal fails to find the correct answer, it will ;;; prompt the user for the answer and an appropriate question, ;;; and will update the decision tree in the file. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define QUIZ-DB 'shoe) (define (load-file fname) (let ((infile (open-input-file fname))) (begin (set! QUIZ-DB (read infile)) (close-input-port infile)))) (define (update-file fname) (let ((outfile (open-output-file fname 'replace))) (begin (display QUIZ-DB outfile) (close-output-port outfile)))) (define (guess-game) (define (replace-leaf dtree oldval newval) (cond ((list? dtree) (list (car dtree) (replace-leaf (cadr dtree) oldval newval) (replace-leaf (caddr dtree) oldval newval))) ((equal? dtree oldval) newval) (else dtree))) (define (guess dbase) (if (list? dbase) (begin (display (car dbase)) (display " ") (if (member (read) '(y yes)) (guess (cadr dbase)) (guess (caddr dbase)))) (begin (display "Is it a ") (display dbase) (display "? ") (if (member (read) '(y yes)) (begin (display "Thanks for playing!") (newline)) (begin (display "What is your answer? ") (let ((answer (read))) (begin (display "Enter a question that is true for ") (display answer) (display " (in parentheses): ") (set! QUIZ-DB (replace-leaf QUIZ-DB dbase (list (read) answer dbase)))))))))) (guess QUIZ-DB))