Vous êtes sur la page 1sur 8

HE Arc

IARTI 2008 2009

Prise en main de SWI-Prolog

Introduction
Prolog est un langage de programmation logique. Ceci veut dire quun programme ne se prsentera pas sous forme dune suite dinstruction (comme dans la programmation imprative), mais sous la forme dun certain nombre dafrmations sur le monde, formant une base de connaissances. Lutilisation du programme se fera alors en interrogeant cette base de connaissances. Prolog dispose dun puissant moteur lui permettant de dduire certains faits partir de ceux que contient sa base de connaissances. Une autre manire de voir Prolog est de dire quil sagit dun systme expert gnrique en chanage arrire. Au cours des TPs qui viennent, nous tudierons en dtails les diffrentes caractristiques de Prolog. Pour linstant, nous nous contenterons dune approche exprimentale pour nous familiariser avec le langage. Nous utiliserons pour ce faire SWI-Prolog, qui est une implmentation libre (sous licence LGPL) du langage Prolog.

1 Installation
Commencez par installer SWI-Prolog en rcuprant linstalleur pour votre plate-forme sur http: //www.swi-prolog.org/download/stable ou par un commende du type sudo apt-get install swi-prolog.

2 Base de faits
Dans un chier texte, entrez le code suivant1 :
man ( john ) . woman ( frida ) . woman ( nelly ) . duck ( donald ) . loves ( john , frida ) . loves ( frida , donald ) . loves ( nelly , donald ) . loves ( donald , nelly ) .
1 Faites

attention la casse ! pas de majuscule pour les noms ! (nous verrons pourquoi par la suite)

1/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc

IARTI 2008 2009

Un tel chier sappelle base de faits, parce quil regroupe des faits que lon dclare tre vrais. Sauvez le chier sous le nom base1.pl. Si lextension .pl est associe au compilateur swi-prolog, vous pouvez simplement doublecliquer sur le chier ci-dessus pour lancer Prolog2 . Sinon, trouvez le nom de lexcutable (probablement pl ou swipl sous Unix et plwin sous Windows) et tapez une commande du type swipl -s base1.pl Prolog vous indique quil a charg et compil votre chier et vous prsente son invite de commande. % base1.pl compiled 0.00 sec, 2,964 bytes Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 5.6.55) Copyright (c) 1990-2008 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?Si vous avez fait une erreur de syntaxe, celle-ci sera signale ce moment-l. Attention cependant : lerreur sera afche tout en haut, avant la ligne commenant par % base1.pl. . . si on nest pas averti, on peut facilement la manquer !

3 Requtes
Lorsque vous vous trouvez face linvite de Prolog, vous pouvez lui poser des questions. Dans la terminologie Prolog, on les appelle des requtes. Entrez
? woman ( nelly ) .

Si tout va bien, Prolog devrait vous rpondre


true .

et revenir linvite de commandes. En cas de problme, vrier que vous avez bien recopi la base de faits et la requte. Vriez en particulier 1. Que vous navez pour linstant utilis aucune majuscule. 2. Que tout vos faits et votre requte se terminent par un point. Testez de la mme manire les autres faits de votre base. Essayez maintenant la requte
? woman ( laura ) .

Que rpond Prolog ? Vous constatez donc que Prolog considre que tout ce quil ne peut pas dduire de la base de faits est faux (mme si nos yeux cela semble vrai !). En particulier, il ne rpondra jamais I dont know. Essayez encore
2 Lextension

.pl est galement souvent associe au code source Perl.

2/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc
? cat ( mistigri ) .

IARTI 2008 2009

La situation est donc diffrente si on se trouve face une proprit connue mais dont on ne sait pas si elle est vraie ou face une proprit inconnue. Relevons au passage que les proprits dnies dans la base de fait sappellent des prdicats. Vous pouvez maintenant quitter Prolog :
? halt .

4 Variables
Jusqu maintenant, vous ntes probablement pas trs impressionns par la puissance de Prolog. Pour obtenir des choses plus intressantes, nous allons introduire les variables. Relancez Prolog en ouvrant votre chier base1.pl. linvite de commandes, tapez
? man ( X ) .

Prolog vous rpond


X = john.

et revient linvite de commande. Ce passionnant dialogue pourrait se lire Connais-tu un X qui soit un homme ? Oui, John ! Ou plus prcisment : Connais-tu une valeur de X pour laquelle on peut prouver lafrmation homme(X) ? Oui, cela marche avec X=John. Bon, jusque l, rien de bien passionnant. Essayons maintenant
? woman ( X ) .

Prolog vous rpond


X = frida

et ne revient pas immdiatement linvite. Tapez un espace, Prolog afche X = nelly. et revient cette fois-ci linvite de commandes. Que sest-il pass ? 1. Prolog a identi X comme tant une variable. Ceci nest pas d son nom, mais au fait que lidenticateur commence par une majuscule. On aurait tout aussi bien pu entrer Var, HELLO. . . ou Mary3 ! Une autre possibilit pour les noms de variables est de commencer par un soulignement : _var, _Toto, . . . (_ tout seul ayant une signication particulire.) 2. Il a cherch une affectation de la variable X permettant de vrier lafrmation woman(X). 3. En ayant trouv une, il lafche. . . 4. . . . mais comme il a constat quil pourrait y avoir dautres possibilits, il attend votre avis (notez labsence de point aprs cette premire rponse !). Si cette information vous suft, tapez enter (ou a, ou c) et Prolog arrtera sa recherche. 5. Si vous voulez voir les alternatives restantes, tapez ; (ou n, r, barre despacement ou tabulation) et Prolog continuera sa recherche. Retour au point 2 jusqu ce quil ny ait plus dautre solution. . .
3 Et

on comprend maintenant pourquoi il ne faillait pas mettre de majuscule aux noms propres !

3/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc

IARTI 2008 2009

Essayez maintenant, sur la base de ce que nous avons vu, de rpondre aux questions suivantes : 1. De qui John est-il amoureux ? 2. Qui est amoureux de Donald ?

5 Conjonction
Nous nous sommes pour linstant limits satisfaire un seul but la fois, mais on peut aussi tenter de les combiner : si lon entre plusieurs buts spars par des virgules, Prolog essaiera de tous les satisfaire simultanment. Ainsi,
? woman ( X ) , loves ( john , X ) .

nous donne bien le X = frida ; que nous esprions, et


? woman ( X ) , man ( X ) .

nous donne heureusement No. Essayez maintenant de trouver sil existe un amour rciproque dans notre monde imaginaire.

6 Rgles
Jusque l, Prolog ressemble une sorte de base de donnes, mais en moins pratique et plus lent ! Pour en faire un langage de programmation, il nous manque un ingrdient essentiel : les rgles. Ouvrez nouveau votre diteur de texte prfr et chargez le chier base1.pl. la suite des lignes existantes, rajoutez deux lignes pour obtenir le rsultat suivant :
man ( john ) . woman ( frida ) . woman ( nelly ) . duck ( donald ) . loves ( john , frida ) . loves ( frida , donald ) . loves ( nelly , donald ) . loves ( donald , nelly ) . % and h e r e i s o u r f i r s t r u l e : sad ( X ) : loves ( X , Y ) , loves ( Y , Z ) .

Lavant-dernire ligne est un commentaire, introduit par le caractre %. La dernire ligne est une rgle et signie que la partie gauche (avant le :-) est vraie si la partie droite est vrie. Dans le cas particulier, cela nous donne quelque chose comme : X est triste si X aime Y et Y aime Z. noter que le nouveau prdicat sad est cette fois dni par une rgle et non par un fait. On peut aussi mlanger les deux types de dnitions pour un mme prdicat. Enregistrez votre chier, relancez Prolog sur cette nouvelle base4 et essayez de linterroger sur lexistence dune personne triste.
4 Si

vous tes attentifs, vous remarquerez un avertissement la compilation de cette nouvelle base. Stockez cette information dans un coin de votre tte, nous y reviendrons au paragraphe 10.

4/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc
sad ( X ) .

IARTI 2008 2009

Si tout se passe normalement, Prolog vous proposera bien plus de rponses que prvu : non seulement John et Frida sont tristes, ce qui est bien lgitime, mais aussi Donald et Nelly.

7 Dbogage
Pour comprendre ce qui se passe, nous allons utiliser les capacits de dbogage de SWI-Prolog5 . Entrez
t r a c e , sad ( X ) .

Ceci va donc lancer la requte sad(X)., mais en demandant en plus une trace dexcution. Prolog vous rpondra quelque chose comme Call: (8) sad(_G157)?, ce qui signie quil a projet dappeler le prdicat sad avec une variable comme argument6 . Pour savoir quelles sont vos possibilits ce moment prcis, tapez h. Prolog vous donnera alors la liste des commandes disponibles. Pour linstant, nous dsirons simplement continuer lexcution : tapez la barre despacement (ou enter). Continuez suivre pas pas lexcution de votre programme en frappant la barre despacement chaque fois que ncessaire, jusqu la n de lexcution7 . Le debug en mode texte est un plaisir pour les yeux, mais SWI-Prolog (dans sa version pour Windows seulement) propose aussi une version graphique du dbogueur. Dans le menu Debug choisissez Graphical Debugger (ou tapez simplement guitracer.), puis relancez la commande ci-dessus. Une belle fentre apparat vous permettant de suivre lexcution de votre programme8 . Bon. . . avez-vous maintenant compris ce qui cloche dans notre programme ?

8 Correction du programme
Au fait, notre problme nest pas surprenant : nous avons employ des noms de variables diffrents pour X et Z, mais rien nempche que ces variables prennent la mme valeur (comme dailleurs dans les autres langages de programmation). Dans votre diteur, vous pouvez donc corriger la dernire ligne de votre programme pour exiger que les valeurs de X et Z soient diffrentes :
sad ( X ) : loves ( X , Y ) , loves ( Y , Z ) , X \ = Z .

Pour recharger ce nouveau programme, vous avez plusieurs solutions choix : 1. Quitter Prolog et double-cliquer nouveau sur base2.pl. 2. Utiliser la commande : consult(o:/path/to/base2.pl).9... 3. . . . ou sa forme quivalente [o:/path/to/base2.pl]. 4. (Sous Windows) Dans le menu le, choisir consult puis slectionner votre chier.
ce cas particulier, il est aussi possible de deviner ce qui se passe sans faire de dbogage, mais nous le ferons tout de mme pour les besoins de la dmonstration ! 6 Le fait que la variable a t renomme ne retiendra pas notre attention pour linstant. 7 ce moment-l, Prolog restera en mode debug. Ceci nest pas drangeant, mais si vous dsirez retrouver votre invite de commande habituelle, tapez simplement nodebug. 8 Les puristes de la console se dpcheront donc dentrer noguitracer pour revenir un debug en mode texte ! 9 Notez lutilisation du sparateur unix (/) au lieu du sparateur Windows (\).
5 Dans

5/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc

IARTI 2008 2009

5. (Sous Windows) Dans le menu le toujours, choisir reload modied les. Testez votre nouvelle base : les amours partages ne sont plus tristes ! Forts de ces nouvelles connaissances, essayez de rajouter votre programme une rgle disant que deux personnes aimant une mme tierce personne sont jalouses.

9 Exercice
Le moment est venu de mettre lpreuve lensemble des connaissance que vous avez acquises au cours de ce document.

F IG . 1: Un arbre gnalogique La gure 1 prsente un arbre gnalogique. 1. crivez une srie de faits dnissant les prdicats homme, femme et parent pour modliser cet arbre. homme(X) signiera que X est un homme, femme(X) que X est une femme, et parent(X,Y) que X est un parent (pre ou mre) de Y. 2. Rajoutez votre base des rgles pour dnir les prdicats suivants (pour tout ces prdicats, on conviendra que Prd(X,Y) signie X est le/un Prd de Y. Par exemple, enfant(X,Y) signiera X est un enfant de Y) : a) enfant(X,Y) b) fils(X,Y) c) fille(X,Y) d) pere(X,Y) e) mere(X,Y) f) grand_parent(X,Y) g) grand_pere(X,Y) h) grand_mere(X,Y) i) petit_enfant(X,Y) j) petit_fils(X,Y) k) petite_fille(X,Y)

6/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc l) frere(X,Y) m) soeur(X,Y) n) oncle(X,Y) o) tante(X,Y) Pensez tester vos rgles au fur et mesure !

IARTI 2008 2009

10 Variable anonyme
Supposons maintenant que lon veuille crire un prdicat qui soit vrai si son argument est un pre, sans sintresser qui est lenfant. On va naturellement essayer quelque chose comme
pere ( X ) : pere ( X , Y ) .

Ce qui veut dire quelque chose comme X est pre (tout court) si cest le pre de quelquun. . . Si vous essayez de tester ce prdicat, vous constaterez plusieurs choses : 1. a marche ! 2. Cela montre au passage que Prolog accepte de dnir deux prdicats de mme nom mais de signatures diffrentes. 3. Prolog afche un Warning la compilation de notre chier : Warning: (genea.pl:76): Singleton variables: [Y] % genea.pl compiled 0.00 sec, 7,620 bytes Welcome to SWI-Prolog (Multi-threaded, Version 5.1.13) [...] Que signie cet avertissement ? Simplement que la variable Y napparat quune seule fois dans la rgle que nous venons dcrire. Ceci nest pas forcment un erreur, mais peut venir de plusieurs choses : 1. Nous avons peut-tre fait une erreur de raisonnement, qui nous pousse dnir une variable que nous nutilisons pas plus loin (ce serait la situation analogue une dnition de variable en C sans lutiliser aprs). Ici, ce nest pas le cas. 2. Nous aurions aussi pu faire une faute de frappe dans le nom dune variable. Ce nest pas le cas non plus. 3. Enn, il se peut que nous ayons besoin dune variable pour des raisons syntaxiques (ici, je dois mettre quelque chose), mais que la valeur de cette variable nait aucune importance nos yeux. Cest visiblement ce qui se passe ici. Pour viter les cas 1 et 2, et pour sconomiser du travail inutile dans le cas 3, Prolog nous signale lorsquune variable napparat quune seule fois dans une rgle. Si nous sommes bien dans le troisime cas, il est dusage de signaler Prolog que la variable en question nest l que comme placeholder. Comment ? en utilisant la variable anonyme, qui se rsume un soulignement (_). Notre rgle devient alors
pere ( X ) : pere ( X , _ ) .

Testons. . . et oh ! miracle, la rgle fonctionne toujours et le warning a disparu !

7/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch

HE Arc

IARTI 2008 2009

Remarque Chaque occurrence de la variable anonyme est indpendante. Par exemple,


pere ( X , X ) .

cherchera une personne qui est son propre pre (ce qui devrait normalement nous donner la rponse fail), alors que
pere ( _ , _ ) .

rpondra Yes ds quon pourra trouver deux personnes nimporte lesquelles dont lune est le pre de lautre.

8/8

distribu sous licence creative common | dtails sur www.matthieuamiguet.ch