Intersection et l'union de 2 listes

je suis le démarrage de l'apprentissage prologue (j'utilise SWI-prolog) et j'ai fait un simple exercice dans lequel j'ai 2 listes et je veux calculer leur intersection et d'union.
Voici mon code qui fonctionne assez bien, mais je me demandais si il ya une meilleure façon de le faire, car je n'aime pas utiliser le COUPE de l'opérateur.

intersectionTR(_, [], []).
intersectionTR([], _, []).
intersectionTR([H1|T1], L2, [H1|L]):-
    member(H1, L2),
    intersectionTR(T1, L2, L), !.
intersectionTR([_|T1], L2, L):-
    intersectionTR(T1, L2, L).

intersection(L1, L2):-
    intersectionTR(L1, L2, L),
    write(L).


unionTR([], [], []).
unionTR([], [H2|T2], [H2|L]):-
    intersectionTR(T2, L, Res),
    Res = [],
    unionTR([], T2, L),
    !.
unionTR([], [_|T2], L):-
    unionTR([], T2, L),
    !.

unionTR([H1|T1], L2, L):-
    intersectionTR([H1], L, Res),
    Res \= [],
    unionTR(T1, L2, L).
unionTR([H1|T1], L2, [H1|L]):-
    unionTR(T1, L2, L).

union(L1, L2):-
    unionTR(L1, L2, L),
    write(L).

Gardez à l'esprit que je veux avoir juste 1 résultat, pas de résultats multiples (même si elle est correcte) si l'exécution du code avec ceci:

?- intersect([1,3,5,2,4] ,[6,1,2]).

devrait quitter avec:

[1,2]
true.

et pas avec

[1,2]
true ;
[1,2]
true ;
etc...

La même chose doit être valable pour l'union prédicat.
Comme je l'ai dit, mon code fonctionne assez bien mais s'il vous plaît suggérer de meilleures façons de le faire.
Grâce

OriginalL'auteur andreapier | 2012-03-08