sujet - LSV, ENS Cachan

Transcription

sujet - LSV, ENS Cachan
Programmation, langages, compilation 2
(TD/TP)
–
Programmation modulaire et orientée objets,
programmation logique
E. Lozes
Exercice 1 – Un compteur fiable et non modifiable
On souhaite disposer d’un compteur ”protégé” pour qu’on ne puisse que l’incrémenter
de 1, l’évaluer et le remettre à 0.
1. On choisit de créer un module spécifiquement pour ce compteur. Ecrire son
implémentation et son interface en Caml et en C. Comment utilise-t-on
le compteur à l’extérieur du module ?
2. Qu’est-ce que la compilation séparée et comment est-elle mise en œuvre
en Caml et en C ? Citez plusieurs avantages de la compilation séparée.
3. Montrer qu’en Caml on peut faire l’équivalent du compteur protégé avec
des constructions très élémentaires, en particulier sans passer par un module.
4. Définissez un objet compteur et montrez comment l’utiliser. Citez des
différences avec la version modulaire.
5. On veut utiliser plusieurs compteurs, et marquer chacun par un numéro de
série unique consultable mais non modifiable. Proposer plusieurs solutions,
avec des modules, des objets, en Caml, en C/Java.
Exercice 2 – Aperçu du monde Java1
On considère le code Java suivant :
class Personne{
String nom;
Personne(String nom){this.nom=nom}
String nomme () {return this.nom}
1 Pour tester cet exercice sur machine, quelques conseils sur comment lancer un programme
Java : on écrit le programme dans un fichier (”toto.java”, qui contient une classe ”Toto” ayant
une méthode void main(String args[]). On compile : javac toto.java, puis on exécute :
java Toto
1
}
class Monde{
void salut(Personne p){System.out.println("Bonjour "+ p.nomme());
Monde(){
Personne toto = new Personne("toto");
this.salut(toto);
}
}
1. Sur cet exemple, qu’est-ce qu’une classe, un objet, une méthode, un champ,
un constructeur ? Si on rajoute une personne, comment fait-on ? Qu’est-ce
qui sera partagé entre eux ? Quel est le but général des mots public, private, protected
placés devant une déclaration de champ ?
2. On veut ajouter des personnes pour lesquelles on aura davantage d’informations. Pour cela, on définit une classe descendant de la classe Personne :
class Personne2 extends Personne {
Personne2(String nom, String prenom){
super(nom);
this.prenom = prenom;
}
String nomme() {return this.nom+" "+this.prenom}
}
et on rajoute au monde ”Jeannot Lapin”. Comment va-t-on le saluer ?
Que penser du type des objets de classes descendantes ?
3. On ajoute une méthode ”Presentation” à la classe Personne :
class Personne{
[..]
void presentation(){System.out.println("Bonjour, je m’appelle"+this.nomme());}
}
On demande à chacun de se présenter dans le monde. Que se passe-til ? Quel type de liaison est mis en oeuvre ? Quelles sont les méthodes
masquées dans la sous-classe ?
4. On ajoute maintenant une méthode presentation(Personne p) à côté de la
première dans la classe Personne :
class Personne{
[..]
void presentation(){System.out.println("Bonjour, je m’appelle"+this.nomme());}
void presentation(Personne p){
System.out.println("Bonjour,"+ p.nomme()+", je m’appelle"+this.nomme());}
}
C’est le polymorphisme par surcharge : le type des arguments permet au
compilateur de trouver à quelle méthode il est fait référence. Comment
voit-t-on ces choses en CAML ?
2
5. Que se passe-t-il si Jeannot Lapin se présente à toto ? Redéfinissez presentation
dans Personne2 de façon à obtenir ”Bonjour toto, je m’appelle Lapin”.
6. Qu’est-ce qu’une classe abstraite ? Donnez un exemple.
7. Qu’est-ce qu’une interface ? Pourquoi cela existe-t-il alors qu’il y a des
classes abstraites ?
8. Cherchez le sens des mot-clés suivants : public, private, protected, final,
et static.
Exercice 3 – Programmer avec la logique
On considère le programme Prolog suivant :
addright ( nil ,X, [X] ) .
a d d r i g h t ( Cons (A, B) ,X, Cons (A, Z ) ) :− a d d r i g h t (B, X, Z )
rev ( nil , n i l ) .
r e v ( Cons (X,Y) , Z) :− r e v (Y,W) , a d d r i g h t (W, X, Z )
1. Dans ce qui précède, qu’appelle-t-on ”prédicats”,”variables”, ”termes”,
”faits” et ”règles” ? Donnez la syntaxe générale d’un programme Prolog.
2. Que répond Prolog aux requêtes suivantes :
?−
?−
?−
?−
?−
rev ( [ 1 , 2 , 3 ] , [ 3 , 2 , 1 ] )
r e v ( [ 9 , 1 , 1 ] ,Y)
r e v (X, [ 3 2 , 5 2 ] )
r e v ( [ 1 , 2 ,A] , [ 3 , 2 , B ] )
r e v ( [ 1 , 2 ,C ] , [ 3 , 3 ,D] )
3. Prolog est basé sur la notion de close de Horn. Qu’est-ce que c’est ? Quel
est le lien avec le programme ? Expliquer pourquoi on ne peut pas écrire
une règle noir(X),blanc(X) :- noiroublanc(X).
4. Que dire des modèles de Herbrand d’une théorie de clauses de Horn ?
Préciser la sémantique d’un programme prolog.
5. Donner l’arbre de recherche de Prolog sur l’exemple suivant :
f r è r e o u s o e u r (X,Y) :− p a r e n t ( Z ,X) , p a r e n t ( Z ,Y ) .
pè r e (X,Y) :− p a r e n t (X,Y) , mâle (X ) .
mère (X,Y) :− p a r e n t (X,Y) , f e m e l l e (X ) .
p a r e n t (X,Y) :− pè r e (X,Y ) .
p a r e n t (X,Y) :− mère (X,Y ) .
mère ( trude , s a l l y ) .
pè r e ( tom , s a l l y ) .
pè r e ( tom , e r i c a ) .
pè r e ( mike , tom ) .
mâle ( tom ) .
f e m e l l e ( trude ) .
mâle ( mike ) .
?− f r è r e o u s o e u r ( s a l l y , e r i c a )
oui .
3
6. Donner un exemple de programme Prolog qui ne termine pas. Est-il possible qu’un programme diverge bien qu’il y ait des solutions calculables en
temps fini ?
7. On appelle Datalog le fragment de prolog où les seuls symboles de fonction sont d’arité 1. Montrer que les programmes logiques de ce fragment
terminent. Quel est le lien avec les bases de données ?
8. Comment est traité le programme suivant utilisant un coupe-choix ?
d o n n e f e s s é e (X,Y) :− pè r e (X,Y) , ! .
d o n n e f e s s é e (X,Y): − mère (X,Y ) .
?− d o n n e f e s s é e (X, s a l l y )
9. Comment est traitée la règle suivante ? Donner un encodage de la négation
utilisant le coupe-choix et une constante fail non inférable.
f e m e l l e (X) :− not mâle (X ) .
4