Кто-то здесь помог мне исправить мой код, и он отлично работает для:
(assert (стек ABC) (стек DEF) (стек DCB ворот) (стек ворот A) (FE ворот стека)))
и
(утверждение (стек ABCDEF) (стек ворот ABCDEF))
Но для:
(утверждение (стек ABC) (стек ворот AB) (стек ворот 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))