Quelques domaines d'application des systèmes à base
de connaissances
Les thèmes abordés par l'IA sont multiples. Ils concernent
aussi bien le logiciel que le matériel. Un projet complet (par
exemple le projet japonais dit de 5e génération) mêle
souvent plusieurs types de préoccupations (programmation, interfaçage,
architecture des ordinateurs, conception des circuits, etc.). Voici les
catégories principales:
Traitement du langage naturel: contrairement à ce
que l'on croyait initialement (et naïvement), la traduction automatique
demande plus que la fabrication de dictionnaires et l'utilisation de règles
de syntaxe. Traduire un texte nécessite une compréhension
du texte ou, pour le moins, une certaine représentation qui fait
intervenir le contexte, une connaissance experte de la matière
et un certain sens commun.
Une anecdote souvent citée par les chercheurs dans le domaine est
la double traduction de l'anglais en russe puis de russe en anglais de:
"The spirit is willing, but the flesh is week" qui devenait:
"The vodka is good, but the meet is rotten"
Actuellement le traitement du langage (traduction automatique, génération
automatique de textes, analyse du langage naturel, ...) introduit de multiples
outils:
Plus que de traduction automatique on parle maintenant de traduction
assistée !
Recherche dans des bases de données: il s'agit de
dépasser la recherche par motsclés pour effectuer
des recherches à partir de demandes effectuées en langage
naturel. L'ordinateur assiste l'utilisateur dans sa démarche.
Assistance: c'est l'application commerciale principale des
systèmes à base de connaissances. Il s'agit du domaine des
systèmes experts qui sont caractérisés à la
fois par une fonction (assistance qui peut remplacer celle d'un expert)
et par un certain type de systèmes informatiques. Le fonctionnement
d'un système expert est prototypique des systèmes à
base de connaissances.
Démonstration de théorèmes mathématiques:
c'est un sujet classique qui a permis de développer les principales
méthodes d'IA. Plusieurs langages de programmation utilisés
en IA sont basés sur les techniques utilisées dans ce domaine
(PROLOG, PLANNER).
Planning: ce sujet est également important dans le
développement de l'IA. Un but est proposé, et l'ordinateur
doit trouver l'ensemble des étapes qui permettent de l'atteindre.
La robotique de même que la gestion de production est largement
tributaire des recherches menées dans ce domaine.
Programmation automatique: il s'agit de la réalisation
de programmes à partir de la description des fonctions à
remplir. Sorte de "supercompilateurs", ces systèmes
s'achoppent à des problèmes ardus d'optimisation (reconnaître
que plusieurs procédures sont équivalentes). Actuellement
plusieurs systèmes d'assistance à la programmation existent
(environnements de génie logiciel). Ils sont liés souvent
à une méthodologie générale de résolution
de problème (SMXCogitor).
Résolution de problèmes: il s'agit principalement
de problèmes à base de combinatoire (parcours, jeux ,...).
Le travail consiste à modérer au maximum l'"explosion
combinatoire". C'est dans ce domaine que l'on trouve un des premiers
programme, le plus "fameux" de l'IA, le General Problem Solver
(GPS) de Newell, Simon et Shaw (1957). Le GPS résout onze types
de problèmes: problèmes d'échec, intégration
symbolique, puzzle,... Il n'est pas aussi efficace que les programmes
spécialisés mais avait été conçu pour
être "une série de leçons donnant une meilleure
vue de la nature de l'activité de résolution de problèmes
ainsi que des mécanismes à mettre en jeu en vue de leur
accomplissement".
La structure du GPS est prototypique des systèmes basés
sur des recherches combinatoires. On donne des DONNEES, un BUT et des
opérateurs. Le système applique les opérateurs aux
données afin de réduire la différence entre données
et but. ALICE (Laurière, 1978) est un système essentiel
de résolution de problèmes. Une certaine heuristique est
introduite pour tenter de réduire la combinatoire. Actuellement
une perspective des plus prometteuses est la résolution de problèmes
assistée par ordinateur.
Perception: ici, il s'agit d'identifier des objets complexes.
Ce qui ne peut se faire que par un jeu d'hypothèses et de tests.
Regarder n'est pas voir, écouter n'est pas entendre. Les systèmes
qui regardent et écoutent doivent faire des hypothèses sur
ce qui est vu ou entendu et procéder à des vérifications.
Cela suppose également un grand nombre de connaissances à
disposition du système. La technique des réseaux neuronaux
s'impose de plus en plus dans ce domaine.
- Enseignement assisté par ordinateur: des techniques d'intelligence
artificielle peuvent être introduites dans des tutoriels. Les tutoriels
intelligents sont constitués de plusieurs systèmes experts
travaillant en collaboration. En particulier:
Représentation des connaissances
Les connaissances sont des données qui contrairement au données
classiques ne sont pas seulement des informations statiques, mais indiquent
des traitements à faire effectuer à d'autres données
plus élémentaires. Les procédures de la programmation
classique constituent un type de connaissance (connaissance procédurale).
Voici d'autres modes de représenter et de stocker des connaissances:
Calcul des propositions et prédicats
On peut représenter la situation de la figure de la manière
suivante en utilisant les prédicats 'sur', 'surtable', 'libre':
| sur(C,A) surtable(A) surtable(B) libre(C) libre(B) |
![]() |
Par ailleurs, à l'aide d'opérateurs de la logique du premier
ordre, il est possible de définir de nouveaux prédicats:
'oter', 'empiler' et de donner des équivalences:
1) libre(x) <==> ¬ ( y sur(y,x)) (il n'existe pas
de y sur x)
2) sur(y,x) ^ oter(y,x) ==> libre(x) ^ ¬ sur(y,x)
3) libre(x) ^ libre(y) ^ empiler(x,y) ==> sur(x,y)
Il est possible de donner un but à atteindre (par un robot) de
la même façon, par exemple: sur(A,B). A partir de cette information
et de la règle 3 le système déduit libre(A), libre(B)
et empiler(C,A). La règle 2 conduit à l'action oter(C,A).
Réseaux sémantiques
Il s'agit de réseaux dont les noeuds représentent les
concepts et les arcs représentent les relations. Le but des réseaux
sémantiques est de fournir une représentation souple des
connaissances. Un exemple d'un tel langage de description est par exemple
FRL qui exploite la notion de "frame" élaborée
par Marvin Minski (Roberts, R.B, Goldstein, I.P. (1977) The FRL Primer.
MIT: Memo 408).

