[FONDEMENTS DE L’IA] 2023/2024
TP3 : LES LISTES
1) Définir le prédicat longueur(L,N), qui étant donnée la liste L calcule sa longueur N.
longeur ([], 0).
longeur ([_|T], N) :- longeur (T, N1), N is N1 + 1.
2) Définir le prédicat concat(L1,L2,L3) où L3 est le résultat de la concaténation de L1 et L2
(sans utiliser append).
concat([],L,L).
concat([H|T],L,[H|Tr]) :- concat(T,L,Tr).
3) Définir le prédicat palindrome(L) qui retourne vrai si la liste L est sa propre image
renversée.
palindrome([]).
palindrome([_]).
palindrome([X|Xs]):-append(Xs1,[X],Xs), palindrome(Xs1).
4) Définir un prédicat rang_pair(X,Y) qui extrait les éléments de la liste X qui ont des
indices de rang pair afin de construire la liste Y.
Ex. rang_pair([a,b,c,d,e],L). -> L=[b,d]
rang_pair([],[]).
rang_pair([_],[]).
rang_pair([_,Y|L],[Y|L2]) :- rang_pair(L,L2).
5) Définir le prédicat indice(X,L,N), qui étant donné un élément X et une liste L, X
appartenant à L, calcule N l’indice de la première occurrence de X dans L.
Peut-on utiliser ce prédicat pour formuler une requête permettant de calculer le ième
élément d’une liste ?
ISSATM 1
[FONDEMENTS DE L’IA] 2023/2024
indice(X,[X|_],1).
indice(X,[Y|L],N) :- X\==Y, indice(X,L,Nm1), N is Nm1+1.
/* pour trouver le ieme element d'une liste :
?- indice(X,[a,b,c,d,e],3).
X = c */
6) Écrire le prédicat remplace(X1,X2,L1,L2) qui construit la liste L2 qui est la liste L1 dans
laquelle X1 est remplacé par X2.
remplace(_,_,[],[]).
remplace(X,Y,[X|L1],[Y|L2]) :- remplace(X,Y,L1,L2).
remplace(X,Y,[Z|L1],[Z|L2]) :- Z \== X, remplace(X,Y,L1,L2).
7) Définir le prédicat partage(L,X,L1,L2), qui étant donnés une liste de nombre L et un
nombre X, calcule la liste L1 des nombres de L inférieurs à X, et la liste L2 des nombres
de L supérieurs ou égaux à X.
partage([],_,[],[]).
partage([Y|L],X,[Y|L1],L2) :- Y<X, partage(L,X,L1,L2).
partage([Y|L],X,L1,[Y|L2]) :- Y>=X, partage(L,X,L1,L2).
ISSATM 2