Prolog BST
insert(X, nil, node(X, nil, nil)).
insert(X, node(T, L, G), node(T, Aux, G)) - X T, !, insert(X, L, Aux).
insert(X, node(T, L, G), node(T, L, Aux)) - insert(X, G, Aux).
remove(X, node(T, L, G), node(T, Aux, G)) - X T, !, remove(X, L, Aux).
remove(X, node(T, L, G), node(T, L, Aux)) - X T, !, remove(X, G, Aux).
remove(X, node(X, L, nil), L) - !.
remove(X, node(X, nil, G), G) - !.
remove(X, node(X, L, G), node(M, L, Aux)) - remove_min(G, Aux, M).
remove_min(node(T, nil, R), R, T) - !.
remove_min(node(T, L, G), node(T, Aux, G), M) - remove_min(L, Aux, M).
build([X Xs], T, R) - insert(X, T, Aux), build(Xs, Aux, R).
build([], T, T).