(defmodule MAIN (export ?ALL)) (deftemplate MAIN::pila (multislot estado)) (deffacts estado-inicial (pila (estado A B C)) (pila (estado D E F)) (objetivo C esta-encima-del E)) (defrule MAIN::inicio => (focus APILA)) (defmodule APILA (import MAIN ?ALL)) (defrule APILA::mover-bloque-sobre-bloque ?objetivo <- (objetivo ?bloque-1 esta-encima-del ?bloque-2) ?pila-1 <- (pila (estado ?bloque-1 $?resto-1)) ?pila-2 <- (pila (estado ?bloque-2 $?resto-2)) => (retract ?objetivo ?pila-1 ?pila-2) (assert (pila (estado $?resto-1))) (assert (pila (estado ?bloque-1 ?bloque-2 $?resto-2))) (printout t ?bloque-1 " movido encima del " ?bloque-2 "." crlf)) ;;; Modulo-> autofocus (defmodule LIBERA (import MAIN ?ALL)) (defrule LIBERA::libera-bloque-movible (declare (auto-focus TRUE)) (objetivo ?bloque esta-encima-del ?) (pila (estado ?cima $? ?bloque $?)) => (assert (objetivo ?cima esta-encima-del suelo))) (defrule LIBERA::libera-bloque-soporte (declare (auto-focus TRUE)) ?objetivo <- (objetivo ? esta-encima-del ?bloque) (pila (estado ?cima $? ?bloque $?)) => (assert (objetivo ?cima esta-encima-del suelo))) (defmodule SUELO (import MAIN ?ALL)) (defrule SUELO::mover-bloque-al-suelo (declare (auto-focus TRUE)) ?objetivo <- (objetivo ?bloque-1 esta-encima-del suelo) ?pila <- (pila (estado ?bloque-1 $?resto)) => (retract ?objetivo ?pila) (assert (pila (estado ?bloque-1))) (assert (pila (estado $?resto))) (printout t ?bloque-1 " movido encima del suelo. " crlf))