Estoy tratando de hacer un programa de clips para resolver cualquier nivel de Sokoban pero tengo un gran problema:

En este ejemplo, solo tengo el estado inicial del campo y una regla que intenta mover al jugador hacia la derecha si no hay una caja o un obstáculo (en el programa completo también tengo reglas que mueven las cajas). El problema viene cuando tengo un estado que coincide con el LHS ?ff <- (R ?Ir ?Xr ?Yr $?a B ?Ib ?Xb ?Yb $?b S ?Is ?Xs ?Ys ?Es $?c W ?w D ?d L ?l F ?) y otro, creado debido al movimiento de las cajas, que no permite que la regla (not (R $? B ? =(+ ?Xr 1) ?Yr $?) ) sea cierta incluso si el primer estado lo hace realidad.

(deffacts InitialState
    ;------static---------
            (MAX_DEPTH 5)
            ;field
            ;      X Y
            (FIELD 8 5)
            ;obstacle
            ;  X Y
            (O 4 1)
            (O 1 3)
            (O 8 3)
            (O 4 3)
            (O 5 3)
            (O 4 4)
            (O 4 5)


    ;-----dynamic-----
            (
            ;robot
            ; I X Y
            R 1 2 4

            ;box
            ; I X Y
            B 1 2 2
            B 2 3 4
            B 3 6 2

            ;storehouse
            ; I X Y E
            S 1 7 1 0
            S 2 5 4 0
            S 3 5 5 0

            ;win
            W 0 ;Posibilidad de cambiar la R por W asi paramos la ejec

            ; depth
            D 0

            ;last move
            ;0:nothing 1:up 2:right 3:down 4:left
            L 0

            ;father id
            F 0
            )
    )

    (defrule move_right_no_box
            (MAX_DEPTH ?MD)
            (FIELD ?Xf ?Yf)

            ?ff <- (R ?Ir ?Xr ?Yr $?a B ?Ib ?Xb ?Yb $?b S ?Is ?Xs ?Ys ?Es $?c W ?w D ?d L ?l F ?)


            ;comprueba que a la derecha no hay un obstacle
            (not (O =(+ ?Xr 1) ?Yr) )

            ;comprueba que a la derecha no hay un box
            (not (R $? B ? =(+ ?Xr 1) ?Yr $?) )
    =>      
            (assert (R ?Ir (+ ?Xr 1) ?Yr $?a B ?Ib ?Xb ?Yb $?b S ?Is ?Xs ?Ys ?Es $?c W ?w D (+ ?d 1) L 2 F ?ff))
    )

Por ejemplo, tengo un estado que no tiene una caja u obstáculo a la derecha, pero tengo otro estado que sí. Necesito una forma de establecer una relación entre las reglas: ?ff <- (R ?Ir ?Xr ?Yr $?a B ?Ib ?Xb ?Yb $?b S ?Is ?Xs ?Ys ?Es $?c W ?w D ?d L ?l F ?) y (not (R $? B ? =(+ ?Xr 1) ?Yr $?) ) para asegurarnos de que se refieren al mismo estado (y que un estado diferente, que es diferente al que estoy evaluando, no interfiere).

En otras palabras, lo que necesito es una forma de asegurarme de que ambos LHS estén evaluando el mismo estado. ¡Gracias!

PD1: No puedo usar algo como una identificación porque hace que la ejecución del programa sea demasiado lenta.

0
edoelas 16 oct. 2018 a las 16:03

2 respuestas

La mejor respuesta

Bien, al final no pude encontrar una manera de asegurarme de que dos LHS estén evaluando el mismo estado, así que resolví el problema usando la función 'miembro': https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node12 .2.3.html

Puedo crear una regla LHS que siempre devuelve Verdadero y se compone de variables de campo múltiple y luego, usando la función miembro, verifica si parte de la regla satisface mi condición.

Otra opción (incluso si no estoy seguro de que esto funcione debido a que no lo he probado) es evaluar todas las condiciones en un LHS usando esto: https: //www.csie .ntu.edu.tw / ~ sylee / cursos / clips / bpg / node5.4.1.4.html

0
edoelas 21 oct. 2018 a las 18:56

Afirmar un hecho que contenga información sobre el estado en el que ambas reglas coinciden.

0
Gary Riley 17 oct. 2018 a las 16:26