3 Étendre le moteur

Jusqu'à maintenant, nous avons procéde par chaînage avant, i.e. nous avons pris les règles une à une et testé si chaque règle étaient applicables étant donnée une base de faits.

3.1 Amélioration de la recherche des règles déjà appliquées

Pour voir si une règle est applicable, nous vérifions que la conséquence de la règle n'est pas déjà présente dans la base de faits. Une première amélioration consiste à associer un identifiant à chaque règle, et à construire un ensemble d'identifiants des règles déjà appliquées. Ainsi, à chaque application de règle, nous ajoutons l'identifiant de la règle à l'ensemble et avant d'appliquer une règle, nous vérifions que son identifiant n'est pas présent dans l'ensemble. Si l'identifiant est présent, la règle n'est pas appliquée. Vous pouvez utiliser la notion d'ensemble déjà étudiée pour modéliser l'ensemble des identifiants de règles appliquées. Une règle devra être désormais munie d'un identifiant (e.g. un entier) : si la règle est représentée par une structure, ajouter un champ id à cette structure pour qu'une règle puisse contenir un identifiant.

Expliquer en quoi cela facilite la recherche des règles déjà appliquées.

3.2 Chaînage arrière

Le chaînage avant consiste à examiner une règle et à essayer de l'appliquer en regardant si ses conditions sont vérifiées. En chaînage arrière, on regarde la conséquence et on essaie de l'inférer en regardant les conditions qui permettent de la générer. On essaie alors de vérifier les conditions de la même façon, i.e. chaque condition est considérée comme un fait à vérifier. Si elle fait partie de la base de faits, alors elle est vérifiée. Sinon, on regarde si elle se trouve comme conséquence de règles, auquel cas, on cherche à vérifier les conditions de ces nouvelles règles, etc., et ceci de manière récursive. Dans notre example, pour voir si l'on peut appliquer la règle


  (make-regle (si '(cet animal est un  carnivore)
     '(cet animal est de couleur fauve)
     '(cet animal a des taches noires))
     (alors '(cet animal est un  guepard)))

nous cherchons à voir si les faits '(cet animal est un carnivore), '(cet animal est de couleur fauve) '(cet animal a des taches noires) peuvent être inférés. Pour cela, nous regardons les règles qui permettent de les engendrer. Par exemple, nous allons maintenant chercher à savoir si la règle


  (make-regle (si '(cet animal est un mammifere)
     '(cet animal mange de la viande))
     (alors '(cet animal est un carnivore)))

(qui permet d'inférer '(cet animal est un carnivore)) peut être appliquée, etc.

Essayez d'implémenter un moteur d'inférence qui fonctionne en chaînage arrière. Attention, la version chaînage arrière est un peu plus compliquée. Pour l'implémentation en chaînage arrière, vous pouvez revenir à une description plus simple des règles (comme au TP 3 par exemple). Pour ne pas perdre ce que vous avez déjà fait jusqu'à maintenant, séparez bien les deux versions (en deux fichiers séparés par exemple).

Si vous n'arrivez pas à l'implémenter intégralement, essayez tout de même d'aller le plus loin possible, expliquez clairement où vous avez rencontré des difficultés, et suggérez des pistes pour résoudre les problèmes.