Кто-то здесь помог мне исправить мой код, и он отлично работает для:
(утверждать (стек A B C) (стек D E F) (стек ворот D C B) (стек ворот A) (стек ворот F E))
и
(утверждать (стопка A B C D E F) (стопка ворот A B C D E F))
Но для:
(утверждать (стек A B C) (стек ворот A B) (стек ворот C))
он просто кладет А на пол и затем останавливается.
Это мой новый код:
(defrule move-direct
?stack1 <- (stack ?block1 $?bottom)
?stack2 <- (stack ?block2 $?goalbottom)
(goal-stack $? ?block1 ?block2 $?goalbottom)
=>
(retract ?stack1 ?stack2)
(assert (stack ?block1 ?block2 ?goalbottom))
(assert (stack $?bottom))
(printout t ?block1 " moved on top of " ?block2 crlf))
(defrule move-on-floor
?stack <- (stack ?top $?middle ?next $?bottom)
(goal-stack $? ?next $?goalbottom)
(not (stack $? ?next $?goalbottom))
=>
(retract ?stack)
(assert (stack ?top))
(assert (stack $?middle ?next $?bottom))
(printout t ?top " moved on to the floor" crlf))