;Soluzione di Mapelli I. e Cornaz M. ;Soluzione del labirinto, ad ogni casella nuova trovata si associa un indice univoco e la casella da cui si é arrivati. ;Vengono privilegiate le caselle nuove rispetto a quelle giá visitate. ;Quando non ci sono caselle nuove adiacenti alla posizione del robot, ripercorriamo il cammino fatto fino a quando non ;si trova una casella nuova. (defmodule MAIN (export ?ALL)) (deftemplate casella (slot posx) (slot posy) (slot tipo) (slot indice) (slot da)) (deftemplate robot (slot robotx) (slot roboty)) (deffacts labirinto (casella (posx 0)(posy 0)(tipo strada)(indice 0)(da 0)) (casella (posx 0)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 0)(posy 2)(tipo strada)(indice 0)(da 0)) (casella (posx 0)(posy 3)(tipo muro)(indice 0)(da 0)) (casella (posx 0)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 0)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 0)(posy 6)(tipo muro)(indice 0)(da 0)) (casella (posx 0)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 0)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 0)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 0)(tipo muro)(indice 0)(da 0)) (casella (posx 1)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 1)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 4)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 1)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 1)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 2)(posy 0)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 2)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 2)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 5)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 6)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 7)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 2)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 0)(tipo muro)(indice 0)(da 0)) (casella (posx 3)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 3)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 3)(posy 5)(tipo muro)(indice 0)(da 0)) (casella (posx 3)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 8)(tipo strada)(indice 0)(da 0)) (casella (posx 3)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 0)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 2)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 4)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 4)(posy 6)(tipo muro)(indice 0)(da 0)) (casella (posx 4)(posy 7)(tipo muro)(indice 0)(da 0)) (casella (posx 4)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 4)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 0)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 1)(tipo muro)(indice 0)(da 0)) (casella (posx 5)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 5)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 5)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 5)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 5)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 0)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 1)(tipo muro)(indice 0)(da 0)) (casella (posx 6)(posy 2)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 6)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 6)(posy 8)(tipo muro)(indice 0)(da 0)) (casella (posx 6)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 0)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 2)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 4)(tipo muro)(indice 0)(da 0)) (casella (posx 7)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 8)(tipo strada)(indice 0)(da 0)) (casella (posx 7)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 8)(posy 0)(tipo muro)(indice 0)(da 0)) (casella (posx 8)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 8)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 8)(posy 3)(tipo muro)(indice 0)(da 0)) (casella (posx 8)(posy 4)(tipo strada)(indice 0)(da 0)) (casella (posx 8)(posy 5)(tipo muro)(indice 0)(da 0)) (casella (posx 8)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 8)(posy 7)(tipo muro)(indice 0)(da 0)) (casella (posx 8)(posy 8)(tipo strada)(indice 0)(da 0)) (casella (posx 8)(posy 9)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 0)(tipo muro)(indice 0)(da 0)) (casella (posx 9)(posy 1)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 2)(tipo muro)(indice 0)(da 0)) (casella (posx 9)(posy 3)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 4)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 5)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 6)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 7)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 8)(tipo strada)(indice 0)(da 0)) (casella (posx 9)(posy 9)(tipo strada)(indice 0)(da 0)) (ingresso 0 7) (uscita 0 9)) ;se troviamo l'uscita terminiamo (defrule uscita_trovata (declare (salience 100)) (robot (robotx ?x)(roboty ?y)) (uscita ?x ?y) => (assert (uscita_trovata)) (halt)) ;una sorta di inizializzazione (viene assegnato indice 1 alla casella iniziale (defrule inizio (not(numero_passi ?)) (ingresso ?x ?y) ?f<-(casella (posx ?x)(posy ?y)(tipo ?)(indice ?)(da ?)) => (modify ?f (indice 1)) (assert (numero_passi 1)) (assert (robot (robotx ?x)(roboty ?y)))) ;si sposta sulla casella nuova a sinistra della posizione corrente (defrule sinistra_nuova ?f<-(robot (robotx ?rx)(roboty ?ry)) ?f1<-(numero_passi ?n) ?f2<-(casella (posx ?rx)(posy ?y)(tipo strada)(indice 0)(da ?)) (test (= ?y (- ?ry 1))) (casella (posx ?rx)(posy ?ry)(tipo ?)(indice ?i)(da ?)) => (retract ?f1) (assert (numero_passi (+ ?n 1))) (modify ?f2 (indice (+ ?n 1))(da ?i)) (modify ?f (roboty (- ?ry 1)))) ;si sposta sulla casella nuova a destra della posizione corrente (defrule destra_nuova ?f<-(robot (robotx ?rx)(roboty ?ry)) ?f1<-(numero_passi ?n) ?f2<-(casella (posx ?rx)(posy ?y)(tipo strada)(indice 0)(da ?)) (test (= ?y (+ ?ry 1))) ?f3<-(casella (posx ?rx)(posy ?ry)(tipo strada)(indice ?i)(da ?)) => (retract ?f1) (assert (ultima_mossa destra)) (assert (numero_passi (+ ?n 1))) (modify ?f2 (indice (+ ?n 1))(da ?i)) (modify ?f (roboty (+ ?ry 1)))) ;si sposta sulla casella nuova in su rispetto alla posizione corrente (defrule su_nuova ?f<-(robot (robotx ?rx)(roboty ?ry)) ?f1<-(numero_passi ?n) ?f2<-(casella (posx ?x)(posy ?ry)(tipo strada)(indice 0)(da ?)) (test (= ?x (- ?rx 1))) (casella (posx ?rx)(posy ?ry)(tipo strada)(indice ?i)(da ?)) => (retract ?f1) (assert (ultima_mossa su)) (assert (numero_passi (+ ?n 1))) (modify ?f2 (indice (+ ?n 1))(da ?i)) (modify ?f (robotx (- ?rx 1)))) ;si sposta sulla casella nuova in giu rispetto alla posizione corrente (defrule giu_nuova ?f<-(robot (robotx ?rx)(roboty ?ry)) ?f1<-(numero_passi ?n) ?f2<-(casella (posx ?x)(posy ?ry)(tipo strada)(indice 0)(da ?)) (test (= ?x (+ ?rx 1))) (casella (posx ?rx)(posy ?ry)(tipo ?)(indice ?i)(da ?)) => (retract ?f1) (assert (ultima_mossa giu)) (assert (numero_passi (+ ?n 1))) (modify ?f2 (indice (+ ?n 1))(da ?i)) (modify ?f (robotx (+ ?rx 1)))) ;nel caso in cui non troviamo nessuna cella nuova ritorniamo sui nostri passi seguendo l'attributo da (defrule ritorna (declare (salience -1)) ?f<-(robot (robotx ?rx)(roboty ?ry)) (casella (posx ?rx)(posy ?ry)(tipo strada)(indice ?)(da ?i)) (casella (posx ?x)(posy ?y)(tipo strada)(indice ?i)(da ?)) => (modify ?f (robotx ?x)(roboty ?y)))