TP2 - Prolog (Introduction) 12-13 Février 2006 Bilel Derbel, Hongyang Qu et Peter Niebert 0. Introduction Eclipse permet aussi de faire de la programmation logique (Prolog). Prolog est un langage relationnel : une fonction Y = f (X1 , ..., Xn ) est remplacée par une relation rf (X1 , ..., Xn , Y ). En X1 , ..., Xn sont données, la valeur Y correspondante est f (X1, ..., Xn). particulier quand les valeurs Les relations sont dénies par : A.1 (à lire A est homme(martin). a. des faits Ex : vrai). B : −A1 , ..., Am .1 (à lire B est vraie pere(X, Y ) : −parent(X, Y ), homme(X). si b. des règles Ex : ou B et ··· et Am sont vraies). nom(t1 , ..., tn ) avec nom un nom de relation (commence toujours pere), des variables (commencent toujours par une majuscule, exemple X1), des nombres (comme 1, 2, · · · ), des noms (commencent toujours par une minuscule, exemple anne), des expressions (formées avec des opérations, des noms, · · · ). Les A A1 sont de la forme par une minuscule, exemple L'ensemble est un programme logique et sert ensuite à répondre à des requêtes. Une requête : −A.1 parent(X, martin). est de la forme qui s'ecrit simplement A.1 quand on est sous l'interpréteur. Exemple : 1 Arbre génaologique Copier le chier ∼derbel/TP_RO/base.pl dans votre répertoire de travail. 1.1 Étudier le chier base.pl . Tester les requêtes suivantes : homme(martin). homme(jean). f emme(X). parent(X, pierre). etudiant(X, Y, Z, T ). 1.2 En vous inspirant de ce que vous avez vu en cours, implémenter les relations pere(X, Y ), mere(X, Y ), neveu(X, Y ), niece(X, Y ), grandpere(X, Y ), mamie(X, Y ), ancetre(X, Y ), etc. 1.3 Tester vos relations en ajoutant éventuellement de nouvelles entrées dans le chier base.pl . 2 Les listes en Prolog La liste vide se note [], la liste contenant les éléments e1 , · · · , en se note [e1 , · · · , en ]. La notation [e|L] désigne la liste dont le premier élément est e et le reste de la liste est L. Certains predicats sont prédénis. Ex : append(L1, L2, L3) est vrai ssi L3 est la concaténation de L1 et de L2; member(e, L) est vrai ssi e est dans L. 2.1 Avant de tester les requêtes de la gure 1, quelles réponses doit fournir l'interpréteur à votre avis? 2.2 Écrire un programme ef f ace(X, L, R) R. qui eace toutes les occurrences de met le résultat dans la liste 1 attention : le point . est obligatoire. 1 X dans la liste L et requête réponse requête [a, b] = [X, Y ]. [a] = [X|Y ]. [a, b, c, d] = [X, Y |Z]. [a, b, c, d] = [X, Y, Z]. [[a, b, c], d] = [X|Y ]. réponse member(a, [b, c, a, d]). member(a, [b, c, d, e]). member(X, [a, b, c]). append([a], [b, c], [a, b, c]). append(L1, L2, [a, b, c]). Figure 1: Jeu de test pour les listes 3 Devinettes 3.1 que fait le programme suivant à votre avis? Faites diérents tests. 1. 2. 3. 4. enum(X, I, J) : − I =< J , X is I. enum(X, I, J) : − I =< J , K is I + 1 , enum(X, K, J). label([], I, J). label([X|L], I, J) : − enum(X, I, J) , label(L, I, J). 4 Carrée magique Dans cet exercice, on utilisera la librairie ic. Un carré magique de dimension 3 est un carré découpé en 9 cases (par 3 lignes, 3 colonnes) chaque case contenant un nombre entier et tel que la somme des nombres de chaque colonne soit la même partout et la somme des nombres de chaque ligne soit la même partout. On demande qu'en plus un nombre ne gure qu'une seule fois dans le carré et que les nombres soient entre 4.1 Écrire le programme pour 1 et N. N = 9. 5 What is unication? 5.1 Que répond l'interpréteur à: Explication : = X = 1 + 1. et à X is 1 + 1. est l'unication pour laquelle les objets sont des arbres et les symboles sont non interprétés (ce sont des lettres). L'unication de pour rendre identique les termes is s et s et t instancie les variables de Consulter la documentation dans ECLiPSe pour plus d'explications et d'exemples. 5.2 Vérier cette utilisation sur les exemples suivants : 2. f act(0, 1). f act(N, F ) : − N > 0, N 1 is N − 1, f act(N 1, F P ), F is N ∗ F P. 3. 4. 6. long([], 0). long([X|L], N ) : − long(L, N 1), N = N 1 + 1. 7. 8. 9. et t est un prédicat système qui cherche à évaluer l'expression arithmétique qui est à droite pour l'aecter à la variable de gauche. 1. s t. gcd(N, 0, N ). gcd(I, J, G) : − J > 0, R is I mod J, gcd(J, R, G). 2