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