Examen de Programmation Logique Programmation logique

publicité
Examen de Programmation Logique
Tous documents papiers autorisés sauf les livres et photocopies de livres.
Nous nous proposons de réaliser, en programmation logique, des prédicats
pour manipuler des formules de la logique propositionnelle (ou de l'algèbre
booléenne).
Programmation logique
Valuation
Nous dénissons une valuation comme un couple de symbole de fonction valuation/2 avec pour premier argument une liste de constantes (au
sens de Prolog) que nous appelerons symboles propositionnels, et pour second argument une liste de valeurs de vérité codées v et f ; les deux listes
doivent être de même taille puisque la valuation est le codage d'une fonction. Exemple : Le terme valuation([a,b,c],[v,f,v]) code la fonction
{a 7→ v, b 7→ f, c 7→ v}.
1. Dénir le prédicat 'valuation_ ?'/1 qui est tel que 'valuation_ ?'(V)
est vrai si V est une valuation (c-à-d. que les deux listes sont de même
longueur et que la seconde liste ne contient que des v ou des f).
2. Modier le prédicat précédent en vériant en plus que tous les symboles
propositionnels soient distincts.
3. Dénir le prédicat value/3 qui est tel que value(V, X, VX) est vrai
si VX est la valeur de vérité associée à X dans la valuation V. Exemple :
| ?- value(valuation([a,b,c],[v,f,v]),b,f).
true
4. Dénir le prédicat gen_valuation/2 qui est tel que gen_valuation(N,
VVV) est vrai si VVV est la liste des permutations de longueur N sur v et
f (N peut-être, à votre convenance, un entier au sens de Prolog ou un
entier de Péano). Exemple (Attention au cas d'arrêt !) :
| ?- gen_valuation(2, [[v,v],[v,f],[f,v],[f,f]]).
true
1
Formule
Une formule est construite sur les symboles propositionnels et les symboles 1, 0, neg/1 et et/2.
5. Dénir le prédicat sp/2 qui est tel que sp(F,L) est vrai si L est la liste
des symboles propositionnels de la formule F. (L'ordre des éléments
dans la liste L est sans importance.) Exemple :
| ?- sp(et(neg(a),et(b,1)),[a,b]).
true
6. Dénir le prédicat 'formule_ ?'/2 qui est tel que 'formule_ ?'(F,
V) est vrai si le terme F est une formule dont tous les symboles propositionnels sont dans la valuation V. Exemple :
| ?- 'formule_?'(et(neg(a),et(b,1)),valuation([a,b,c],[v,f,v])).
true
Interprétation
Une fonction d'interprétation est une fonction qui associe à une formule
une valeur de vérité (l'interprétation de la formule) selon une valuation. L'interprétation d'un symbole propositionnel est sa valeur de vérité qui lui est
associée dans la valuation. (L'interprétation des symboles constituant la formule est standard : l'interprétation de 1 est v ; l'interprétation de 0 est f ;
l'interprétation de neg(g) est v si l'interprétation de g est f et l'interprétation de neg(g) est f si l'interprétation de g est v ; l'interprétation de et(g,h)
est v si l'interprétation de g est v et de h est v et l'interprétation de et(g,h)
est f si l'interprétation de g est f ou de h est f). Un modèle pour une formule
est une valuation qui est telle que l'interprétation de cette formule est vraie.
7. Dénir le prédicat 'i_*'/3 qui est tel que 'i_*'(F, V, IF) est vrai
si IF est l'interprétation de la formule F selon la valuation V. Exemple :
| ?- 'i_*'(et(neg(a),et(b,1)),valuation([a,b,c],[v,f,v]),B).
B = f ? ;
no
8. Dénir, grâce au prédicat gen_valuation, le prédicat calcul_modele/2
de calcul d'un modèle qui est tel que calcul_modele(F,M) est vrai si
M est un modèle de la formule F. Exemple :
| ?- calcul_modele(et(neg(a),et(b,1)),M).
M = valuation([a,b],[f,v]) ? ;
2
no
9. Dénir le prédicat calcul_modeleS/2 de calcul de tous les modèles
qui est tel que calcul_modeleS(F,MMM) est vrai si MMM est la liste de
tous les modèles de la formule F.
| ?- calcul_modeleS(et(neg(a),et(b,1)),MMM).
MMM = [valuation([a,b],[f,v])] ? ;
no
10. Proposer un typage pour l'ensemble des prédicats dénis.
Prolog
11. Employer un prédicat ensembliste pour répondre à la question 9.
3
Téléchargement