ELFE - DS1 (durée: 90 min)

Transcription

ELFE - DS1 (durée: 90 min)
Licence d’informatique – 2012/2013
ELFE - DS1 (durée: 90 min)
mars 2013
Exercice 1 : Dans cet exercice, vous analysez le programme Datalog (DES) P1 suivant :
q1 ( a , b ) .
q3 ( a , b ) .
p (X,Y) :− q1 (Y, Z ) , not ( q2 (Z ,X) ) , q3 (X, P ) . % r e g l e 1
q2 (Z ,X) :− q4 (Z ,Y) , q3 (Y, Z ) .
% regle 2
q4 (Z ,Y) :− p (Z ,X) , q3 (X,Y ) .
% regle 3
Question 1.1 : Le programme P1 est-il sur ? Argumentez pour chacune des règles. Pour les
règles non sures, proposez une correction, quand c’est possible.
Correction:
– règle 1 : l’utilisation de la variable X dans le corps est problématique : pas de liaison avant
d’apparaitre sous la negation. Donc, cette regle n’est pas sure. Correction : p(X, Y ) :
−q1(Y, Z), q3(X, P ), not(q2(Z, X)).
– règle 2 : utilisation de variable X dans la tête de la règle n’est pas sure. Il n’y a pas de
correction possible.
– règle 3 : aucun problème, cette règle est sure. Toutes les variables de la tete apparaissent
dans le corps, dans des predicats definis par le programme, sous forme positive,
Pour résumer : le programme n’est pas sur, puisqu’il contient des regles non sures.
Question 1.2 : Donnez le graphe des dépendances de P1 .
Correction:
p
-
q1
q2
q3
q4
2
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
Question 1.3 : Le programme P1 est il stratifiable ? Si oui, donnez la strate de chacun des
prédicats. Si non, expliquez pourquoi.
Correction:
Non, le programme n’est pas stratifiable. Il y a un cycle
q2 → p → q4 → q2 → . . .
incluant un arc négatif de q2 à p.
Exercice 2 : Le programme Datalog (DES) P2 décrit un réseau social. Il a les prédicats :
• personne(Id, N, A) : une personne identifiée par Id, du nom N, de l’âge A.
• amitie(Idx, Idy) : les personnes Idx et Idy ont mutuellement confirmé leur lien
amical. Une règle prédéfinie assure la symétrie.
• aime(P id, S) : la personne P id s’intéresse au sujet S.
• lieu(Lid, L, A, T ) : un lieu nommé L, identifiant Lid, à l’adresse A, de thématique T .
• f requente(P id, Lid) : la personne P id fréquente le lieu Lid.
Les identifiants et âges sont des entiers, les autres données des strings. Exemples :
l i e u ( 1 , ’ d o j o h a r a k i r i ’ , ’ 3 r ue Pasteur , 5 9 1 2 3 M a v i l l e ’ , ’ k a r a t e ’ ) .
aime ( 1 , ’ mangas ’ ) .
Question 2.1 : Donnez un exemple d’instanciation pour chacun des 5 prédicats, en vous
inspirant des exemples ci-dessus.
Correction :
p e r s o n n e ( 3 , ’ susanne gourmande , 2 0 ’ ) .
amitie (1 ,3).
aime ( 3 , ’ c h o c o l a t ’ ) .
l i e u ( 2 , ’ meert ’ , ’ 3 r ue Esquermoise , 59000 L i l l e ’ , ’ g a u f f r e s ’ ) .
frequente (3 ,2).
Question 2.2 : Formulez un prédicat pourrait interesser(Id, S), qui est vrai si au moins
deux amis de la personne Id aiment le sujet S.
Correction :
p o u r r a i t i n t e r e s s e r ( Id , S ) :−
a m i t i e ( Id , A1 ) ,
a m i t i e ( Id , A2 ) ,
A1 \= A2 ,
aime (A1 , S ) ,
aime (A2 , S ) .
Question 2.3 : Le réseau social cherche à mettre en relation des gens sur la base de leurs
centres d’intérêts. Formulez un prédicat suggestion amis(Id1, Id2) qui est vrai si les deux
personnes dont les identifiants sont Id1 et Id2 ont un ami commun, fréquentent le même
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
3
lieu, et s’intéressent au même sujet.
Correction :
s u g g e s t i o n a m i s ( Id1 , Id2 ) :−
a m i t i e ( Id1 , Z ) ,
a m i t i e ( Id2 , Z ) ,
Id1\=Id2 ,
aime ( Id1 ,X) ,
aime ( Id2 ,X) ,
f r e q u e n t e ( Id1 ,Y) ,
f r e q u e n t e ( Id2 ,Y ) .
Question 2.4 : Definissez un nouveau prédicat populaire(T ) qui est vrai si au moins 1000
personnes fréquentent des lieux avec la thématique T .
Correction :
t h e m a t i q u e v i s i t e u r (T, Pid ) :−
l i e u ( Lid , , ,T) , f r e q u e n t e ( Pid , Lid ) .
p o p u l a i r e (T) :−
group by (
t h e m a t i q u e v i s i t e u r (T, Pid ) ,
[T] ,
(R=count , R>=1000)
).
Question 2.5 : Formulez un prédicat branche(Id) qui est vrai pour une personne Id, si tous
les lieux fréquentés par Id ont des thématiques populaires.
Correction :
f r e q u e n t e l i e u o u t ( Pid ) :−
p e r s o n n e ( Pid , , ) ,
l i e u ( Lid , , ,T) ,
f r e q u e n t e ( Pid , Lid ) ,
not ( p o p u l a i r e (T ) ) .
branche ( Pid ) :−
p e r s o n n e ( Pid , , ) ,
not ( f r e q u e n t e l i e u o u t ( Pid ) ) .
Question 2.6 : Dessinez le graphe des dépendances pour vos définitions de populaire,
branche et d’éventuels prédicats auxiliaires, si vous en avez introduits pour les Q2.4 et 2.5.
4
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
Correction:
3 branche
2 freqente_lieu_out
1 populaire
personne
1
1 thematique_visiteur
frequente
lieu
1
1
Exercice 3 : Soit le programme Datalog (DES) P3 avec les règles suivantes :
s (X)
t (X)
u (X)
w(X)
:−
:−
:−
:−
r 1 (X) ,
r 2 (X) ,
r 3 (X) ,
r 4 (X) ,
r (X ) .
r (X ) .
t (X ) .
s (Y) , u (Y) ,Y \= X.
et les faits
r1 ( a ) . r2 ( a ) . r3 ( a ) . r4 ( a ) . r ( a ) . r1 (b ) . r3 (b ) . r4 ( c ) .
Question 3.1 : Construisez le graphe de dépendances pour P3 .
Correction:
Remarque : l’inclusion de l’inegalite n’importe pas.
r
\=
s
t
u
w
r1
r2
r3
r4
Question 3.2 : Déterminez le résultat de la requête u(a), en précisant toutes les étapes (par
exemple en dessinant un arbre de preuve).
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
Correction:
5
u(a) regle 3
r3(a)
t(a)regle 2
r2(a) r(a) Il est
Le fait est VRAI, nons montrons son arbre de preuve.
important de noter que les faits des feuilles en vert sont contenus dans la EDB. Si des faits
en feuilles n’etaient pas contenus dans EDB, on n’aurait pas de preuve. Le resultat de la
requete serait vide, c.a.d. le resultat de la requete dirait faux.
Question 3.3 : Calculez le plus petit point fixe de P3 .
Correction:
Commencean avec les faits pour prédicats EDB donnes en haut, on ajoute en premiere
iteration (c.a.d. application des regles applicables sur les faits existants) {s(a), t(a, )} , puis
en seconde iteration {u(a)}, puis en troisieme {w(c)}. Aves la troisieme iteration, le point
fixe est atteint.
Question 3.4 : L’ensemble suivant est-il un modèle du programme P3 ?
{r1(a), r2(a), r3(a), r4(a), r(a), r1(b), r3(b), r4(c), t(a), s(b), w(c)}
Correction:
non, puisqu’il manque : u(a), s(a), t(a). De plus, s(b) ne peut pas etre deduit, mais ce n’est
pas l’argument qui compte.
Exercice 4 : Imaginons un mini-langage de programmation, très simplifié, qui contient
une instruction PRINT, des variables et des opérations arithmétiques. Les lignes de code
sont numérotées, pour qu’on puisse s’y repérer. Voici un programme d’exemple (il se trouve
que c’est l’algorithme optimal pour élever un nombre à la puissance 15) :
// Exemple 1
1:
a := 42
2:
b := a*a
3:
c := b*a
4:
d := c*c
5:
e := d*d
6:
f := e*c
7:
PRINT f
//
//
//
//
//
b
c
d
e
f
=
=
=
=
=
42^2
42^3
42^6
42^12
42^15
Dans un premier temps, on voudrait utiliser DataLog pour essayer de détecter des bugs
dans des programmes. Pour cela, on modélise les programmes de ce langage simplifié avec
deux prédicats :
6
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
• read(V,L) si la variable V est lue ligne L.
• write(V,L) si la variable V est écrite ligne L.
Pour le programme d’exemple on aurait :
write(a,1).
read(a,2).
read(a,3).
read(c,4).
read(d,5).
read(c,6).
read(f,7).
read(b,3).
read(e,6).
write(b,2).
write(c,3).
write(d,4).
write(e,5).
write(f,6).
Question 4.1 : Une erreur courante des programmeurs débutants consiste à lire la valeur
d’une variable avant d’avoir initialisé la variable en question. Ecrivez un prédicat bad read(X)
qui est vrai si la variable X est lue avant d’avoir été écrite.
Correction :
w r i t t e n a t (X, L) :− write (X, L1 ) , L1 < L .
b a d r e a d (X) :− read (X, L ) , not ( w r i t t e n a t (X, L) ) .
Question 4.2 : Dans la même famille, si une variable est écrite, mais n’est pas lue par la
suite, c’est qu’il y a sûrement un problème. Définissez un prédicat f orgotten(X, L) qui est
vrai si la variable X est modifiée ligne L, mais n’est plus jamais lue ensuite.
Correction :
r e a d a f t e r (X, L) :− read (X, L a f t e r ) , L a f t e r > L .
f o r g o t t e n (X, L) :−write (X, L ) , not ( r e a d a f t e r (X, L ) ) .
Question 4.3 : Pour étendre le résultat de la question précédente, on pourrait remarquer
que si une variable est modifiée à la ligne L1 , puis modifiée à la ligne L2 , mais qu’elle n’a
pas été lue entre les deux, alors la valeur stockée ligne L1 est perdue. Cela peut indiquer
un bug (mais pas tout le temps). Étendez le prédicat f orgotten(X, L) pour détecter cette
situation.
Correction :
r e a d b e t w e e n (X, L1 , L2 ) :− read (X, L ) ,
L1<L ,
L<L2 .
f o r g o t t e n (X, L1 ) :−
write (X, L1 ) , write (X, L2 ) , not ( r e a d b e t w e e n (X, L1 , L2 ) )
On ajoute maintenant à notre langage les instructions IF et GOT O (GOT O i signifie
que l’exécution continue à la ligne i). Voici un autre programme d’exemple (il calcule le
42-ème nombre de Fibonacci) :
Licence d’informatique – 2012/2013 : ELFE - DS1 (durée: 90 min)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
7
n := 42
a := 0
b := 1
IF n == 0 THEN GOTO 11
c := a + b
a := b
b := c
m := n - 1
n := m
GOTO 4
PRINT b
Pour modéliser les GOT Os et les IF s, on utilise un prédicat succ(L1, L2) qui est vrai
s’il est possible de passer de la ligne L1 à la ligne L2 . Dans l’exemple de Fibonacci on
aurait :
succ(1,2).
succ(5,6).
succ(10,4).
succ(2,3).
succ(6,7).
succ(3,4).
succ(7,8).
succ(4,5).
succ(8,9).
succ(4,11).
succ(9,10).
Question 4.4 : [Attention, cette question est difficile] Reprogrammez les prédicats bad read
et f orgotten. Le principal changement c’est que maintenant l’ordre d’exécution des instructions ne correspond plus aux numéros des lignes. Une des difficultés vient du fait que
la même ligne peut éventuellement être exécutée plusieurs fois.
Correction :
path ( L1 , L2 ) :− s u c c ( L1 , L2 ) .
path ( L1 , L2 ) :− s u c c ( L1 , I ) , path ( I , L2 ) .
h a s b e e n w r i t t e n a t (X, L) :− path ( 1 , L1 ) , write (X, L1 ) , path ( L1 , L ) .
b a d r e a d (X) :− read (X, L ) , not ( h a s b e e n w r i t t e n a t (X, L) ) .
r e a d a f t e r (X, L) :− read (X, L a f t e r ) , path (L , L a f t e r ) .
f o r g o t t e n (X, L) :−write (X, L ) , not ( r e a d a f t e r (X, L ) ) .
r e a d b e t w e e n (X, L1 , L2 ) :− path ( L1 , L ) , read (X, L ) , path (L , L2 ) .
f o r g o t t e n (X, L1 ) :− write (X, L1 ) , write (X, L2 ) , not ( r e a d b e t w e e n (X, L1 , L2 ) ) .