Projet individuel d`algorithmique-programmation IAP1

Transcription

Projet individuel d`algorithmique-programmation IAP1
Projet individuel d’algorithmique-programmation IAP1 :
groupe 3.1
octobre 2009
1
Informations générales
1.1
Travail à rendre
Le projet est à réaliser en OCaml individuellement. Il sera accompagné d’un dossier contenant
impérativement la description des choix faits, la description des types et des fonctions. Pour chaque
fonction, on donnera impérativement l’interface complète (dans le code en commentaire et dans le
rapport pour les fonctions présentées).
Même si le sujet est décomposé en questions, en général chaque question se résoud par l’écriture
d’une ou plusieurs fonctions intermédiaires. Celles-ci doivent comporter une interface également.
Le dossier fournira également des cas de tests accompagnés des résultats attendus et retournés.
Sur le site du cours figure un petit document sur ce que l’on attend dans un rapport. Consultez
le !
1.2
Calendrier et procédure de remise
Le projet (dossier + copie du listing de code) est à rendre au secrétariat le 5 novembre à 16h au
plus tard. Le numéro du groupe, ainsi que le nom du chargé de TD, devront figurer en gros, et en
rouge sur la page de garde.
Le fichier .ml contenant votre code devra être déposé electroniquement au plus tard le 5 novembre à minuit.
Les soutenances seront organisées dès la semaine suivante. Il vous faudra consulter les panneaux
d’affichage et votre courrier electronique pour obtenir l’ordre de passage.
Enfin n’attendez pas pour vous mettre au travail ! Un projet se travaille dès la remise du sujet
afin d’avoir le temps de laisser murir la solution et de poser des questions au client (dans votre cas,
votre chargé de TP).
1.3
Procédure de dépot
Pour déposer le code du projet, consultez les informations sur les machines de l’école, tout figure.
Ne vous inquiétez pas l’interface fabrique un nom de projet déposé à partir de votre login. Votre
projet ne sera pas confondu avec celui d’un autre.
Indiquez quand même en commentaire dans votre fichier toto.ml votre nom et votre groupe. Ce
sera plus facile à lire pour le correcteur.
Vous pouvez déposer successivement plusieurs versions, le dernier dépot écrase l e précédent, seul
le dernier dépot est pris en compte
Enfin tout cela peut se faire de l’extérieur. Il suffit de vous connecter avant de commencer au
point 1 sur une machine visible de l’exterieur (par ssh).
Le code à déposer est un fichier.ml commenté avec les interfaces des fonctions. Le fichier
doit pouvoir être compilé (sans aucune intervention humaine - lecture du buffer complet)
1
sur les machines Yaca de l’école, n’oubliez pas de vérifier que tout fonctionne sur les machines
de l’école avant de le dép oser - si vous l’avez développé sous un autre système d’exploitation oar
exemple . A priori ce devrait être portable.
2
Énoncé du projet : Systèmes experts
Le but du projet est d’expérimenter la programmation logique en construisant des moteurs d’inférence.
On peut représenter des connaissances dans un domaine par des règles de la forme: les propriétés
P1 et . . . et Pn permettent d’inférer (de déduire) la propriété P , ce que plus mathématiquement l’on
écrira P1 ∧ . . . ∧ Pn ⇒ P . P est appelée la conclusion de la règle.
On désire écrire un programme permettant de démontrer un but à partir d’un ensemble fini de
règles et d’un ensemble de faits (des règles sans hypothèse). Un tel programme s’appelle un moteur
d’inférence ou plus pompeusement un système expert, il est d’ordre 0 si les formules ne contiennent
pas de variable, (ce qui sera le cas sauf dans la toute dernière partie) d’ordre 1 sinon.
On peut travailler avec une stratégie dite de chaı̂nage avant ou de chaı̂nage arrière. Nous les
expérimentons tour à tour.
2.1
Partie 1 : Chaı̂nage avant
La stratégie du chaı̂nage avant part de faits initiaux pour démontrer d’autres faits.
Principe de l’algorithme On dispose de deux listes appelées respectivement respectivement base
de faits et base de règles. La base de faits rassemble les variables propositionnelles, encore appelées
faits ou propriétés. La base des règles contient les formules de la forme P1 ∧ P2 . . . ∧ Pn ⇒ P .
Ensuite on choisit un élément de la base des règles (le premier par exemple) on regarde toutes
les conséquences que l’on peut en déduire d’après la base des faits, on ajoute ces déductions sans
redondance dans la base de faits. On recommence ensuite avec les autres règles.
On répète le processus jusqu’à ce qu’on ne puisse plus rien déduire de nouveau.
Le résultat est obtenu en regardant si la conclusion recherchée est contenue dans la base des faits.
Exemples
• En partant des règles P1 ∧ P3 ⇒ P2 et P3 =⇒ P1 et du seul fait P3 , on peut montrer que P2
est conséquence des hypothèses. En effet, la 1ère étape ajoutera le fait P1 (à cause de la règle
P3 ⇒ P1 et du fait P3 ). La 2ème étape ajoutera le fait P2 (à cause de la règle P1 ∧ P3 ⇒ P2 et
des faits P1 et P3 ).
• Avec la base de règles botanique (cf ci-dessous), en partant des faits RHIZOME, FLEUR,
GRAINE et 1-COTYLEDONE, on peut montrer que c’est du MUGUET par un chainage avant
parce que FLEUR et GRAINE permettent de déduire PHANEROGAME, PHANEROGAME et
1.COTYLEDONE permettent d’obtenir MONOCOTYLEDONE. nfin MONOCOTYLEDONE
et RHIZOME donnent MUGUET.
Vous représenterez les faits par des chaı̂nes de caractères. Les règles sont numérotées. La règle
numéro i P1 ∧ . . . ∧ Pn ⇒ P sera représentée par le triplet (i, P, [P1 ; P2 . . . Pn ]).
Travail demandé :
1. Déduction - Écrire une fonction qui permet étant donné un but, une base de faits et une
base de règles de dertiner si ce but est conséquence directe ou indirecte (plusieurs étapes de
raisonnement sont nécessaires) des faits et des règles.
Suggestion de décomposition : Commencer par écrire une fonction étape qui prend en argument une base de règles rgs et une base de fait fts et qui calcule la liste des faits que l’on
peut déduire en appliquant une fois les règles de rgs sur les faits de fts. Cette liste sera
sans redondance (pas de doublons). Puis écrire une fonction qui itère jusqu’à l’obtention du
but recherché ou jusqu’à convergence (on ne déduit plus rien de nouveau).
2
Dans un premier temps vous ne considérerez que des règles sans négation. Puis vous introduirez
la possibilité d’avoir des négations. Un fait sera alors représenté par une valeur du type prop
défini par : type prop = Var of string | Non of string. Ainsi le fait ’carnivore’ sera
représenté par Var "carnivore" et ’n’est pas carnivore’ sera représenté par Non "carnivore".
Dans le cas où les négations sont possibles, si la base de faits devient inconsistante (un fait et
son contraire), on peut annoncer que le but recherché n’est pas vrai.
2. Affichage de la base de règles - On ne demande pas d’écrire un analyseur syntaxique, les
entrées se feront avec la représentation imposée dans l’énoncé (on appelle celà une syntaxe
abstraite). En revanche, il vous est demandé de d’écrire des fonctions d’affichage. Chaque règle
devra s’afficher avec le format utilisé dans la sous-section 2.4 soit SI ... ET .... ALORS .... Pour
un fait négatif, on écrira NON ... par exemple NON carnivore.
Pour afficher une chaı̂ne de caractères on utilise la fonction print string. Voir informations
complémentaires sur le site du cours ultérieurement (on sort du cœur purement fonctionnel du
langage).
3. Preuve - Nous revenons à la déduction d’un but à partir de faits et de règles, cependant
nous désirons également retourner la liste des numéros de règles qui ont conduit au résultat.
On appelle cette liste une preuve du but. Reprendre la fonction de la question 1 de manière
à ce quelle retourne la liste des règles utilisées si le but est vrai et échoue sinon. Il se peut
que certaines règles soient utilisées pour déduire des faits qui n’entrent pas directement dans
l’obtention du résultat. Elles seront comptabilisées quand même.
Écrire une fonction qui affiche la preuve dans un format lisible. Pour l’exemple botanique
précédent, on attend un texte de la forme suivante :
FLEUR et GRAINE donnent phanérogame par la règle 1
phanérogame et 1-COTYLEDONE donnent monocotylédone par la règle 3
monocotylédone et RHIZOME donnent MUGUET (CQFD) par la règle 7
Mettre en majuscules les faits initiaux et le but recherché (indiqué àar CQFD).
Il se peut que certaines règles soient utilisées pour déduire des faits qui n’entrent pas directement
dans l’obtention du résultat. Elles seront affichées quand même.
2.2
Partie 2 : Chaı̂nage arrière
Cette partie ne pourra être abordée que si les deux premières parties fonctionnent correctement.
On travaillera par chaı̂nage arrière, c’est-à-dire que pour démontrer un but B on utilisera l’algorithme
suivant:
• si B est un des faits alors le but est prouvé
• sinon on sélectionne une règle dont B est la conclusion et on est ramené à prouver les hypothèses
de cette règle (une liste de buts). Si on ne peut trouver une telle règle le but n’est pas déductible.
Si plusieurs règles sont applicables, il faut une stratégie de choix (le plus simple est de prendre
la première !). Si ayant choisi une règle il y a échec, on reviendra en arrière et on choisira une
autre règle (c’est le backtracking).
La recherche peut boucler, par exemple si vous avez des règles Pi ⇒ Pj et Pj ⇒ Pi . Modifier les
fonctions précédentes de manière à les équiper d’un dispositif anti-bouclage (l’idée est de vérifier à
chaque fois que l’on a un nouveau but (issu de l’application d’une règle) qu’il n’est pas déjà dans la
liste des but en cours).
Travail demandé : Fournir une fonction qui teste si un but est conséquence d’une base de règles
et de faits initiaux. De même que précédemment vous fournirez une fonction qui affiche une preuve.
Ici seules les règles menant au résultat recherché seront affihées (celles qui ont conduit à un échec et
provoqué un backtraking n’apparaı̂tront pas). Le format d’affichage reste identique.
3
2.3
Partie 3 : Systèmes avec variables
Cette partie ne pourra être abordée que si les deux premières parties fonctionnent correctement.
Afin d’augmenter l’expressivité des règles et des faits et de mettre en commun des informations,
les faits et les règles utilisent maintenant des relations à plusieurs arguments. Par exemples, si on
dispose de la relation pere à deux arguments, pere(Jean, Alain) modélise le fait que Jean est le père
d’Alain. Jean et Alain sont des constantes. Par convention une constante a u nom qui commence
par une majuscule. petit(Jean) est un fait qui qui modélise le fait que Jean est petit. Il utilise la
relation unaire (à un seul argument) petit.
Les règles utilisent ces relations et des variables. Par exemple la règle pere(x, y) ∧ pere(x, z) ⇒
f rere(y, z) utilisent deux relations pere et f rere. Elle modélise la connaissance suivante :si x est le
père de y et de z alors y et z sont frères. x, y etz sont des variables et remplacent n’importe quelle
constante. Par convention les noms de variable commencent par une minuscule.
La règle (discutable car elle oublie les gênes de la mère) pere(x, y) ∧ petit(x) ⇒ petit(y) se lit si x est
le père de y et si x est petit alors y est petit.
Ainsi des faits pere(Jean, Alain), petit(Jean) avec la deuxième règleon déduit le fait petit(Alain).
Si on ajoute le nouveau fait pere(Jean, P aul), le système ajoute les nouveaux faits déduits : f rere(P aul, Alain),
f rere(Alain, P aul), et petit(P aul) et aussi ce qui est moins intéressant f rere(Alain, Alain), f rere(P aul, P aul).
Dans la suite les variables et constantes seront représentées par des valeurs du type element défini
par type element = Var1 of string | Const1 of string.
Les termes composés d’une relation et de ses arguments seront représentés par un couple (nom
de la relation, liste des arguments (de type element)]). Ainsi f rere(P aul, Alain) est représenté par
(”frere”, [Const1 ‘’Paul”; Const ”Alain”]).
La façon de raisonner va être très similaire au cas sans variable mais on doit d’abord surmonter
une nouvelle difficulté : savoir si, étant donnés deux termes, on peut les identifier en instanciant
correctement leurs variables. On dit alors qu’on les unifie (mais on ne place dans un contexte où
l’unification est simplifiée).
On dit que le fait pere(Jean, Alain) et le terme appelé motif (car il ne contient des variables)
pere(x, y) s’unifient, c’est-à-dire qu’ils sont égaux si on remplace (on dit substituer) x par Jean et y
par Alain. On dit que la liste [(”x”, ”Jean”); (”y”, ”Alain”)] est la substitution qui permet d’unifier
le fait et le motif. Mais le fait pere(Jean, Alain) et le motif f rere(x, y) ne s’unifient pas. Il est en effet
impossible de les rendre égaux peu importe ce qu’on choisit pour x et y. Le fait pere(Jean, Alain)
et le motif pere(x, x) ne s’unifient pas. car il faudrait prendre x = Jean et x = Alain, ce qui est
contradictoire.
Dans la suite on ne considère que des termes sans négation.
Travail demandé :
1. Affichage - Adapter les fonctions d’affichage des règles.
2. Unification - Écrire une fonction unification qui prend en paramètre un fait et un motif et
qui retourne la substitution des variables qui permet d’unifier le fait et le motif si on peut les
unifier, échoue sinon.
3. Preuve en chaı̂nage avant - De même que dans le cas sans variables, on part d’une liste de
faits initiaux et on veut vérifier si on peut déduire un fait appelé but. On procède de la même
façon en appliquant toutes les règles que l’on peut appliquer, jusqu’à trouver le but ou jusqu’à
convergence. Pour savoir si une règle peut être appliquée il faut vérifier que ses prémisses (les
Pi , ici des termes) s’unifient avec des faits déjà trouvés.
Produire une fonction qui retourne une preuve, ici la liste des règles qui s’appliquent avec pour
4
chacune la substitution utilisée.
Adapter la fnctin d’affichage d’une preuve.
4. Preuve en chaı̂nage arrière - On suit le même raisonnement que dans la cas sans variable.
De même pour savoir si une règle peut être utilisée on vérifie que le fait qui nous intéresse et
la conclusion de la règle s’unifient.
Écrire une fonction qui prend un but et une liste de faits initiaux et cherche si le but est vrai
en utilsant un raisonnement arrière.
Écrire une fonction qui produit une preuve.
2.4
Exemples de bases de règles
Un petit très simple (animaux)
SI taille moyenne et aboiement ALORS chien (que l’on peut aussi mettre sous la forme taille moyenne
∧ aboiement ⇒ chien)
Si taille moyenne et miaulemznt ALORS chat
Si taille petite et chicotement ALORS souris
Exemple de base de règles en botanique (ordre 0) très connu
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
fleur et graine ALORS phanérogame
phanérogame et graine nue ALORS sapin
phanérogame et 1-cotylédoné ALORS monocotylédone
phanérogame et 2-cotylédoné ALORS dicotylédone
monocotylédone et rhizome ALORS muguet
dicotylédone ALORS anémone
monocotylédone et non rhizome ALORS lilas
feuilles et fleur ALORS cryptogame
cryptogame et non racine ALORS mousse
cryptogame et racine ALORS fougère
thallophyte et chlorophylle ALORS algue
thallophyte et non chlorophylle ALORS champignon
non feuilles et plante ALORS thallophyte
thallophyte et non chlorophylle ALORS champignon
non feuilles et non fleur et non plante ALORS colibacille
Animals again
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
SI
animal à poils ALORS mammifère
donne lait ALORS mammifère
mange viande ALORS carnivore
animal à dents pointues ET animal à griffes ET animal a yeux vers avant ALORS carnivore
mammifère ET (animal à sabots) ALORS ongulé
mammifère ET non carnivore ALORS ongulé
mammifère ET carnivore ET couleur brune ET tâches sombres ALORS guépard
mammifère ET carnivore ET (couleur brune ET raies noires ALORS tigre
ongulé ET long cou ET longues pattes ET tâches sombres ALORS girafe
ongulé ET raies noires ALORS zèbre
plumes ALORS oiseau
vole ET ponds oeufs ALORS oiseau
oiseau ET ne vole pas ET long cou ET longues pattes ET noir et blanc ALORS autruche
oiseau ET ne vole pas ET nage ET noir et blanc ALORS pingouin
oiseau ET carnivore ALORS aigle.
5
Relations familiales - système avec variables
Les faits initiaux :
merede(Gaia,Cronos).
merede(Rhea,Zeus)
merede(Rhea,Hades)
perede(Zeus,Pollux)
perede(Ouranos,Cronos)
perede(Cronos,Zeus)
perede(Zeus,Helene)
perede(Zeus,Castor)
Les règles :
SI perede(x,y) ALORS parentde(x,y)
SI merede(x,y)ALORS parentde(x,y)
SI parentde(i,j) ET parentde(j,k) ALORS grand-parentde(i,k)
SI parentde(x,y) ET parentde(x,z) ALORS frerede(y,z)
Vous pouvez choisir le domaine que vous voulez et un système de règles adéquat.
6