énoncé première session 2001

uv16472


1-Preuves :
Preuves : en Prolog on réécrit member/2 par :

m(X,[X|L]).

m(X,[Y|L]) :- m(X,L).

Q1.1 : Construire le complété de ce programme.

Q1.2 : à partir du complété montrer par les tableaux sémantiques que la liste vide ne contient aucun élément :

           [<"complété de m">]     |-         ~ $ x : m(x,[])




2-Prolog : Dans une ½ valeur du CNAM il a été donné 9 devoirs hebdomadaires notés sur 3 (1 insuffisant , 2 correct , 3 ce qui était attendu…). Les notes à ces devoirs permettent d'avoir un bonus (en point(s)) lors de l'examen selon le barème suivant :
--- 1 point pour 5 ou 6 devoirs avec une note supérieure ou égale à 2.
--- 2 points pour 7 devoirs avec une note supérieure ou égale à 2.
--- 3 points pour 8 ou 9 devoirs avec une note supérieure ou égale à 2.
Les étudiants ont été enregistrés en prolog dans la relation :  (une ligne, un fait par étudiant)


etud(<Date-naissance>,<Nom>,<Epouse>,<Prenom>,<Matricule>).


Les notes aux devoirs ont été enregistrées dans une relation : (une ligne, un fait par étudiant)

dh(<Matricule> , <Liste-des-Notes>).

avec <Liste-des-Notes> une liste de termes de la forme : dh(<N°>,<NOTE>)

Q2 : construire le programme Prolog de calcul des bonus.


Remarque : on demande de construire le prédicat :
bonus(Nom , Prénom , Bonus) :-

etud(_,NOM,_,PRENOM,MATRI), % cf. ci dessus
dh(MATRI,LDH), % cf. ci dessus
% calcul du nombre de devoirs
% avec une note supérieure ou égale à 2
nbDH23(LDH,NB),
ptBonus(NB,BONUS). % calcul du bonus


Exemple :
etud(18/12/75,zazou,[],jean,h01234).
etud(19/11/65,charles,[],pol,h12034).


dh(h74125,[dh(6,3),dh(8,2),dh(9,1),dh(3,3),dh(2,2),dh(4,1)]).
dh(h12034,[dh(8,2),dh(2,3),dh(3,1),dh(4,3),dh(5,3),dh(7,3),dh(6,3)]).

 
?- bonus(N , P , BONUS).
N = charles P = pol BONUS = 1 ;
No



3-Hoare :
Pour supprimer l'élément t1[k] d'un tableau t1[1..n] on recopie ce tableau dans un tableau t2[1..n-1] sans recopier l'élément t1[k].
On a écrit le programme progr1 suivant :
{t1[1..n] Ù t2[1..n-1] Ù n > 0 Ù 1£ k Ù k£ n}
i:=0;
while (i¹ n)
invariant : { ( " x (x>= 1 Ù x<i) -> t1[x]=t2[x] Ù i <k ) Ú
                 ( " x ((x>= 1 Ù x<k) -> t1[x]=t2[x] )Ù
                          " x ((x>= k Ù x<i Ù i>=k) -> t1[x+1]=t2[x]) ) Ù i<n }  
variant : { (n-i+1) }
do
   i := i+1;
   if (i < k) then t2[i] := t1[i]
                else t2[i] := t1[i+1]
   end;
end;
{ ( " x (x³ 1 Ù x<k)-> t1[x]=t2[x] ) Ù (" x (x>=k Ù x<n)-> t1[x+1]=t2[x])}

En fait, on peut décomposer cette boucle en deux boucles, une pour recopier t[1..k-1] dans t2[1..k-1] et une autre pour recopier t[k+1..n] dans t2[k..n-1].
On écrit alors progr2 :


{t1[1..n] Ù t2[1..n-1] Ù n > 0 Ù 1£ k Ù k£ n} ;
   i:=0;
while (i¹ k-1)
         invariant : { INV1}
         variant :   { VAR1 }
do
   i := i+1;
   t2[i] := t1[i] ;
end;
{POST CONDITION 1} ;
i:=k ;
while (i¹ n)
        invariant : { INV2}
       variant : { VAR2 }
do
   t2[i] := t1[i+1] ;
   i := i+1;
end;
{ ( " x (x >= 1 Ù x < k)-> t1[x]=t2[x] ) Ù (" x (x >=k Ù x < n)-> t1[x+1]=t2[x])}


Q3.1 : Donnez les assertions INV1 , VAR1 , POST CONDITION 1 , INV2 et VAR2.

Q3.2 : Montrez la correction totale de la première boucle de progr2.



 


4-Java :

Q4.1 : Développer la méthode main de la classe Client, dont on trouvera le squelette ci-dessous.

Remarques : Cette méthode récupère une instance d'un service qui est conçu selon le "pattern proxy". La requête est donc soumise à un ProxyServeur qui teste l'autorisation du demandeur et appelle lui même le serveur.

Q4.2 : développer la classe ProxyServeur en conséquence.

Programme Java :


import java.util.*;
import java.io.*;

public class Client{
   public static void main(String[] args){
      //récupération du service et
      //appel de la requete avec passage de args[0] en paramètre
   }
}
abstract class Service{
   static Properties autorisation =new Properties();
   static {
      try{ autorisation.load(new FileInputStream("autorisation.txt"));}
      catch(Exception e){System.out.println(e.getMessage());}
   }
   static public Service getService(){
      return ProxyServeur.getService();
   }
   abstract public String requete(String identite)
      throws Exception;
   }

class ProxyServeur extends Service {
      //attributs éventuels
  static public Service getService(){
      // retourner un proxy-service
   }
   public String requete(String identite)
      throws Exception{
         //si identité "autorisé" alors
         //appeler la requête du serveur
      }
   }
class Serveur extends Service{
   public String requete(String identite){
      return "Hello "+ identite;
   }
}

La classe java.util.Properties est présentée ci-dessous. Comme on le voit dans le source ci-dessus, la table des autorisations est initialisée par un fichier dont voici un exemple:

Jean = autorisé

Paul = refusé

Appliquée à une table d'autorisation ainsi constituée, la méthode getProperty("jean") par exemple retournerait la valeur "autorisé".

Exemple d'utilisation de l'application :

> java Client Jean

      Hello Jean



 



c'est tout...