uv16472
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,[])
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
{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.
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