Chess en jess 3

Hola, respecto al código que me facilitaste el otro día tengo alguna pregunta más:
(defrule move-1
?p <- (pieza (name caballo)
(¿x?x)
(¿y?y))
=>
(duplicate ?p (parent p)
(x (+ ?x 1))
(y (+ ?y 2))))
)
En la regla anterior veo que utilizas duplicate (esto imagino que lo que hace) es duplicar el caballo en la nueva posición. ¿Cómo puedo eliminar la pieza de la vieja posición...? O esto no sería necesario...
Suponiendo que tengo que calcular los diferentes movimientos del caballo, me comentabas que poniendo prioridades se comen a los peones secuencialmente... No entiendo muy bien esto...
También me comentas que con el slot parent puedo obtener la secuencia de movimientos... Realmente, que hace el slot parent... Creo que es como la variable de información de la posición anterior o algo así... Pero no lo tengo muy claro...
Finalmente, cuál es la mejor forma de simular la colocación de las piezas (un caballo y cinco peones) sobre el tablero. Utilizando petición de variables, ¿existe alguna función aleatoria...?
Muchas gracias de antemano y espero que puedas ayudarme.
R.

1 respuesta

Respuesta
1
Si analizas el ejemplo dilemma. Clp verás que se trata de una solución de fuerza bruta:
Va probando todas las posibilidades, abandonando en cuanto se incumple alguna de las condiciones y descartando los bucles (algo que también está pendiente de solucionar en el código que te pasé) y quedándose con las soluciones. Ese mismo enfoque es el del código que propuse. Analiza bien este ejemplo y cuando comprendas lo que hace entenderás mejor lo que tienes que hacer.
Para responder a tus preguntas:
No es necesario eliminar la pieza de la vieja posición, pues una vez que un hecho ha sido procesado por el motor de reglas no vuelve a ser procesado hasta que se modifica. Como hay que crear reglas para las 8 posibilidades de movimiento que tiene el caballo, si lo eliminas, sólo se explorará una posibilidad en vez de las ocho.
Además, si se elimina, el slot parent perdería su función.
Lo de las prioridades no es la mejor manera de manejar los peones que quedan. Lo he pensado un poco más y es más sencillo que los caballos tengan una lista con los peones. Así al hacer el duplicate la lista se va copiando y cada rama tiene su información de estado.
Además así es más fácil reconecer la solución: Cuando el tamaño de la lista es 0.
Esto afecta a la definición del fact caballo y a la regla que determina cuando se come un peón:
(Deftemplate caballo
(Slot parent)
(Multislot peones)
(Slot x)
(Slot y)
)
(Deftemplate peón
(Slot x)
(Slot y)
)
;Come peon
(defrule comePeon
?p <= (peon (x ?x)(y ?y))
?c <= (caballo (x ?x)(y ?y)(peones $?peones&:(member$ ?p ?peones)))
=>
(¿Bind?index (member$? ¿p? Peones))
(¿Modify?c(peones (delete$? ¿Peones? ¿Index? Index)))
)
;Solucion encontrada
(Defrule solución
(Salience 1000)
?c <= (caballo (peones $?peones&:(= (length$ ?peones) 0)))
=>
; Con store se guarda la solución para obtenerla desde el programa Java que la va a representar gráficamente.
(store "SOLUCION" ?c)
; Las soluciones para este problema son infinitas, como sólo necesitas una, lo mejor es parar en cuanto se encuentre.
(Halt)
)
Para simular la colocación de las piezas basta con hacer un assert (o deffacts) de los facts peón y caballo.
Ten en cuenta que no he probado mi código, pues no dispongo de una copia de Jess válida actualmente, y puede tener algún fallo, pero ya no deberías tener problemas en encontrar la solución.
Hola. Agradezco enormemente la ayuda que me estás prestando... porque me estoy volviendo un poco loco con este tema.
Voy a probar que tal, a ver si al final consigo que esto funcione.
Gracias de nuevo por tu ayuda.
Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas