Pour un précédent thread, j'avais écrit un prédicat "nettoie" qui permettait de nettoyer une liste des éléments multiples de celle-ci:
Pour ce faire j'ai trouvé deux méthodes, l'une construisant la liste au fur et à mesure en utilisant un accumulateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 nettoie([1,2,1,5,3,5], L). ==> L = [1,2,5,3].L'autre construisant la liste en retour de récursion :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 nettoie1([], L, L). nettoie1([X|L1], L2, L3) :- memberchk(X, L2), !, nettoie1(L1, L2, L3). nettoie1([X | L1], L2, L3) :- nettoie1(L1, [X | L2], L3).Quelle est celle qui est le plus dans l'esprit Prolog ? Personnellement je penche pour la méthode 2 mais elle me paraît moins "efficace" que la méthode 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 nettoie2([], []). nettoie2([X | L1], L2) :- nettoie2(L1, L2), memberchk(X, L2), !. nettoie2([X | L1], [X | L2]) :- nettoie2(L1, L2).
Partager