On utilise de façon fondamentale les propriétés des
relations: par exemple:
la transitivité (est-un est une relation transitive),
héritage via d'autres relations (le Boeing 747 a des ailes),
relations réciproques (le Boeing 747 est un avion passager).
Dépendance conceptuelle
La dépendance conceptuelle est une technique qui permet d'analyser
le sens d'une phrase en recherchant tous les éléments qu'elle
est sensée représenter. Plus spécialement, elle essaie
de concrétiser tout ce qui est sousentendu. Cette technique
a été introduite par R. Schank et son équipe [SCHANK].
Leur démarche est celleci: au lieu de s'attacher sur le sens
précis de chacun des mots de la langue, ils considèrent
le sens d'une phrase dans sa globalité et, c'est ce sens qu'ils
essaient de représenter. Leur théorie vient de la constatation
que dans une phrase anglaise, beaucoup d'éléments étant
sousentendus, ceuxci doivent être connus et devinés
par celui qui veut interpréter le sens de la phrase. Dans leur
représentation du sens, ils cherchent à combler les lacunes
laissées par ces éléments sousentendus. Ils
considèrent une phrase comme un événement ayant un
acteur, un objet, une action réalisée par l'acteur sur l'objet
et une direction vers laquelle cette action est orientée. La représentation
de la structure d'un événement est invariable.
Chaque événement a:
un ACTEUR
une ACTION réalisée par cet acteur
un OBJET sur lequel est réalisée l'action
une DIRECTION vers laquelle cette action est orientée
Un acteur est un objet concret qui peut "décider" d'agir
sur un autre objet concret.
Langage à objets
L'origine de langage objet peut être trouvée dans les
réseaux sémantiques. En fixant une relation hiérarchique
de base (est-un) et une relation d'appartenance (appartient-à),
on a la structure d'un langage objet. Les autres relations se cachent
dans les attributs des entités. Les entités hiérarchisées
sont les classes (avec au sommet une classe racine souvent appelée
OBJET). Les autres entités, les objets proprement dits, appartiennent
aux différentes classes.

