Как я могу зафиксировать отношения между двумя LHS в клипах? - PullRequest
0 голосов
/ 16 октября 2018

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

В этом примере у меня есть только начальное состояние поля и правило, которое пытаетсяпереместить игрока вправо, если нет коробки или препятствия (в полной программе у меня также есть правила, которые перемещают коробки).Проблема возникает, когда у меня есть состояние, которое совпадает с 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: я не могу использовать что-то вроде идентификатора, потому что это делает выполнение программы слишком медленным.

Ответы [ 2 ]

0 голосов
/ 21 октября 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

0 голосов
/ 17 октября 2018

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

...