#!/usr/bin/pl -G16M -L32M -q -t main -f

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% 
%%%% Some Preprocessing For KRH
%%%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

:- use_module('../contrib/pl/swilib/pretty').
:- use_module('../contrib/pl/swilib/fromonto').
:- use_module(rrtrafo).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

:- op(500, fx, #).

preprocess_argv :-
	current_prolog_flag(argv, Argv), 
	append(_, [--|Args], Argv),
	!,
	( memberchk('-rr', Args) ->
		(memberchk('-ehyper', Args) ->
			Mode = ehyper
		  ; Mode = rr)
	  ; (memberchk('-ehyper', Args) ->
			Mode = ehyper
		  ; Mode = standard)
	),
	( memberchk('-fixed_dom', Args) ->
	  FixedDom = true
	; FixedDom = false
	),
	( memberchk('-input_dom', Args) ->
	  InputDom = true
	; InputDom = false
	),
	Options = [mode=Mode, fixed_dom=FixedDom, input_dom=InputDom],
	get_regular_arg(Args, InputFile),
	preprocess_file(Options, InputFile).

main :-
	fix_ops,
        catch(preprocess_argv, E, (print_message(error, E), fail)),
        halt.                                           
main :-
        halt(1).

get_regular_arg(Args, Arg) :-
	member(Arg, Args),
	\+ sub_atom(Arg, 0, 1, _, '-'),
	!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

preprocess_file(Options, File) :-
	msg1('Reading...'),
	file_clauses(File, Cs),
	length(Cs, Len),
	msg1('~d clauses.', [Len]),
	domain_restrict_clauses(Cs, Options, Cs1),
	msg1('Writing...'),
	( member(C, Cs1),
	  write_term(C, [quoted(true),ignore_ops(true),portray(true)]),	    
	  writeln('.'),  
	  % pp_clause(C),
	  fail
	; true
	),
	msg1('Done.').

file_clauses(File, Clauses) :-
	from_file(findall(T,
			  ( repeat,
			    read(T),
			    ( T == end_of_file ->
				!,
		              fail
			    ; true
			    )
			  ),
			  Clauses),
		  File).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

msg1(Msg) :-
	msg1(Msg, []).
msg1(Msg, Args) :-
	write(user_error, '% Pre: '),
	format(user_error, Msg, Args),
	nl(user_error),
	flush_output(user_error).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%  
%%%% SWI-prolog prints operators >= 1000 in brackets (also if
%%%% ignore_ops is true). portray is used here to patch this.
%%%%  
fix_ops :-
	findall(O, (current_op(P,_,O), P >= 1000), Os),
	sort(Os, Os1),
	( member(O1, Os1),
	  asserta(portray(O1) :- write_term(O1, [quoted(true)])),
	  fail
	; true
	).
	
