UE ELFE - Programmation Logique SWI-Prolog - LIFL
UE ELFE - Programmation Logique SWI-Prolog - LIFL
UE ELFE - Programmation Logique SWI-Prolog - LIFL
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
USTL Licence mention Informatique<br />
<strong>UE</strong> <strong>ELFE</strong> - <strong>Programmation</strong> <strong>Logique</strong><br />
Le but de cette première séance de T.P. est de vous familiariser avec l’environnement PROLOG que<br />
nous utiliserons au cours de nos prochaines séances, par la création de requêtes et de prédicats simples,<br />
ainsi qu’une approche de la récursivité. Nous utiliserons <strong>SWI</strong>-<strong>Prolog</strong> freeware de PROLOG de<br />
l’université d’Amsterdam.<br />
Vous pouvez récupérez des distributions (linux, windows ou Max OS X) de <strong>SWI</strong>-<strong>Prolog</strong> librement sur<br />
le site www.swi-prolog.pl.<br />
<strong>SWI</strong>-<strong>Prolog</strong><br />
• Pour lancer l’interprète de <strong>SWI</strong>-<strong>Prolog</strong>, tapez pl dans une console. Le signal d’invite “?-” attend que vous<br />
saisissiez un but que le moteur de résolution PROLOG tentera de satisfaire.<br />
• Pour quitter <strong>SWI</strong>-<strong>Prolog</strong>, taper halt. (avec le “.” !).<br />
• Dans l’interprète, vous pouvez obtenir une aide sur tout prédicat prédéfini à l’adire du prédicat help. Par<br />
exemple tester “help(halt).”.<br />
Exercice 1 : Quelques questions simples<br />
Une liste d’employés travaillant dans des entreprises d’informatique vous est fournie sous la forme des deux<br />
tableaux 1 et 2.<br />
Des requêtes simples. . .<br />
Nom Age Sexe Entré en à Echelon<br />
Jean 23 Homme 2000 IBM 1<br />
Jacques 32 Homme 1991 BULL 4<br />
Anne 45 Femme 1993 BULL 3<br />
Fabienne 30 Femme 2002 XEROX 1<br />
Eric 49 Homme 1984 BULL 5<br />
Marc 25 Homme 2000 XEROX 2<br />
Julie 24 Femme 2001 IBM 1<br />
Sonia 35 Femme 1996 IBM 3<br />
Franck 45 Homme 1999 IBM 2<br />
Odette 40 Femme 1994 BULL 4<br />
Table 1: Liste des employés par société.<br />
Salaires Ech. 1 Ech. 2 Ech. 3 Ech. 4 Ech. 5<br />
IBM 2000 3000 4500 5500 7500<br />
BULL 1600 3000 4500 6000 7500<br />
XEROX 2500 4500 5500 6000 7000<br />
Table 2: Correspondances échelons/salaires.<br />
On rappelle qu’en PROLOG tout identificateur commençant par une majuscule est considéré<br />
comme une variable, et que les prédicats avec paramètres doivent être immédiatement suivis<br />
d’une parenthèse ouvrante (il ne doit pas y avoir d’espace entre la fin du nom du prédicat et<br />
cette parenthèse).<br />
Q 1 . Saisissez dans un fichier 1 les données présentes dans les tableaux 1 et 2, en écrivant un ensemble de faits<br />
sous la forme de prédicats :<br />
employe( ?Nom, ?Age, ?Sexe, ?Entree, ?Entreprise, ?Echelon)<br />
salaire( ?Entreprise, ?Echelon, ?Salaire)<br />
1 Utilisez l’éditeur de textes que vous souhaitez : emacs, KWrite, Kate, etc. Kate (c’est le cas de Emacs aussi mais il demande un peu plus<br />
de temps d’apdaptation), vous permet d’avoir dans une même fenêtre l’éditeur et un shell dans lequel vous pouvez exécuter <strong>SWI</strong>-<strong>Prolog</strong><br />
Commencez la saisie (les 3 premiers employés et les salaires de Xerox) puis allez consulter et récupérer le<br />
fichier tp1-employes-partiel accessible depuis le portail ((http://www.fil.univ-lille1.fr/<br />
Licence → S5→<strong>ELFE</strong> → Semainier) contient une partie des informations<br />
Rappel : en PROLOG, toute clause se termine pas un point.<br />
Sur une ligne tout ce qui se trouve après le symbole % est considéré comme un commentaire et donc ignOré.<br />
Donnez à votre fichier l’extension .pl.<br />
Q 2 . Chargez votre fichier. Pour cela vous utiliserez le prédicat consult (essayez help(consult)), en lui<br />
donnant en paramètre le nom de votre fichier qui doit avoir l’extension .pl : “consult().”<br />
(vous pouvez regarder l’aide pour les commande chdir et pwd éventuellement, vous pouvez encadrer les noms<br />
de fichiers ou de répertoires d’apostrophe dans ces commandes).<br />
Au chargement, votre fichier est évalué syntaxiquement par l’interprète PROLOG, toute erreur de syntaxe éventuelle<br />
est alors annoncée.<br />
Vous pouvez également simplement tapez “ [].”<br />
Lorsqu’un fichier est chargé (par consult) les clauses qui exsitaient précédemment pour les prédicats définis<br />
dans ce fichier sont “oubliées”. Donc un “consult” réinitialise la définition des prédicats définis dans le fichier<br />
“consulté”.<br />
Q 3 . Premier but.<br />
Le but employe(Nom,Age,Sexe,Annee,Entreprise,Echelon). permet de d’interroger le programme<br />
sur les informations sur les employés.<br />
Saisissez ce but. L’interprète annonce la première réponse (en fait substitution réponse en indiquant la valeur pour<br />
chaque variable. En saisissant ; après la première réponse (quand il y en a une), le moteur de résolution vous<br />
propose la réponse suivante quand il y en a une, et ainsi de suite jusqu’à ce qu’il n’y ait plus de réponse ce que<br />
l’interprète annonce par No.<br />
Si après un succès (= une réponse) vous tapez a (comme abort) ou les touche Espace ou Entree, vous sortez de<br />
la phase de résolution du but sans obtenr les éventuelles autres réponses.<br />
Testez ces différents points.<br />
Q 4 . Trouvez et testez les buts (ou questions) permettant d’obtenir l’énumération :<br />
1. des employés d’IBM par nom, âge, . . . , échelon.<br />
2. des femmes par nom et âge uniquement.<br />
3. des hommes de moins de 25 ans par nom et âge.<br />
4. des salaires de la société IBM par échelon.<br />
5. des hommes de moins de 25 ans par nom uniquement.<br />
Q 5 . Quel problème se pose pour la dernière question ?<br />
Des prédicats simples. . .<br />
Q 6 . Écrivez puis testez les prédicats suivants :<br />
1. jeune employe( ?Nom, ?Ent) Nom correspondant au nom de l’employé, et Ent au nom de l’entreprise. On<br />
considérera qu’un employé est jeune s’il a moins de 25 ans.<br />
Les opérateurs de relation d’ordre numérique classique sont des prédicats prédéfinis sous forme d’opérateur :<br />
>, =
6. collegues( ?Nom1, ?Nom2) Deux employés sont collègues s’ils travaillent dans la même entreprise.<br />
Pour éviter d’avoir deux foi sle même nom, on peut tester la différence d’unification entre deux variables en<br />
utilisant le prédicat \== (utilisez help).<br />
7. plus ancien que( ?Nom1, ?Nom2) On se base sur l’ancienneté dans l’entreprise.<br />
8. plus ancien collegue que( ?Nom1, ?Nom2)<br />
9. gagne plus que( ?Nom1, ?Nom2, ?Salaire) Salaire représentant la différence de salaire entre les deux<br />
employés uniquement si le premier gagne plus que le second.<br />
10. superieur( ?Nom1, ?Nom2) Un employé est le supérieur d’un autre s’il travaille dans la même entreprise,<br />
mais à un échelon strictement supérieur.<br />
11. echelon normal( ?Nom, ?Ech) L’échelon normal d’un employé se calcule comme suit : lorsque l’on arrive<br />
dans l’entreprise on est à l’échelon 1, puis on gagne un échelon tous les quatre ans jusqu’à atteindre l’échelon<br />
5, qu’on ne peut dépasser.<br />
L’opérateur de division entière est // (utilisez help)<br />
12. victime( ?Nom) Un employé est une victime si un de ses collègues ayant moins d’ancienneté que lui est son<br />
supérieur.<br />
13. est exploite( ?Nom) Un employé est exploité s’il a un échelon inférieur à son échelon normal.<br />
14. a plaindre( ?Nom, ?Raison) La variable Raison pourra prendre ses valeurs dans l’ensemble suivant :<br />
{victime, exploite, lesDeux}, sachant qu’un employé est à plaindre s’il est soit une victime, soit exploité,<br />
soit les deux à la fois. (nécessite l’opérateur de négation “\+”).<br />
Exercice 2 : Autre exemple et introduction à la récursivité simple : L’arbre généalogique<br />
On dispose de la généalogie décrite dans l’arbre de la figure 1.<br />
Jean Paule<br />
Luc Cathy Bertand Nancy Francis Corinne Anne Sam<br />
Audrey<br />
Marcelle Henri Annie Tom Sylvie<br />
Marc Jules Aude Thomas<br />
Figure 1: Arbre généalogique utilisé<br />
Nicolas<br />
Q 1 . Le fichier tp1-genealogie-donnees.pl contient les faits permettant de définir cet arbre généalogique<br />
à partir des prédicats :<br />
individu( ?Nom, ?Sexe)<br />
pere( ?Nom1, ?Nom2) , Nom1 est le père de Nom2<br />
mere( ?Nom1, ?Nom2) , Nom1 est la mère de Nom2<br />
Il est disponible depuis le portail de la licence (http://www.fil.univ-lille1.fr/Licence→ S5→<strong>ELFE</strong><br />
→ Semainier).<br />
Q 2 . Écrivez les prédicats suivants :<br />
1. parent( ?Nom1, ?Nom2) : Nom1 est le père ou la mère de Nom2.<br />
2. est frere de( ?Nom1, ?Nom2) : Nom1 est le frère de Nom2.<br />
3. est soeur de( ?Nom1, ?Nom2) : Nom1 est la sœur de Nom2.<br />
4. sont frere et soeur( ?Nom1, ?Nom2) .<br />
5. est demi frere de( ?Nom1, ?Nom2) : Nom1 est le demi-frère de Nom2.<br />
6. est demi soeur de( ?Nom1, ?Nom2) : Nom1 est le demi-frère de Nom2.<br />
7. sont cousins( ?Nom1, ?Nom2) : Nom1 est Nom2 sont cousin(e)s, càd deux de leurs parents sont frère ou<br />
sœur.<br />
Q 3 . En utilisant la récursivité, écrivez les prédicats suivants :<br />
1. ancetre( ?Nom1, ?Nom2) :Nom1 est ancêtre de Nom2.<br />
2. descendant( ?Nom1, ?Nom2) :Nom1 est un descendant de Nom2.<br />
3. sont apparentes( ?Nom1, ?Nom2) . Deux individus sont apparentés s’ils ont au moins un ancêtre commun.