如何在剪辑中的两个 LHS 之间建立关系?
How can I stablish a relation between two LHS in clips?
我正在尝试制作一个剪辑程序来解决任何推箱子关卡,但我遇到了一个大问题:
在这个例子中,我只有场地的初始状态和一个规则,如果没有盒子或障碍物,我会尝试将玩家向右移动(在完整程序中,我也有移动规则那些盒子)。当我有一个与 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 ?)
匹配的状态和另一个由于框的移动而创建的状态时,问题就来了,即使第一个 estate 也不允许规则 (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:我不能使用 ID 之类的东西,因为它会使程序的执行速度太慢。
断言一个事实,其中包含有关两个规则都匹配的状态的信息。
好吧,最后我找不到一种方法来确保两个 LHS 正在评估相同的状态,所以我使用 'member' 函数解决了这个问题:https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node12.2.3.html
我可以创建一个始终 returns 为真且由多字段变量组成的 LHS 规则,然后使用成员函数检查规则的一部分是否满足我的条件。
另一种选择(即使我不确定这是否有效,因为我还没有测试过)是使用以下方法评估一个 LHS 中的所有条件:
https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.1.4.html
我正在尝试制作一个剪辑程序来解决任何推箱子关卡,但我遇到了一个大问题:
在这个例子中,我只有场地的初始状态和一个规则,如果没有盒子或障碍物,我会尝试将玩家向右移动(在完整程序中,我也有移动规则那些盒子)。当我有一个与 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 ?)
匹配的状态和另一个由于框的移动而创建的状态时,问题就来了,即使第一个 estate 也不允许规则 (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:我不能使用 ID 之类的东西,因为它会使程序的执行速度太慢。
断言一个事实,其中包含有关两个规则都匹配的状态的信息。
好吧,最后我找不到一种方法来确保两个 LHS 正在评估相同的状态,所以我使用 'member' 函数解决了这个问题:https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node12.2.3.html
我可以创建一个始终 returns 为真且由多字段变量组成的 LHS 规则,然后使用成员函数检查规则的一部分是否满足我的条件。
另一种选择(即使我不确定这是否有效,因为我还没有测试过)是使用以下方法评估一个 LHS 中的所有条件: https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.1.4.html