;; ;; Regles d'affecter les locations des emplacements ;; (deftemplate emplacement (slot nom (type SYMBOL) (default NIL)) (slot x (type NUMBER)) (slot y (type NUMBER)) (multislot voisins (default NIL)) ) (deffacts reseaux-d-emplacements (emplacement (nom A1) (x 0) (y 1) (voisins A2 B1 B2)) (emplacement (nom A2) (x 0) (y 2) (voisins A1 A3 B1 B2 B3)) (emplacement (nom A3) (x 0) (y 3) (voisins A2 A4 B2 B3 B4)) (emplacement (nom A4) (x 0) (y 4) (voisins A3 A5 B3 B4 B5)) (emplacement (nom A5) (x 0) (y 5) (voisins A4 B4 B5)) (emplacement (nom B1) (x 1) (y 1) (voisins A1 A2 B2)) (emplacement (nom B2) (x 1) (y 2) (voisins A1 A2 A3 B1 B3 C1)) (emplacement (nom B3) (x 1) (y 3) (voisins A2 A3 A4 B2 B4)) (emplacement (nom B4) (x 1) (y 4) (voisins A3 A4 A5 B3 B5 C5)) (emplacement (nom B5) (x 1) (y 5) (voisins A4 A5 B4 C5)) (emplacement (nom C1) (x 2) (y 1) (voisins B1 B2 D1)) (emplacement (nom C2) (x 2) (y 2) (voisins C3 D2 D3)) (emplacement (nom C3) (x 2) (y 3) (voisins C2 C4 D2 D3 D4)) (emplacement (nom C4) (x 2) (y 4) (voisins C3 D3 D4)) (emplacement (nom C5) (x 2) (y 5) (voisins B4 B5 D5)) (emplacement (nom D1) (x 3) (y 1) (voisins C1 E1)) (emplacement (nom D2) (x 3) (y 2) (voisins C2 C3 D3 E2 E3)) (emplacement (nom D3) (x 3) (y 3) (voisins C2 C3 C4 D2 D4 E2 E3 E4)) (emplacement (nom D4) (x 3) (y 4) (voisins C3 C4 D3 E3 E4)) (emplacement (nom D5) (x 3) (y 5) (voisins C5 E5)) (emplacement (nom E1) (x 4) (y 1) (voisins D1 F1 F2)) (emplacement (nom E2) (x 4) (y 2) (voisins D2 D3 E3)) (emplacement (nom E3) (x 4) (y 3) (voisins D2 D3 D4 E2 E4)) (emplacement (nom E4) (x 4) (y 4) (voisins D3 D4 E3 F4)) (emplacement (nom E5) (x 4) (y 5) (voisins D5 F4 F5)) (emplacement (nom F1) (x 5) (y 1) (voisins E1 F2)) (emplacement (nom F2) (x 5) (y 2) (voisins F1 F3)) (emplacement (nom F3) (x 5) (y 3) (voisins F2 F4)) (emplacement (nom F4) (x 5) (y 4) (voisins E4 F3 F5)) (emplacement (nom F5) (x 5) (y 5) (voisins E5 F4)) ) ;; ;; 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) )