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