/*----------------------------------------------------------
UTILITIES
----------------------------------------------------------*/
%%% subsumes(+General, +Specific)
%%% =============================
%%%
%%% Holds if General subsumes Specific.
%%% Note that Quintus Prolog 3.x has a subsumes_chk/2 that
%%% could replace subsumes/2. The explicit implementation
%%% is left here to illustrate this standard Prolog idiom
%%% for subsumption testing.
subsumes(General, Specific) :-
\+ \+ ( make_ground(Specific),
General = Specific ).
%%% make_ground(Term)
%%% =================
%%%
%%% Instantiates all variables in Term to fresh constants.
make_ground(Term) :-
numbervars(Term, 0, _).
%%% all_solutions(Term, Goal, Solutions)
%%% ====================================
%%%
%%% Solutions is a list of instances of Term such that
%%% Goal holds. All free variables in Goal are taken to
%%% be existentially quantified. Solutions may be the
%%% empty list if there are no solutions.
%%% This implementation relies on the details of findall in
%%% Quintus Prolog. It could be reimplemented using the
%%% more standard built-in predicate setof/3 as follows:
%%%
%%% all_solutions(Var, Goal, Solutions) :-
%%% setof(Var, Goal^Goal, Solutions).
all_solutions(Var, Goal, Solutions) :-
findall(Var, Goal, Solutions).
%%% split(Elem, List, Rest)
%%% =======================
%%%
%%% List = U @ [Elem] @ V and Rest = U @ V.
split(Term, [Term|Rest], Rest).
split(Term, [First|Rest0], [First|Rest]) :-
split(Term, Rest0, Rest).