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