Tp 3 les listes - intelligence artificielle ai - prolog - t

Intelligence Artificielle AI - Prolog : TP 3 Les Listes

Télécharger PDF

Les Listes en Prolog avec SWI-Prolog

Prolog permet de définir et manipuler des listes d'éléments de même type. Une variable de type liste peut être gérée dynamiquement pour effectuer diverses opérations : affichage, ajout, suppression, etc. Deux syntaxes principales existent pour représenter une liste.

Syntaxe 1 : Notation d'une constante liste

La syntaxe est la suivante : [e1, e2, ..., en], où les ei sont les éléments de la liste. Voici quelques exemples :

  • Liste vide : L1 = []
  • Liste de caractères : L2 = ['a', 'b', 'c']
  • Liste de chaînes de caractères : L3 = [ali, driss, hamid]
  • Liste de listes : L4 = [ [ali, driss], [petit, grand], [blond] ]
  • Liste d'objets composés (exemple : liste de voitures) : L5 = [voiture("Peugeot 406", "blanche"), voiture("Renault 19", "rouge")]

Syntaxe 2 : Écriture récursive d'une liste

Une liste peut être écrite sous la forme récursive : [e | Q], où e est l'élément en tête de la liste et Q est le reste des éléments. Exemple : [rouge | [vert, bleu]].

Manipulations récursives de base

Affichage des éléments d'une liste

Prédicat : afficher(L), où L est une liste.

afficher([]).
afficher([X | L]) :- write(X), nl, afficher(L).

Exemple : ?- afficher([rouge, vert, bleu]).

Recherche d'un élément dans une liste

Prédicat : appartient(X, L), où X est l'élément à chercher dans la liste L.

appartient(X, [X | _]).
appartient(X, [_ | L]) :- appartient(X, L).

Exemple : ?- appartient(vert, [rouge, vert, bleu]).

Insertion en tête

Prédicat : empiler(X, L1, L2), où X est l'élément à insérer en tête de la liste L1.

empiler(X, L, [X | L]).

Exemple : ?- empiler(jaune, [rouge, vert, bleu], L).

Suppression de la tête

Prédicat : dépiler(L1, L2), où L1 est la liste initiale et L2 est la liste sans le premier élément.

dépiler([], []).
dépiler([_ | L], L).

Exemple : ?- dépiler([rouge, vert, bleu], L).

Insertion en queue

Prédicat : enfiler(X, L1, L2), où X est l'élément à insérer en queue de la liste L1.

enfiler(X, [], [X]).
enfiler(X, [Y | L1], [Y | L2]) :- enfiler(X, L1, L2).

Exemple : ?- enfiler(jaune, [rouge, vert, bleu], L).

Suppression de la queue

Prédicat : défiler(L1, L2), où L1 est la liste initiale et L2 est la liste sans le dernier élément.

défiler([_], []).
défiler([X | L1], [X | L2]) :- défiler(L1, L2).

Exemple : ?- défiler([rouge, vert, bleu], L).

Exercices sur les listes

Exercice 1 : Prédicats de base sur les listes

Définir les prédicats suivants :

  1. vide(L) : Teste si la liste L est vide.
  2. concat(L1, L2, L3) : Concatène les listes L1 et L2 pour obtenir L3 (sans utiliser append).
  3. longueur(L, N) : Calcule la longueur N de la liste L.
  4. indice(X, L, N) : Calcule l'indice N de la première occurrence de X dans L. Peut-on utiliser ce prédicat pour trouver le ième élément d'une liste ?
  5. remplace(X1, X2, L1, L2) : Remplace toutes les occurrences de X1 par X2 dans la liste L1 pour obtenir L2.
  6. inserPos(X, P, L1, L2) : Insère l'élément X à la position P dans la liste L1 pour obtenir L2.
  7. inverser(L1, L2) : Inverse la liste L1 pour obtenir L2.
  8. dernierElem(L, X) : Trouve le dernier élément X de la liste L.
  9. saisirListe(L, N) : Construit une liste L à partir de N éléments saisis au clavier. Deux versions sont demandées : insertion dans l'ordre et insertion en sens inverse.
  10. nbOccur(X, L, N) : Calcule le nombre d'occurrences N de l'élément X dans la liste L.
  11. supprimerAllOccur(X, L1, L2) : Supprime toutes les occurrences de X dans la liste L1 pour obtenir L2.
  12. supprimerPos(X, P, L1, L2) : Supprime l'élément X à la position P dans la liste L1 pour obtenir L2.
  13. rechercherPos(X, L, P) : Trouve la position P de l'élément X dans la liste L.
  14. partage(L, X, L1, L2) : Divise la liste L en deux listes : L1 contient les éléments inférieurs à X, et L2 contient les éléments supérieurs ou égaux à X.

Exercice 2 : Tri des listes

Version 1 : Tri par sélection

  1. minimum(L, X) : Calcule le minimum X de la liste L.
  2. enleve(X, L1, L2) : Construit la liste L2 en supprimant la première occurrence de X de L1.
  3. tri_min(L, Lt) : Trie la liste L par sélection pour obtenir Lt.
  4. fusion(L1, L2, L3) : Fusionne deux listes triées L1 et L2 pour obtenir L3.

Version 2 : Tri à bulles

  1. bulle(L1, L2) : Construit la liste L2 en remontant le plus petit élément en première position dans L1.
  2. tribulle(L1, L2) : Implémente le tri à bulles pour obtenir L2.

FAQ

1. Comment tester si une liste est vide en Prolog ?

Utilisez le prédicat vide(L) en vérifiant si L est égal à [].

2. Peut-on trouver le ième élément d'une liste avec le prédicat indice ?

Non, le prédicat indice calcule la position de la première occurrence d'un élément. Pour trouver le ième élément, il faut utiliser une approche différente.

3. Quelle est la différence entre empiler et enfiler ?

empiler ajoute un élément au début de la liste, tandis que enfiler ajoute un élément à la fin de la liste.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne