#lang scheme


;;; HAY 256 TABLAS DISTINTAS
(define asignaciones
  (lambda (x)
    (asignaciones-aux 
     (- x 1)
     (list
      (list 0)
      (list 1)
      ))))

(define asignaciones-aux
  (lambda (x 1asig)
    (cond
      ((= x 0) 1asig)
      (else 
       (asignaciones-aux 
        (- x 1) 
        (genera-asig 
         ;(car lista)
         1asig) ) ) ) ))

(define genera-asig
  (lambda (1asig)
    (mi-map 
     (lambda (second)
       (map
	(lambda (first)
	  (append second first)) 
        (list
         (list 0)
         (list 1)
;         (list -1);para tres valores de verdad
         )))
     1asig) ))

(define mi-map
  (lambda (proc lista)
    (cond ((null? lista) '())
	  (else
	   (append
	    (proc (car lista))
	    (mi-map proc (cdr lista)))) )))

;;;
(define but-last
  (lambda (lista)
    (reverse (cdr (reverse lista))) ))

(define tabla-ini
  (list
   (list '(1 1 1) 0)
   (list '(1 1 0) 0)
   (list '(1 0 1) 1)
   (list '(1 0 0) 0)
   (list '(0 1 1) 1)
   (list '(0 1 0) 0)
   (list '(0 0 1) 0)
   (list '(0 0 0) 1) ))

(define haz_tabla
  (lambda (lista_p lista);tabla-ini 1-interpretacion
    (if (null? lista_p)
        '()
        (cons
         (list (caar lista_p) (car lista)); (car lista))
         (haz_tabla (cdr lista_p) (cdr lista)) )) ))

(define todos_automatas
  (lambda (lista_c lista_p)
    (if (null? lista_c)
        '()
        (cons
         (haz_tabla lista_p (car lista_c))
         (todos_automatas (cdr lista_c) lista_p)) ) ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define print-una-tabla
  (lambda (tabla)
    (for-each
     (lambda (f)
       (printf "~a~n" f) )
     tabla )
    ))
(define print-tablas
  (lambda (tablas)
    (let go ((i 0)
             (j (length tablas))
             )
      (if (= i j)
          #t
          (begin
            (printf "Tabla nº: ~a~n" i)
            (print-una-tabla (list-ref tablas i))
            (go (add1 i) j)
            )
          )
      )
    ))

(provide 
 asignaciones asignaciones-aux genera-asig mi-map but-last haz_tabla
 todos_automatas tabla-ini print-una-tabla print-tablas)

;(define todas_tablas (todos_automatas (asignaciones 8) tabla-in));tabla-ini

;(define numero-orden-de-la-tabla (random 256))

;(define la-tabla (list-ref todas_tablas numero-orden-de-la-tabla))

