Prolog (Introduction)

publicité
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
Téléchargement