bag_union(B1,B2,B) :- msort(B1, SortedB1), msort(B2, SortedB2), findall([X,N] ,( member([X,N1],SortedB1), member([X,N2],SortedB2), N is N1 + N2 ; member([X,N],SortedB1), \+ member([X,_],SortedB2) ; member([X,N],SortedB2), \+ member([X,_],SortedB1) ) ,B ).