L'idée de langage à objets connaît différents types d'implémentations ayant chacune ses caractéristiques avec quelques dénominateurs communs. Les premiers objets ont été définis comme une structure de données en LISP (les flavors). SMALLTALK est un des premiers langages qui a mis systématiquement en oeuvre cette méthode et constitue le modèle prototypique et le plus complet des langages à objets. Des langages classiques ont ajouté cette possibilité à leur noyau habituel (Turbo PASCAL dès la version 5, c++). Une version objet de COBOL est même annoncée (Grehan, R. (1994) Object-Oriented COBOL. BYTE, vol 19 no 9, septembre 1994). Cette notion permet aussi d'organiser des systèmes de présentation multimédia (HYPERCARD, TOOLBOOK). MODULA, OBERON et surtout ADA, par leur modularité, possèdent également de nombreuses caractéristiques des langages à objets.
L'exemple suivant, permettra de définir quelques concepts:
classe rectangle:
Variables:
Méthodes:
La classe des rectangles, sous-classe de la classe racine, est définie
par 3 variables d'instance (champs) et trois méthodes. Les méthodes
sont des procédures liées à la classe, identifiée
par un sélecteur (ici aire, display, init). Pour utiliser ces procédures,
il s'agira d'envoyer des messages aux objets de la classe. En principe,
aucun accès direct aux données d'un objet n'est possible
(encapsulation). La classe des points est donnée par:
classe point:
Variables:
Méthode:
(rectangle new rec-1) ; définit l'objet rec-1, instance de la
classe des rectangles
(rec-1 init 25 10 pointA) ; initialise les valeurs de rec-1 (coin pointA
supposé défini,
; dimension 25x10)
(rec-1 aire) -> 250 ; ce message permet d'obtenir la valeur de l'aire
de rec-1
On notera que la méthode init est différente selon l'objet
auquel elle s'applique (polymorphisme).
On peut considérer une sous-classe de la classe des rectangles:
classe rectangle-remplis: (un rectangle)
Variable:
(couleur (possibilités: jaune bleu rouge))
Méthode:
(display (super display)(fill couleur))
(init (a b c)(super init a b)(setq couleur c))
Cette nouvelle classe possède les propriétés et les
méthodes de la classe des rectangles. Par ailleurs, les méthodes
display et init sont redéfinies en utilisant la partie existante
dans la classe au-dessus (réutilisation du code). super est l'objet
lui-même considéré comme membre de la classe mère.
Il se référence par self comme élément de
sa propre classe.
En résumé, un objet est déterminé par différent
attributs déterminés dans sa classe. Chaque attribut peutêtre
typé (ici) ou non.
Par la possibilité de définir des classes d'objets emboîtées,
on utilise de façon fondamentale les mécanismes d'héritage.
Dans les exemples ci-dessus l'emboîtement est défini à
l'aide de "un/une".
Dans les langages "objet", les procédures qui spécifient
le comportement des classes reçoivent le nom de "méthodes".
Les objets communiquent par l'envoi de messages qui invoquent les méthodes
à mettre en oeuvre. Avec différentes nuances, la syntaxe
de cet envoi de message est: objet message paramètres.
Les langages de l'intelligence artificielle
Les langages utilisés en Intelligence artificielle présentent
diverses caractéristiques communes:
ils constituent un environnement interactif,
ils privilégient le sens à la structure,
ils sont extensibles,
ils possèdent une structure de données très
dynamique: les listes.
Les principaux langages généraux sont Lisp (avec ses divers
dérivés: Logo, muSIMP), Prolog et Smalltalk (langage
objet). Le premier est applicatif, Prolog est un langage déclaratif.
Quant à Smalltalk c'est un langage par objets. Il existe de nombreux
langages dédiés à des applications particulières.
Le langage LISP
Le langage LISP a été conçu par John McCarthy
entre les années 1956 et 1958. Une première implantation
du langage (version 1.5) a été réalisée au
MIT sur un ordinateur IBM 704 entre 1958 et 1962. Il existe plusieurs
versions de LISP. Une référence est Common Lisp [STEELE]
qui est compatible avec de nombreuses implantations et dont d'autres tentent
de s'approcher: Le_Lisp [CHAILLOUX]. Une version intéressante,
du domaine public, XLISP. Une version orientée pour l'enseignement
est SCHEME.
Les objets du langage sont principalement les atomes: qwerty, a2; les
nombres: 123.8; les listes: (3 et 4 donnent 7). Toutes les manipulations
de données s'effectuent à l'aide de fonctions. Quelques
exemples:
(plus 3 4) > 7
(car '(3 et 4 donnent 7)) > 3
(cdr '(3 et 4 donnent 7)) > (et 4 donnent 7)
Les opérateurs peuvent s'enchaîner: (car (cdr '(3 et 4 donnent
7))) > et
Le Lisp est caractérisé par l'équation Données
= Programmes. En effet les programmes sont des listes. Il existe une fonction
(eval) qui permet d'évaluer une liste en tant que programme. En
Lisp, programmer consiste à définir de nouveaux opérateurs.
Exemple, la fonction fibo
La suite de fibonacci 1, 1, 2, 3, 5, 8, 13, 21, ... est donnée
par: fibo(0) = 1, fibo(1)=1 et la relation: fibo(n)= fibo(n-1) + fibo(n-2).
Sa définition en Lisp est:
(defun fibo (n)
(cond ((< n 2) 1)
(t (+ (fibo (- n 1))
(fibo (- n 2))))
)
)
Les systèmes Lisp comptent de quelques dizaines d'opérateurs
primitifs à plus de mille.
Le langage Prolog
Les objets primitifs sont du même type qu'en Lisp, les atomes,
les nombres et les listes ([3,et,4,donnent,7]).
Programmer c'est "déclarer" des assertions ou des faits,
définir des règles et poser des questions.
précieux(or).
précieux(diamant).
substance(or,métal).
substance(diamant,minéral).
sont des faits bâtis sur les prédicats: précieux,
substance, etc. Ils se lisent: l'or est précieux, l'or est un métal,
etc. Ces prédicats correspondent aux tables des systèmes
relationnels.
Il est possible d'effectuer des requêtes, par exemple:
? précieux(or) > yes (la requête pour
savoir si l'or est précieux a abouti)
?- précieux(argent) --> no (elle a échoué)
?- précieux(X) --> X=or, X=diamant (la requête abouti
et lie X aux valeurs possibles)
Les requêtes peuvent s'enchaîner:
?précieux(X),substance(X,Y) (de quelle substance (Y) sont
les choses précieuses (X))
Il est possible de donner des règles, par exemple:
même_substance(X,Y) :- substance(X,Z),substance(Y,Z)
qui se lit même_substance(X,Y) si substance(X,Z) et substance(Y,Z)
et qui signifie: X et Y sont liés par même_substance si ils
ont même substance (Z).
Fibo en Prolog
fibo(N,1):,N<2,!.
fibo(N,R):
N1 is N1,N2 is N2,
fibo(N1,R1),fibo(N2,R2),
R is R1+R2.
Il met en évidence la "coupure": "!" et l'opérateur
d'évaluation: "is".
LOGO et muSIMP
Ils sont semblables à Lisp. Une liste en mu-SIMP s'écrit:
(4.(et.(3.(font.7)))) (c'est la forme archaïque des paires de Lisp).
En Logo on a: [4 et 3 font 7]
Le programme FIBO en mu-SIMP
FUNCTION FIBO(N)
WHEN N<2, 1 EXIT,
FIBO(N1)+FIBO(N2),
ENDFUN;
Le programme FIBO en LOGO
POUR FIBO :N
SI N<2 SORS 1
SORS SOMME FIBO :N1 FIBO :N2
FIN
Le langage SMALLTALK
C'est le prototype des langages à objets. SMALLTALK est un
environnement livré avec plusieurs centaines de classes prédéfinies
et des outils (browser) qui permettent de l'enrichir, donc de développer
des applications. Pour définir la fonction de Fibonacci en SMALLTALK,
il faut sélectionner la classe Integer et ajouter une méthode
du type:
fibonacci
^self < 2
ifTrue: [1]
ifFalse: [(self-1) fibonacci (self-2) fibonacci]
Le calcul du dixième nombre de fibonacci se fera en invoquant sur
un nombre la méthode de sélecteur fibonacci: 10 fibonacci.
La méthode renvoie (^) le résultat de l'envoi du message
fibonacci au nombre 10.
Acquisition de la connaissance
La réalisation d'un système à base de connaissances
ne diffère pas fondamentalement de celle d'un système informatique
classique. L'analyse fait toutefois appel au travail d'un nouveau type
de professionnel de l'informatique, le "cogniticien" (de cognoscere,
connaître). La présentation des méthodes dépasse
le cadre de cette introduction. Le lecteur intéressé pourra
se référer à [GALLOUIN].
A partir des connaissances d'un ou de plusieurs experts, par un processus
d'élicitation, on obtient des informations encore non formalisées.
Par modélisation, on élabore une connaissance formelle qui
sera codée. On distingue différents types de connaissances:
- Connaissance d'environnement de tâche: comment la connaissance
est liée à l'environnement (senseur, ...).
- Connaissance de compétence: c'est ce qui est connu, les théories
et les trucs pratiques concernant le domaine.
- Connaissance de performance: il s'agit de la manière dont la
connaissance est appliquée.
Méthodes d'élicitation des connaissances
Plusieurs méthodes existent pour analyser le travail de l'expert:
- Analyse de tâches familières par observation de cas réels.
Cela permet d'avoir des informations sur l'environnement de tâche.
- Résolution de cas hypothétiques. Cette phase apporte en
plus des informations sur la connaissance de compétence.
- Finalement, l'étude de cas difficiles complète le tout
en apportant des informations sur le troisième type de connaissance.
Ces diverses analyses sont réalisées à partir d'interview,
de la réalisation de tâches spéciales, d'apport d'informations
diverses, de la description des processus obligés, de brainstorming,
d'analyse de prise de décisions et du choix effectué à
partir de la comparaison de diverses méthodes.
Plus précisément l'analyse des buts permet d'avoir des informations
de contexte. La classification des problèmes rencontrés
mène à une identification de la connaissance. Le choix des
termes primitifs et des relations, la classification d'heuristiques permet
de choisir les concepts (l'architecture) et fournit une première
description informelle. La définition de l'espace de recherche
et des méthodes fournit une formalisation qui permet l'implémentation,
les tests et la réalisation du système.
A noter encore que l'on distingue parfois
- la connaissance descriptive que constituent descriptions verbales, des
conceptions d'apprentissage, des explications d'organisation;
- la connaissance historique: rapport d'expériences passées,
diagnostic exploratoire, script, séquence;
- la connaissance métaphorique constituée des alternatives,
des images associées, des traits caractéristiques;
- la connaissance empirique qui est constituée des "coups
de main". C'est une connaissance implicite. Elle se formalise souvent
par des règles de production "si condition alors action";
- la connaissance théorique qui est déjà formalisée
dans les manuels ou des articles scientifiques.
Principales techniques
Techniques de recherches
Pour fixer les idées nous prenons l'exemple (simple !) du Taquin
qu'il s'agit de remettre en ordre:
1 4 5
3 2 x
6 8 7
La structure de l'objet est simple, c'est un tableau à 9 éléments.
L'espace de recherche est constitué de tous les états possibles
du taquin (cet espace contient 9! éléments). Ensuite on
définit le ou les opérateurs qui permettent d'agir sur chaque
état. Pour le taquin il y a quatre opérateurs (déplacer
la case vide en haut, en bas, à gauche ou à droite). Chaque
opérateur est accompagné de ses conditions d'application
(l'opérateur "à droite" ne peut pas être
appliqué lorsque la case vide est à droite du taquin). Ensuite,
il suffit d'appliquer systématiquement les opérateurs en
chaîne pour arriver au but fixé. Le nombre de possibilités
est tellement énorme (c'est un phénomène connu sous
le nom "d'explosion combinatoire") que de nombreuses méthodes
ont été imaginées pour réduire le nombre de
cas à envisager. Chacune de ces méthodes a des avantages
en temps de recherche et en ressource mémoire. Mais chacune a aussi
ses inconvénients. En particulier, toutes ne conduisent pas forcément
à la solution ou à la meilleure solution.
La méthode la plus simple est connue sous le nom de "hill
climbing". Elle demande d'introduire une "fonction d'évaluation"
qui donne une appréciation sur l'état obtenu. Dans le cas
du taquin on peut définir cette fonction par: nombre de pièces
bien placées. La méthode du "hill climbing" propose
de ne considérer que les opérateurs qui améliorent
la situation du point de vue de cette fonction. Vous pouvez vous rendre
compte que cette méthode ne donne pas toujours la solution avec
le taquin, puisqu'il faut parfois commencer par bouger des chiffres bien
placés avant de pouvoir les remettre à leur place. Différentes
méthodes sont expliquées dans [WINSTON].
Technique du Backtrack
C'est une stratégie de recherche utilisée pour générer
des états possibles. Elle correspond à une stratégie
"depthfirst" (voir plus loin). C'est une stratégie
économe en temps et en mémoire dans la mesure où
les chemins explorés ne sont pas mémorisés. Elle
s'avère efficace lorsque quelques centaines de cas sont à
envisager.
Structure générale: on possède un état (ETAT)
et un ensemble d'opérateurs ou de règles de transformations.
L'algorithme qui construit une liste d'opérateurs (CHEMIN) menant
à un but (BUT) fixé est le suivant:
Procédure BACKTRACK (ETAT)
1. Si ETAT = BUT on retourne une liste vide ()
2. Si ETAT ne peut pas mener à la solution BACKTRACK échoue
3. On recherche les règles applicables et on en constitue une liste:
REGLES
4. Début de boucle: si REGLES est vide BACKTRACK échoue
5. R < première des REGLES; REGLES <
reste des REGLES
6. ETAT1 < R(ETAT)
7. BACKTRACK(ETAT1)
8. En cas d'échec retour à 4,
sinon on appelle CHEMIN la liste d'opérateur retournée par
BACKTRACK(ETAT1), on place R comme premier élément de CHEMIN
et on retourne cette nouvelle liste.
Exemple d'application: coloriage d'une carte avec 4 couleurs. Pour qu'une
carte soit acceptable, deux régions adjacentes ne doivent pas avoir
la même couleur. Nous allons illustrer l'algorithme en considérant
l'exemple suivant:

ETAT INITIAL = (1) (la première région a la couleur 1).
BUT une liste constituée de 5 valeurs (couleur des régions
1, 2, 3, 4, 5, 6) satisfaisant la contrainte des régions adjacentes.
Il y a 4 règles: R1 mettre la couleur 1 à la région
suivante, R2 mettre la couleur 2 à la région suivante, R3
mettre la couleur 3 à la région suivante et R4 mettre la
couleur 4 à la région suivante.
BACKTRACK est appliqué à l'état initial (les numéros
se réfèrent aux différentes étapes de la procédure):
3. Les règles R2, R3, R4 sont sélectionnées
5,6. On attribue la couleur 2 à la région 2: ETAT1 = (1,2)
7. La solution est BACKTRACK de (1,2) précédé de
R2
3. Les règles R3, R4 sont sélectionnées
5,6. On attribue la couleur 3 à la région 3: ETAT1 = (1,2,3)
7. La solution est BACKTRACK de (1,2,3) précédé de
R3
3. La règle R4 est sélectionnée
5,6. On attribue la couleur 4 à la région 4: ETAT1 = (1,2,3,4)
7. La solution est BACKTRACK de (1,2,3,4) précédé
de R4
3. Les règles R1,R2,R3 sont sélectionnées
5,6. On attribue la couleur 1 à la région 5: ETAT1 = (1,2,3,4,1)
7. La solution est BACKTRACK de (1,2,3,4,1) précédé
de R1
3. Aucune règle n'est applicable
5,6. On attribue la couleur 2 à la région 5: ETAT1 = (1,2,3,4,2)
7. La solution est BACKTRACK de (1,2,3,4,2) précédé
de R2
3. La règle R1 est sélectionnée
5,6. On attribue la couleur 1 à la région 6: ETAT1 = (1,2,3,4,2,1)
7. La solution est BACKTRACK de (1,2,3,4,2,1) précédé
de R1
1. Le but est atteint.
7*. La solution est R1
7*. La solution est (R2, R1)
7*. La solution est (R4, R2, R1)
7* La solution est (R3, R4, R2, R1)
7* La solution à partir de (1) est (R2, R3, R4, R2, R1)

Utilisation d'arbres de recherche
Les arbres de recherche sont utilisés pour pouvoir garder en
mémoire les différentes étapes d'une recherche.
Un arbre peutêtre construit en créant des noms pour
chaque noeud (NOEUD1, NOEUD2, ...) et en mémorisant pour chacun
les informations nécessaires (état, évaluation, nom
du noeud père, ...).
On peut aussi directement utiliser la structure de liste. Ainsi l'arbre

L'arbre peut être parcouru de deux façons différentes:
en profondeur d'abord (depth first) ou en largeur d'abord (breadth-first)

Voici l'algorithme d'une recherche en "largeur d'abord":
1) Former une liste dont le seul élément est l'état
initial
2) Faire jusqu'à ce que la liste soit vide ou que le but soit atteint:
2a) Si le premier élément de la liste est le but ne rien
faire
2b) Sinon ôter le premier élément de la liste et ajouter
ses "descendants" à la fin de la liste.
3) Succès ou échec
Diverses variantes existent:
1) A chaque étape la liste est triée selon un critère
fournit par une fonction d'évaluation,
2) Suppression des états semblables,
D'autres fois ce sont les chemins parcourus qui sont mémorisés.
Exercice: Dessiner l'arbre de recherche concernant le problème
du taquin. Noter pour chaque noeud la fonction d'évaluation donnée
par: E(état) = profondeur + nombre de pièces mal placées.
Filtrage (pattern matching)
La technique de filtrage est destinée à comparer deux
objets entre eux ou un objet à un modèle. Par exemple, la
fonction donnée (filtre) regarde si un objet (son deuxième
argument) est conforme au modèle (son premier argument). La fonction
filtre est un prédicat, la valeur rendue est VRAI ou FAUX.
Par exemple, en Lisp:
(defun filtre (pattern fait)
(cond ((null pattern) (not fait) )
((equal (car pattern)(car fait))
(filtre (cdr pattern)(cdr fait)) )
((atom (car pattern)) nil)
((and (equal (caar pattern) '?)
(filtre (cdr pattern)(cdr fait)))
(set (cadar pattern)(car fait)) ) ) )
(filtre '(1 2 3)'(1 2 3)) -> t
(filtre '(1 2 3)'(3 2 1)) -> nil
Le modèle peut contenir des caractères "joker"
: (filtre '(1 2 (? X)) '(1 2 3)) -> t. Dans ce dernier cas, X sera
lié à 3. C'est un effet de bord connu sous le nom de capture.
Exercice:
1) Complétez filtre en introduisant un joker sans capture:
(filtre '(1 2 3) '(1 2 ?)) -> t
2) Complétez filtre pour qu'elle admette les prédicats:
(filtre '(numberp a 3) '(1 a 3))-> t
3) Imaginez l'utilisation de la fonction filtre pour simuler un dialogue
avec l'ordinateur. Par exemple: reconnaître un prénom dans
une phrase.
4) Esquissez un programme de la fonction inverse utilisant la fonction
filtre: (inverse '(1 2 3)) -> (3 2 1)
5) Réalisez un programme qui met des propositions courantes sous
forme canonique: tout homme est mortel --> si x homme alors x mortel
aucun animal ne sait le français --> si x animal alors x ne
sait pas le français
Jean est un garçon --> Jean garçon