(deffacts estado-inicial   (pila A B C)   (pila D E F)   (objetivo C esta-encima-del E))
   
   (defrule mover-bloque-sobre-bloque      ?objetivo <- (objetivo ?bloque-1  esta-encima-del ?bloque-2)      ?pila-1 <- (pila ?bloque-1 $?resto-1)      ?pila-2 <- (pila ?bloque-2 $?resto-2)     =>      (retract ?objetivo ?pila-1 ?pila-2)      (assert (pila $?resto-1))      (assert (pila ?bloque-1 ?bloque-2 $?resto-2))      (printout t ?bloque-1 " movido encima del " ?bloque-2 "." crlf))              (defrule mover-bloque-al-suelo      ?objetivo <- (objetivo ?bloque-1 esta-encima-del suelo)      ?pila <- (pila ?bloque-1 $?resto)     =>      (retract ?objetivo ?pila)      (assert (pila ?bloque-1))      (assert (pila $?resto))      (printout t ?bloque-1 " movido encima del suelo. " crlf))

(defrule libera-bloque-movible      (objetivo ?bloque esta-encima-del ?)      (pila ?cima $? ?bloque $?)     =>      (assert (objetivo ?cima esta-encima-del suelo)))         (defrule libera-bloque-soporte      ?objetivo <- (objetivo ? esta-encima-del ?bloque)      (pila ?cima $? ?bloque $?)     =>      (assert (objetivo ?cima esta-encima-del suelo)))