; Hanoi (deftemplate muta (slot idx) (slot sursa) (slot dest) ) (deftemplate hanoi (slot idx) (slot nr) (slot sursa) (slot dest) (slot rez) ) (deffacts turnuri (turn A 1 2 3 4 5) (turn B) (turn C) (stiva gen1) (hanoi (idx gen1) (nr 5) (sursa A) (dest B) (rez C)) ) (defrule muta ?s <- (stiva ?top $?rest) ?m <- (muta (idx ?top) (sursa ?x) (dest ?y)) ?idx1 <- (turn ?x ?t1 $?alte1) ?idx2 <- (turn ?y $?alte2) => (retract ?s ?m ?idx1 ?idx2) (assert (turn ?x $?alte1) (turn ?y ?t1 $?alte2) (stiva $?rest)) (printout t "muta " ?t1 " de pe " ?x " pe " ?y crlf) ) (defrule hanoi-1 ?s <- (stiva ?top $?rest) ?m <- (hanoi (idx ?top) (nr ?n&:(> ?n 1)) (sursa ?x) (dest ?y) (rez ?z)) => (retract ?s ?m) (bind ?gen1 (gensym)) (bind ?gen2 (gensym)) (bind ?gen3 (gensym)) (assert (hanoi (idx ?gen1) (nr (- ?n 1)) (sursa ?x) (dest ?z) (rez ?y)) (muta (idx ?gen2) (sursa ?x) (dest ?y)) (hanoi (idx ?gen3) (nr (- ?n 1)) (sursa ?z) (dest ?y) (rez ?x)) (stiva ?gen1 ?gen2 ?gen3 $?rest)) ) (defrule hanoi-2 ?s <- (stiva ?top $?rest) ?m <- (hanoi (idx ?top) (nr 1) (sursa ?x) (dest ?y)) => (retract ?s ?m) (bind ?gen (gensym)) (assert (muta (idx ?gen) (sursa ?x) (dest ?y)) (stiva ?gen $?rest)) )