;; ;; Regles d'affecter les locations des emplacements ;; (deftemplate emplacement (field nom (type SYMBOL) (default NIL)) (field x (type NUMBER)) (field y (type NUMBER)) (multifield voisins (default NIL)) ) (deffacts reseaux-d-emplacements (emplacement (nom A) (x 0) (y 0) (voisins B C)) (emplacement (nom B) (x 0) (y 1) (voisins A E D)) (emplacement (nom C) (x 1) (y 0) (voisins A I)) (emplacement (nom D) (x 1) (y 1) (voisins B F)) (emplacement (nom E) (x 0) (y 2) (voisins B F)) (emplacement (nom F) (x 1) (y 2) (voisins E D G)) (emplacement (nom G) (x 2) (y 2) (voisins F H)) (emplacement (nom H) (x 2) (y 1) (voisins G)) (emplacement (nom I) (x 2) (y 0) (voisins C)) ) ;; ;; Regles pour le connectivite des emplacements ;; Ces regles genere les nouvelles noueds dans l'arbre de recherche ;; (defrule Genere-voisins "genere les noeud pour les voisins de ?X" (declare (salience 20)) (noeud (nom ?p) (status active) (g ?g)) (emplacement (nom ?p) (voisins $? ?v $?)) => (assert (noeud (nom ?v) (status new) (pere ?p) (g =(+ ?g 1)))) ) ;; ;; regle pour fermer un noeud active ;; (defrule fermer-noeud "passer aux status closed apres les voisins sont cree" (declare (salience 10)) ?N <- (noeud (status active)) => (modify ?N (status closed)) ) ;; ;; affecter les locations ;; (defrule Affecter-position-emplacement "affecter le location de chaque emplacement" (declare (salience 30)) ?N <- (noeud (nom ?n) (x -1) (y -1)) (emplacement (nom ?n) (x ?x) (y ?y)) => (modify ?N (x ?x) (y ?y)) ) (defrule Affecter-position-des-buts "affecter le location de chaque emplacement" (declare (salience 10)) ?B <- (but (nom ?n) (x -1) (y -1)) (emplacement (nom ?n) (x ?x) (y ?y)) => (modify ?B (x ?x) (y ?y)) ) (defrule Affecter-Location-des-depart "affecter le location de chaque emplacement" (declare (salience 10)) ?D <- (depart (nom ?n) (x nil) (y nil)) (emplacement (nom ?n) (x ?x) (y ?y)) => (modify ?D (x ?x) (y ?y)) ) ;; ;; Regle d'initialiser le recherche ;; (defrule init "Initialise avec le depart et le but" (initial-fact) (not (depart)) => (printout t "Le nom de depart? ") (bind ?n (read)) (assert (depart (nom ?n) )) (printout t "Le nom du but? ") (bind ?n (read)) (assert (but (nom ?n))) ) ;; ;; regle d'areter la recherche ;; (defrule termine-recherche "close all open nodes" (chemin $?) ?N <- (noeud (status open)) => (modify ?N (status closed)) (halt) ) ;; ;; regle de composer le chemin ;; (defrule compose-chemin "compose un liste du chemin" ?C <- (chemin ?n $?q) (noeud (nom ?n) (pere ?p&:(neq ?p nil))) (but (nom ?b)) (test (neq ?p ?b)) => (retract ?C) (assert (chemin ?p ?n $?q)) ) ;; ;; regle d'imprimer le chemin ;; (defrule imprimer-chemin "compose un liste du chemin" (chemin ?d $?q ?b) (depart (nom ?d)) => (printout t "Le chemin de " ?d " a " ?b " passe par " $?q crlf) (halt) )