;;; -*- Mode: Lisp;; Syntax: vlisp;; -*- File: eliza1.vlisp ; ; eliza d'après Weizenbaum (include "match.vlisp") (defmacro letall (a . b) (let ((aliste (eval a))) `((lambda ,(mapcar (car aliste) 'car) ,@b) ,@(mapcar (car aliste) '(lambda (z) (list 'quote (cdr z))))))) (de analyse (prob) (some (lambda (rule) (let ((result (match (rule-pattern rule) prob))) (if (eq (nextl result) 'ok) (reflechit (switch-viewpoint result) (random-elt (rule-responses rule)))))) *eliza-rules*)) (de switch-viewpoint (words) (sublis '((I . you)(you . I)(me . you)(am . are)) words)) (de reflechit (env model) (eval `(letall ',env ,model))) (de repond (reponse) (if reponse (print (cons "eliza :" reponse)))) (de prompt (x) (setq prompt x)) (de random-elt (l) (if l ((random (1+ (length l))) l))) (de rule-pattern (rule) (car rule)) (de rule-responses (rule) (cdr rule)) (de eliza ()(push prompt)(prompt "à vous : ") (do ((sentence (repond (analyse (read))) (repond (analyse (read))))) ((null sentence) "au-revoir")) (prompt (pop))) (setq *eliza-rules* '( ((?- hello ?-)`(How do you do. Please state your problem)) ((?- I want ?x) `(What would it mean to you if you got ,@x) `(Why do you want ,@x) `(Suppose you got ,@x soon)) ((?- if ?x) `(Do you really think its likely that ,@x) `(Do you wish that ,@x) `(What do you think about \" ,@x \"?) `(Really-- if @x)) ((?- no ?-) `(Why not?) `(You are being a bit negative) `(Are you saying \"NO\" just to be negative?)) ((?- I was ?x) `(Were you really?) `(Perhaps I already knew you were ,@x) `(Why do you tell me you were ,@x now?)) ((?- I feel ?x) `(do you often feel ,@x)) ((?- I felt ?-) `(So?) `(What other feelings do you have?)) ((?x I think ?y) `(do you really ,@x think that ,@y ?)) ((bye) ()) ))