я начинаю изучать пролог (я использую 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...
То же самое должно быть допустимо для предиката объединения.
Как я уже сказал, мой код работает довольно хорошо, но, пожалуйста, предложите лучшие способы сделать это.
Спасибо