% ----------------------------------------------------------------------
% -- the compilation predicates for dlv

lp2dlv(Name) :-
        lp2pl(Name),
        pl2dlv(Name).
vlp2dlv(Name) :-
        vlp2pl(Name),
        pl2dlv(Name).

pl2dlv(Name) :-
        concatenate(Name,'.pl',FilePL),
        concatenate(Name,'.dlv',FileDLV),
        read_clauses(FilePL,Clauses),
%                     get_flag(variable_names, Mode),
%                     set_flag(variable_names, on),
        apply_to_conjuncts(Clauses,   idb_rule,         IDBClauses   ),
        apply_to_conjuncts(IDBClauses,replace_variables,PrettyClauses),
        conjoin( (true, (:- false)) ,PrettyClauses,ClausesDLV),
                      write_program('DLV Program',ClausesDLV),
        write_clauses(FileDLV,ClausesDLV).
%                     set_flag(variable_names, Mode).

% ----------------------------------------------------------------------
% -- calling dlv from within prolog

dlv(Name) :-
        dlv(Name,'').
dlv(Name,nice) :-
	concatenate(Name,'.pl',File),
	read_clauses(File,Program),
	dlv_options(Program,Options),
	dlv(Name,Options).
dlv(Name,Options) :-
        concatenate(Name,'.dlv',FileDLV),
	concatenate('dlv ',Options,CMD0),
	concatenate(CMD0,' ',CMD),
	concatenate(CMD,FileDLV,CALL),
	write('Calling ':CALL),nl,write('--'),
	system(CALL).

dlv_options(Program, Options) :-
	predicates(Program, Preds),
	dlv_options1(Preds, Options).

dlv_options1([[P,N]|Preds],Options) :-
        (builtin(P,N)
        ; P=name
        ; P=sname
        ; P=prec ; P=neg_prec
        ; P=in   ; P=neg_in
	),
	!,
        dlv_options1(Preds,Options).
dlv_options1([[P,_]|Preds],Options) :-
	name(P,L),
	append(_,[49],L),
	!,
       dlv_options1(Preds,Options).
% dlv_options1([[P,_]|Preds],Options) :-
%        negative_functor(P),
%	!,
%        dlv_options1(Preds,Options).
dlv_options1([[P,_]|Preds],Options) :-
%	atom_string(P,PS),
        concatenate(' -filter=',P,Option),
        dlv_options1(Preds,Options1),
	concatenate(Options1,Option,Options).
dlv_options1([],'').

% ----------------------------------------------------------------------
% This is to make dlv happy

idb_rule( (Head :- Body) , (Head :- Body) ).
idb_rule( name(X)        , name(X)        ).
% idb_rule( in(X,Y)        , in(X,Y)        ).  % THIS IS PATCHED IN prefS.pl
idb_rule(  Fact          , (Fact :- true) ) :-
	Fact \= ( _ :- _ ),
	writeln_verbosely('IDBing (for dlv) ':Fact).

