This module provides ordered sets. The ordered sets are
represented by lists [x_{1}, .., x_{n}]. The lists
must be ordered and duplicate free. If this precondition is
violated the behaviour of the predicates is undefined.

?- ord_union([2,3,4],[1,2,4,5],X).

X = [1,2,3,4,5]

?- ord_union([1,2,4,5],[2,3,4],X).

X = [1,2,3,4,5]

The realization uses a membership check based on (==)/2 and lexical ordering based on (@<)/2. As a result the predicates are safe to be used with non-ground terms. On the other hand, since this comparison is not arithmetical, 1 and 1.0 are for example considered different.

An unordered set can be converted into an ordered set by using the ISO predicate sort/2. Also there is no need for predicate permutation/2 here, since equality of ordered sets can be tested via the ISO predicate ==/2, provided the elements are sufficiently normalized.

The following ordered sets predicates are provided:

**ord_contains(E, O):**- The predicate succeeds when the set O contains the element E.
**ord_difference(O1, O2, O3):**- The predicate succeeds when O3 unifies with the difference of O1 by O2.
**ord_intersection(O1, O2, O3):**- The predicate succeeds when O3 unifies with the intersection of O1 and O2.
**ord_union(O1, O2, O3):**- The predicate succeeds when O3 unifies with the union of O1 and O2.
**ord_subset(O1, O2):**- The predicate succeeds when O1 is a subset of O2.