Как установить связь между двумя LHS в клипах?

Я пытаюсь сделать программу клипов, чтобы решить любой уровень Сокобана, но у меня огромная проблема:

В этом примере у меня есть только начальное состояние поля и правило, которое пытается переместить игрока вправо, если нет коробки или препятствия (в полной программе у меня также есть правила, которые перемещают коробки). Проблема возникает, когда у меня есть состояние, которое совпадает с 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 ?) и другое состояние, созданное из-за движения ящиков, что не позволяет правилу (not (R $? B ? =(+ ?Xr 1) ?Yr $?) ) быть истинным, даже если первое состояние делает его истинным.

(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))
    )

Например, у меня есть состояние, в котором нет прямоугольника или препятствия справа, но у меня есть другое состояние, в котором есть. Мне нужен способ установить связь между правилами: ?ff <- (R ?Ir ?Xr ?Yr $?a B ?Ib ?Xb ?Yb $?b S ?Is ?Xs ?Ys ?Es $?c W ?w D ?d L ?l F ?) и (not (R $? B ? =(+ ?Xr 1) ?Yr $?) ), чтобы убедиться, что они относятся к одному и тому же состоянию (и другое состояние, которое отличается от того, которое я оцениваю, не мешает) .

Другими словами, мне нужен способ убедиться, что обе LHS оценивают одно и то же состояние. Спасибо!

PD1: Я не могу использовать что-то вроде идентификатора, потому что это слишком замедляет выполнение программы.


person edoelas    schedule 16.10.2018    source источник


Ответы (2)


Утвердить факт, содержащий информацию о состоянии, которому соответствуют оба правила.

person Gary Riley    schedule 17.10.2018

Хорошо, в конце я не смог найти способ убедиться, что два LHS оценивают одно и то же состояние, поэтому я решил проблему, используя функцию 'member': https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node12.2.3.html

Я могу создать правило LHS, которое всегда возвращает True и состоит из многополевых переменных, а затем с помощью функции-члена проверяет, удовлетворяет ли часть правила моему условию.

Другой вариант (даже если я не уверен, что это работает, потому что я его не тестировал) - оценить все условия в одной LHS, используя следующее: https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.1.4.html

person edoelas    schedule 21.10.2018