ELIZA.LSP



; ===================================================================
; programa:     emulador de ELIZA
; programador:  j. Rafael R. Ochoa
; cargar como:  (load eliza.lsp)
; correr como:  (eliza)
; ===================================================================

(load "C:\\RAFA\\C\\C\\match.lsp")

; ============ preguntas varias ==================================
(setq preguntas (list '(haces deporte?) '(que tal la salud?) '(conoces a juan?)))

; =================== Inicio del programa
(defun eliza ()
 (print '(teclear frases entre parentesis))
 (print '(teclear by sin parentesis para salir))
 (print '(paciente en tratamiento))
 (psicologo)
 (print '(Gracias por consultarme))
)

; =======================================================
; === funcion:    psicologo
; === recibe:     nada
; === regresa:    nada
; === objetivo:   entrar en sesion con eliza
; === fecha:      Enero/1998
; =======================================================
(defun psicologo()
 (loop
     (print '==>)
     (pregunta)
     (setf in (read))
     (if (eq in 'by) (return))
     (print (respuesta (doctor in)))
 )
)


; =========================================================================
; funcion:  doctor
; objetivo: reconocer la palabra clave
; recibe:   frase del paciente
; regresa:  la palabra de control
; =========================================================================
(defun doctor (in)
   (cond
      ( (not (eq 'fail (match '(?? (?familiar hermano hermana primo padre) ??) in)))
       (return-from doctor 'familiar))
      ( (not (eq 'fail (match '(?? (?fruta manzana mandarina naranja) ??) in)))
       (return-from doctor 'fruta))
      ( (not (eq 'fail (match '(?? (?deporte voli fut basquet) ??) in)))
       (return-from doctor 'deporte))
      ( (not (eq 'fail (match '(?? (?enfermo gripa dolor jaqueca) ??) in)))
       (return-from doctor 'enfermo))
      (t (return-from doctor 'otro))
   )
)


; =========================================================================
; funcion:  respuesta
; objetivo: dada una palabra clave, selecciona su posible pregunta
; recibe:   palabra clave
; regresa:  respuesta seleccionada
; =========================================================================
(defun respuesta (control)
  (cond
     ((eq control 'familiar) '(dime mas de tu familiar))
     ((eq control 'fruta)    '(comes mucho de eso?))
     ((eq control 'deporte)  '(y no te cansas?))
     ((eq control 'enfermo)  '(por que no tomas medicina?))
     ((eq control 'otro)      (car preguntas))
  )
)

; =========================================================================
; funcion:  pregunta
; objetivo: alternar las preguntas de eliza (global)
; recibe:   nada
; regresa:  nada
; =========================================================================

(defun pregunta()
   (let ((a (car preguntas))
         (b (cdr preguntas)))
        (setq preguntas (append b (list a)))))
; =========================================================================FIN