13/12/2008, 20:12
|
| | Fecha de Ingreso: junio-2008
Mensajes: 36
Antigüedad: 16 años, 5 meses Puntos: 0 | |
Problema con programa en Lisp Que tal! tengo un problema con este programa me marca un error del tipo
Parse Error: End of File.
Si alguien me pudiera auxiliar se los agradecería...
Saludos...
(defun myc ()
(prog (q historia) ; inicializa la cola y los posibles movimientos
(setq posibles '((0 2 1) (0 1 1) (1 1 1) (1 0 1) (2 0 1)))
(setq q (list (list (list '(3 3 1) '(0 0 0)))))
repeat ; este bucle se repite hasta que está vacía la orilla izquierda
(cond ((equal (caaar q) '(0 0 0))
(return (display (reverse (car q)))))
; desecha un camino si da lugar a canibalismo
; o representa un bucle
((or (comido (caar q)) (member (casar q) historia))
(setq q (cdr q))
(go repeat))
)
; ahora añade este estado a la historia y pasa
; al siguiente estado
(setq historia (cons (caar q) historia))
(setq q (append (expandir (car q) posibles) (cdr q)))
(go repeat)
]
(defun comido (estado)
; esta función comprueba si existe canibalismo examinando
; la orilla izquierda (car estado). Si allí M es 1 0 2
; y M <>C, entonces hay canibalismo en una u otra orilla.
; Si no, no hay en ninguna.
(and (or (equal (caar estado) 1) (equal (caar estado) 2))
(not (equal (caar estado) (cadar estado)))
]
(defun expandir (caminos posibles)
; esta función desarrolla todos los posibles movimientos
; a partir del estado actual.
(cond ((null posibles) nil)
((movcorrecto (car mover) (car posibles))
(cons (cons (camino (mover (car camino) (car posibles)) camino)
(expandir camino (cdr posibles))))
(t (expandir camino (cdr posibles)))
(defun movcorrecto (estado unmovimiento)
; aquí se resta el número de misioneros y caníbales
; que hay en el bote del número que queda
; en la orilla actual, para asegurarse que no se cogen
; más de los que hay.
(cond ((zerop (caddar estado)) ; ve si bote en la derecha
(restatodo (cadr estado) unmovimiento))
(t (restatodo (car estado) unmovimiento))
(defun restatodo (triple unmovimiento)
; esta función resta loa tres números de un movimiento
; del bate del contenido de una orilla y devuelve
; nil si cualquiera de Las diferencias es <0
(not (minusp (apply 'min (mapcar ' - triple unmovimiento)
]
(defun mover (estado unmovimiento)
; esta función realiza un movimiento restando
; los números de un movimiento del bote de una orilla
; y sumándolos a la otra.
(cond ((zerop (caddar estado))
; comprueba si bote en la derecha
(list (mapcar '+ (car estado) unmovimiento) (mapcar '- (cadr estado) unmovimiento)))
(t (list (mapcar '- (car estado) unmovimiento) (mapcar '+ (cadr estado) unmovimiento)))
]
(defun display (path)
; esta función presenta la solución resultante
(con ((null camino) 'end)
(t (print (car camino))
(terpri)
(display (cdr camino))
] |