Пересечение и объединение двух списков

я начинаю изучать пролог (я использую SWI-пролог), и я сделал простое упражнение, в котором у меня есть 2 списка, и я хочу вычислить их пересечение и объединение . Вот мой код, который работает довольно хорошо, но я спрашивал себя, есть ли лучший способ сделать это, поскольку я не люблю использовать оператор CUT.

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).

Имейте в виду, что я хочу получить только 1 результат, а не несколько результатов (даже если они правильные), поэтому запуск кода с этим:

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

должен завершиться с:

[1,2]
true.

а не с

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

То же самое должно быть допустимо для предиката объединения.
Как я уже сказал, мой код работает довольно хорошо, но, пожалуйста, предложите лучшие способы сделать это.
Спасибо

6
задан false 24 November 2013 в 12:55
поделиться