UPMC Année 2014-2015 LRC - TME n◦ 2 m1 androide m1 dac Opérateur is Au-delà de ses capacités de raisonnement logique, prolog permet d’effectuer des calculs numériques, par l’opérateur is. Il faut souligner que l’évaluation de cet opérateur ne passe pas par le principe de l’inférence par résolution et sort du cadre purement logique de prolog. L’instruction ?- X is Exp. unifie la variable à gauche de is à la valeur numérique résultat de l’expression de droite. L’opérateur is impose que toutes les variables qui apparaissent dans Exp soient liées, il n’est pas commutatif. Exercice 1 – Arithmétique de base 1. Définir le prédicat numérique factorielle/2 tel que factorielle(N,R) est satisfait si, N étant un entier, R est sa factorielle. Ainsi, factorielle(5, R) doit fournir pour seule unification R = 120. 2. Définir un prédicat longueur/2 tel que longueur(L,N) est satisfait si, L étant une liste, N est sa longueur. NB il existe le prédicat prédéfini length, il vous est demandé ici de le reprogrammer, et donc de ne pas l’utiliser. Quelle est la différence entre longueur et length ? Exercice 2 – Liste d’entiers 1. Définir le prédicat entierListe(N, L) qui est satisfait si L est la liste des chiffres constituant N. Ainsi entierListe(1023,L). doit conduire à l’unique instanciation L = [1, 0, 2, 3]. Il faut pour cela utiliser les opérateurs mathématiques // et mod qui calculent respectivement le quotient et le reste de la division entière. 2. Définir le prédicat listeEntiersCroissant(I,J,L) qui est satisfait si L est la liste des entiers successifs de I à J (donnés) dans l’ordre croissant. Ainsi listeEntiersCroissant2(-1,2,L). doit conduire à l’unique instanciation L = [-1, 0, 1, 2]. La requête listeEntiersCroissant2(4,2,L). doit échouer. 3. Définir le prédicat max(N,L) qui calcule le maximum des nombres de la liste L. Exercice 3 – Listes imbriquées Écrire un prédicat plusLongueListe/2 telle que plusLongueListe(L1,L2) est satisfait si L2 est la listes des sous-listes de taille maximale de la liste de listes L1. ?- longestList([[1],[1,2],[1,2,3],[1,2,3,4]],LI). LI = [[1, 2, 3, 4]] ; No ?- longestList([[a,b,c],[d,e],[f,g,h]],LI). LI = [[f, g, h],[a,b,c]]; No Exercice 4 – Polynômes On peut représenter un polynôme par la liste de ses coefficients, le premier terme de la liste correspondant au terme constant, le second au coefficient du terme en x, etc. Ainsi 2 + 5x + x3 + 6x4 est représenté par la liste [2,5,0,1,6]. 1 1. Écrire un prédicat degre/2 tel que degre(+P,?R) est satisfait si, P étant un polynôme, R est son degré. 2. Écrire un prédicat racines/2 tel que racines(+P, ?L) est satisfait si, P étant un polynôme de degré 2, L est la liste de ses racines. Une racine doit être représentée selon les cas comme un nombre ou comme un liste à deux éléments, représentant sa partie réelle et sa partie imaginaire . Si P n’est pas de degré 2, le prédicat doit répondre false, sans faire appel au prédicat degre. Ainsi ?- racines([1, 2, 3, 4], L). false. ?- racines([1, 2, 1], L). L = [-1]. ?- racines([1, 3, 1], L). L = [-2.618033988749895, -0.3819660112501051]. ?- racines([2, 1, 2], L). L = [[-0.25, -0.9682458365518543], [-0.25, 0.9682458365518543]].} 3. Écrire un prédicat somme/3 tel que somme(+P1, +P2, ?P) est satisfait si P est la somme des deux polynômes P1 et P2. Attention, les deux polynômes à sommer ne sont pas nécessairement de même degré. 4. Écrire un prédicat eval/3 tel que eval(+P,+Val,?Res) est satisfait si Res est la valeur du polynôme en x =Val. N.B. L’opérateur de puissance, qui s’écrit ** en prolog, n’est pas nécessaire ici : une implémentation efficace en temps de calcul ne l’utilise pas. 5. Écrire un prédicat affiche/1 qui affiche le polynôme sous une forme sympathique : les termes de coefficient nul ne doivent pas être affichés, le coefficient 1 ne doit pas être affiché, les coefficients négatifs ne doivent pas être précédés du signe +. Ainsi, ?- affiche([1, 0, 1, -4]). 1+x^2-4x^3 N.B. Il faut utiliser le prédicat write/1 qui affiche son argument (comme is, ce n’est pas un prédicat logique). 6. Écrire un prédicat derive/2 tel que derive(+P,?Pderive) est satisfait si la liste Pderive contient les coefficients associés au polynôme dérivé du polynôme représenté par P. Exercice 5 – Polynômes, autre représentation Pour pouvoir représenter plus efficacement des polynômes de degré élevé ayant beaucoup de coefficients nuls, on considère qu’un polynôme est une liste de couples, chaque couple correspondant à un coefficient et l’exposant de x auquel il correspond. Par exemple [[1,3],[2,6],[5,18]] représente x3 + 2x6 + 5x18 . Réécrire dans ce cas les prédicats de l’exercice 2 (sauf le prédicat racine), en supposant que, dans la liste, les couples sont ordonnés selon les exposants, et en conservant cette propriété. 2