如何在片段中建立两个LHS之间的关系?

时间:2018-10-16 13:03:37

标签: logic artificial-intelligence clips expert-system

我正在尝试制作一个剪辑程序以解决任何推箱子问题,但我遇到了一个大问题:

在此示例中,我只有该字段的初始状态,并且有一个规则尝试在没有框或障碍物的情况下将玩家向右移动(在完整程序中,我也具有将框移动的规则)。当我有一个与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:我不能使用ID之类的东西,因为它会使程序的执行速度太慢。

2 个答案:

答案 0 :(得分:0)

声明一个事实,其中包含有关两个规则都匹配的状态的信息。

答案 1 :(得分:0)

好的,最后我找不到确保两个LHS评估相同状态的方法,因此我使用了'member'函数:https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node12.2.3.html

解决了该问题。

我可以创建一个始终返回True并由多字段变量组成的LHS规则,然后使用成员函数检查规则的一部分是否满足我的条件。

另一种选择(即使由于我尚未测试而无法确定是否可行),也可以使用以下方法评估一个LHS中的所有条件: https://www.csie.ntu.edu.tw/~sylee/courses/clips/bpg/node5.4.1.4.html