LRC - TME n 2

publicité
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
Téléchargement