#lang racket

(define tabla_tacto
  (list
   (list 1 0 0)
   (list 0 1 0)
   (list 0 0 1)
   ))
(define automata%
  (class object%
    (init-field
     (tabla '(tabla))
     )
    (field
     (estado 0);;sensor de energia
     )
    (define segun_tacto_1
      (lambda (discrim_visual discrim_tactil)
        (if
         (ormap
          (lambda (item)
            (equal? item discrim_tactil))
          tabla)
         (cons estado discrim_tactil)
         (cons 0 discrim_visual)
         )
        ))
    (define vecinos_1
      (lambda (analisis_olfativo)
        (filter-map
         (lambda (o n)
           (if (= o 1)
               (if (> n 2)
                   n
                   #f)
               #f))
         analisis_olfativo '(0 1 2 3 4 5 6 7))
        ))
    (define to_accion_segun_olfato
      (lambda (posicion)
        (case posicion
          ((3) '(0 0 0 0));;girar-dcha
          ((4) '(0 0 0 0))
          ((5) '(0 0 0 0))
          ((6) '(1 0 0 0));;girar-izqda
          ((7) '(1 0 0 0))
          )
        ))
    
    (define segun_tacto_2
      (lambda (discrim_visual discrim_tactil analisis_olfativo)
        (let ((lista_vecinos (vecinos_1 analisis_olfativo)))
          (cond
            ((ormap
              (lambda (item)
                (equal? item discrim_tactil))
              tabla) (cons 1 discrim_tactil))
            ((null? lista_vecinos) (cons 0 discrim_visual))
            (else
             (to_accion_segun_olfato (car lista_vecinos)) )
            )
          )
        ))
    (define/public proceso!
      (lambda (discrim_visual discrim_tactil analisis_olfativo sensor_energia)
        ;;cambio en el sensor: funcion de cambio de estado
        (set! estado sensor_energia)
        (cond
          ((= estado 0) (cons estado discrim_visual))
          ((= estado 1) (segun_tacto_1 discrim_visual discrim_tactil))
          ((= estado 2) (segun_tacto_2 discrim_visual discrim_tactil analisis_olfativo))
          )
        ))
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;
(define automata_decision
  (make-object automata% tabla_tacto))
;;;;;;;;;;;;;;;;;;;;;;;;;
(provide automata_decision)
