; shrink.lsp - a "doctor" like program for xlisp
;
; Donated to amus By Tom Niccum of Beta Research
;
; Taken from the book:
; The Elements of Arificial Intelligence
; An Introduction using Lisp - by Steven L. Tanimoto,
; Computer Science Press, 1987
;
(defun printl (message)
(prog ()
(MAPCAR
(FUNCTION (LAMBDA (TXT)
(PROG () (PRIN1 TXT) (princ " " )) ))
MESSAGE)
(terpri) ) )
(defun wword ()
(setq wwordcount (+ wwordcount 1))
(cond ((equal wwordcount 3) (setq wwordcount 0)))
(nth wwordcount '(when why where)) )
(defun wpred (w)
(member w '(why where when what)) )
(defun dpred (w)
(member w '(do can should would)) )
(setq punts
'((please go on)
(tell me more)
(i see)
(what does that indicate)
(but why be concerned about it)
(just tell me how you feel) ) )
(defun youme (w)
(cond ((eq w 'i) 'you)
((eq w 'me) 'you)
((eq w 'you) 'me)
((eq w 'my) 'your)
((eq w 'your) 'my)
((eq w 'yours) 'mine)
((eq w 'mine) 'yours)
((eq w 'am) 'are)
(t w) ) )
(defun youmemap (lst)
(mapcar (function youme) lst))
(defun verbp (w)
(member w '(go have be try eat take help make get jump write
type fill put turn compute think drink blink crash crunch
add) ) )
(defun match (p s)
(cond
(( null p) (null s))
((atom (car p))
(and s
(equal (car p) (car s))
(match (cdr p) (cdr s)) ) )
((and
s
(eq (caar p) '?) )
(cond ((match (cdr p) (cdr s))
(set (cadar p) (car s))
t)
(t nil) ) )
((eq (caar p) '*)
(cond
((and s (match (cdr p) (cdr s)))
(set (cadar p) (list (car s))) t)
((match (cdr p) s)
(set (cadar p) nil) t)
((and s (match p (cdr s)))
(set (cadar p) (cons (car s) (eval (cadar p)))) t)
(t nil) ) )
((and
s
(apply (caar p) (list (car s)))
(match (cdr p) (cdr s)) )
(set (cadar p)(car s)) t)
(t nil) ) )
(defun shrink ()
(prog ()
(setq wwordcount 0)
(setq puntcount 0)
(princ "please lie down on the couch")
(terpri)
(princ "please enclose your input in parentheses")
(terpri)
loop (setq s (youmemap (read)))
(cond
((match '(bye) s)
(return 'goodbye))
((match '(you are (* x)) s)
(printl (append '(please tell me)
(list (wword))
'(you are)
X)))
((match '(you have (* x)) s)
(printl (append '(how long have you had) x)) )
((match '(because (* x)) s)
(princ "is that really the reason")
(terpri) )
((match nil s) (princ "please say something, anything")
(terpri) )
((match '(yes (* x)) s)
(printl (append '(how can you be so sure) x)) )
((match '(me are (* x)) s)
(printl (append '(oh yeah i am) x)) )
((match '((verbp v) (* x)) s)
(printl (append '(oy s/he wants that i should go and)
(list v) x) ) )
((match '((wpred w) (* x)) s)
(printl (append '(you tell me) (list w) x) ) )
((match '((dpred w) me (* x)) s)
(printl (append '(perhaps i)(list w) x) ) )
((match '(do me think (* x)) s)
(princ "I think that you should answer that yourself")
(terpri) )
((member 'dream s)
(princ "for dream analysis see freud")
(terpri) )
((member 'love s)
(princ "all is fair in love and war")
(terpri) )
((member 'no s)
(princ "negativity will get you nowhere")
(terpri) )
((member 'maybe s)
(princ "be more decisive")
(terpri) )
((member 'you s) (printl s))
(t (setq puntcount (+ puntcount 1))
(cond ((equal puntcount 7)
(setq puntcount 0)))
(printl (nth puntcount punts)) ) )
(go loop) ))