01.07.2013 Views

UE ELFE - Programmation Logique SWI-Prolog - LIFL

UE ELFE - Programmation Logique SWI-Prolog - LIFL

UE ELFE - Programmation Logique SWI-Prolog - LIFL

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!