%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % clp(q,r) version 1.3.3 % % % % (c) Copyright 1992,1993,1994,1995 % % Austrian Research Institute for Artificial Intelligence (OFAI) % % Schottengasse 3 % % A-1010 Vienna, Austria % % % % File: ordering.pl % % Author: Christian Holzbaur christian@ai.univie.ac.at % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Collect ordering constraints % Produce an arrangement via toplogical sorting % % :- use_module( library(lists), [append/3]). :- use_module( library(ugraphs), [ top_sort/2, add_edges/3, add_vertices/3 ]). ordering( X) :- var(X), !, fail. ordering( A>B) :- !, ordering( B Res = [Xnorm|Xsn], normalize_vertices( Xs, Xsn) ; normalize_vertices( Xs, Res) ). % % get rid of nonvar vertices/edges, and turn V-[V] into V-[] % normalize_vertex( X, Nbs, X-Nbsss) :- var(X), sort( Nbs, Nbss), strip_nonvar( Nbss, X, Nbsss). strip_nonvar( [], _, []). strip_nonvar( [X|Xs], Y, Res) :- ( X==Y -> strip_nonvar( Xs, Y, Res) ; var(X) -> Res=[X|Stripped], strip_nonvar( Xs, Y, Stripped) ; nonvar(X), Res=[] % because Vars []. gen_edges( [X|Xs]) --> gen_edges( Xs, X), gen_edges( Xs). gen_edges( [], _) --> []. gen_edges( [Y|Ys], X) --> [ X-Y ], gen_edges( Ys, X). % % map k-La,k-Lb.... into k-LaLb % group( [], []). group( [K-Kl|Ks], Res) :- group( Ks, K, Kl, Res). group( [], K, Kl, [K-Kl]). group( [L-Ll|Ls], K, Kl, Res) :- ( K==L -> append( Kl, Ll, KLl), group( Ls, K, KLl, Res) ; Res = [K-Kl|Tail], group( Ls, L, Ll, Tail) ).