% library(ord_lists)

list_to_ord_set( List, Set ) :-
	list_to_set( List, Set ).

% ord_add_elem( OrdSet, Elem, OrdSet1 ).
% this assumes ordered SETS ie dont add element if 
% it exists but succeed all the same...
% maybe this can be implemented as a tree ?
% 
ord_add_element( [], Elem, [Elem] ).
ord_add_element( [H|T], Elem, [H1|T1] ) :-
	( H @>= Elem -> 
		( H = Elem -> 
			H1 = H, T1 = T
			;
			H1 = Elem, T1 = [H|T]
		)
		;
		H1 = H,
		ord_add_element( T, Elem, T1 )
	).
% ord_add_element( List, Elem, NewList ) :-
% 	merge_set( [Elem], List, NewList ).

ord_member( Elem, [H|T] ) :-
	Elem @> H,
	!,
	ord_member( Elem, T ).
ord_member( Elem, [Elem|_T] ).


ord_del_element( List, Elem, NewList ) :-
	subtract( List, [Elem], NewList ).

ord_intersection( Set1, Set2, Set3 ) :-
	intersection( Set1, Set2, Set3 ).

ord_intersection( Set1, Set2, Intersection, Difference ) :-
	intersection( Set1, Set2, Intersection ),
	subtract( Set2, Set1, Difference ).

ord_union( Set1, Set2, Set3 ) :-
	merge_set( Set1, Set2, Set3 ).
	% union( Set1, Set2, Set3 ).
	% swi union/3 requires no duplicated but no
	% order