/* **************************************************************
        query module
**************************************************************** */

:- export trans/1, initquery/0, newpred/1.
:- import insertedlist/1, write_new_rules/0, parse_body/3 from parser2.
:- import inserting/1, deleting/1, deletelist/1, getlist/3 from basic_funs2.
:- import append/3 from basics.
:- import retract/1 from assert.

:- op(1180,fx,[trans]).

trans(X) :- 
	cleanup, cleanup_temp, !,
	parse_body(X,L,query),
	write_new_rules,
	assert((query :- L)), !,
	inserting(tr), call(L), deleting(tr).



% remove some useless rules from database
cleanup :- retract((query :- _)),
	   cleanup.
cleanup :-
	call(insertedlist(L)),
	cleanuplist(L).

cleanup_temp :-
	retract(templist(X)),
	assert(templist([])),
	retract(looplist(L)),
	assert(looplist([])),
	cleanup_templist(X),
	cleanup_looplist(L).

cleanup_templist([]).
cleanup_templist([Pred|Rest]) :-
	retract((Pred :- DBPred)), 
	retract((DBPred :- _)),
	!, 
	cleanup_templist(Rest)
	;
	cleanup_templist(Rest).	
cleanup_looplist([]).
cleanup_looplist([Loop|Rest]) :-
	retract((Loop :- _)),
	!, 
	cleanup_looplist([Loop|Rest])
	;
	cleanup_looplist(Rest).	

cleanuplist([]).
cleanuplist([DPred|L]) :-
	DPred =.. [DName|Args],
	name(DName,[_|Name]),
	append("i",Name,IList),
	name(IName,IList),
	IPred =.. [IName|Args],
	cleanpred(IPred,DPred),
	cleanuplist(L).

cleanpred(IPred,DPred) :-
	getlist(IPred,DPred,List), !,
	retractall(DPred),
	deletelist(List)
	;
	true.
	

newpred(DPred) :-	
	retract(insertedlist(L)),
	assert(insertedlist([DPred|L])).

