Université Lyon1 – Licence Sciences et Technologies UE LIFO42 - Prolog
TP numéro 1
1 Utilisation de Swi-Prolog sous Unix
Choisissez votre éditeur préféré pour créer un fichier avec une extension .pl dans lequel vous
écrirez votre programme (par exemple tp1.pl). Attention à ne pas utiliser de majuscule pour la
première lettre du nom du fichier.
Placez-vous dans le répertoire où figure votre fichier puis lancez Prolog grâce à la commande
prolog ou swipl ou pl. Chargez votre programme grâce à l’instruction [tp1]. À chaque modification
du programme, n’oubliez pas d’enregistrer et de recharger le fichier dans Prolog.
2 Arbre généalogique
2.1 Déclarations
Définissez la famille ci-dessous dans l’éditeur. Attention à ne pas mettre de majuscules aux
prénoms ni aux prédicats. N’oubliez pas les points.
homme(albert). pere(albert,jean).
homme(jean). pere(jean,paul).
homme(paul). pere(paul,bertrand).
homme(bertrand). pere(paul,sophie).
homme(dominique). pere(jean,simone).
homme(benoit). pere(louis,benoit).
femme(germaine). mere(germaine,jean).
femme(christiane). mere(christiane,simone).
femme(simone). mere(christiane,paul).
femme(marie). mere(simone,benoit).
femme(sophie). mere(marie,bertrand).
mere(marie,sophie).
2.2 Questions
Traduire les questions suivantes en Prolog et vérifier les réponses :
Est-ce que Paul est un homme ? Est-ce que Marie est la mère de Sophie ? de
Est-ce que Benoit est une femme ? Benoit ?
Qui est une femme ? Qui est la mère de Jean ?
Qui est un homme ? Quels sont les enfants de Paul ?
Quels sont les hommes qui sont pères ?
Université Lyon1 – Licence Sciences et Technologies UE LIFO42 - Prolog
2.3 Définition de prédicats
Définir les prédicats suivants :
• parent(X,Y) : X est un parent de Y, pere ou • grand_pere(X,Y) : X est le grand-père de Y ;
mere ; • grand_mere(X,Y) : X est la grand-mère de Y ;
• fils(X,Y) : X est le fils de Y ; • frere(X,Y) : X est le frère de Y ;
• fille(X,Y) : X est la fille de Y ; • sœur(X,Y) : X est la sœur de Y.
3 Traduction d’énoncés
Traduire en Prolog l'énoncé suivant :
Marie aime le vin
Pierre est un voleur
Pierre aime tous ceux qui aiment le vin
Si quelqu'un est un voleur et aime quelque chose alors il le vole
Qui vole quoi ?
4 Unification
Que donnent les unifications suivantes :
pierre=marie. X=parent(Y,paul).
X=jean. [X,Y]=[a,b,c].
X=Y. [X,Y|L]=[a,b,c].
pierre=aime(X,Y). [X|L]=[X,Y|L2].
pere(X,Y)=aime(T,jean). pere(X,fille(X))=pere(jean,Y).
5 Exercices sur les listes
• Définir le prédicat longueur(L,N), qui étant donnée la liste L calcule sa longueur N.
• Définir le prédicat concat(L1,L2,L3) où L3 est le résultat de la concaténation de L1 et L2 (sans
utiliser append).
• Définir le prédicat palindrome(L) vrai si la liste L est sa propre image renversée.
• Définir un prédicat rang_pair(X,Y) qui extrait les éléments de la liste X qui ont des indices de
rang pair afin de construire la liste Y. Ex. rang_pair([a,b,c,d,e],L). -> L=[b,d]
• Définir le prédicat indice(X,L,N), qui étant donnés un élément X et une liste L, X appartenant à L,
calcule N l’indice de la première occurrence de X dans L. Peut-on utiliser ce prédicat pour formuler
une requête permettant de calculer le ième élément d’une liste ?
• Écrire le prédicat remplace(X1,X2,L1,L2) qui construit la liste L2 qui est la liste L1 dans laquelle
X1 est remplacé par X2.
n
• Écrire le prédicat somme(L,R) qui si L = (x1, x2, . . . , xn) calcule R = ∑ ix i
i=1
• Définir le prédicat partage(L,X,L1,L2), qui étant donnés une liste de nombre L et un nombre X,
calcule la liste L1 des nombres de L inférieurs à X, et la liste L2 des nombres de L supérieurs ou
égaux à X. €