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

:- export trans/1.
:- import write_new_rules/0, parse_body/3 from parser1.
:- import retract/1 from assert.
:- import keyed/3 from keys_basics1.
:- import bulk_del/1 from keys_appl1.
:- import inserting/1, deleting/1 from basic_funs1.


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

trans(X) :- 
	cleanup, !,
	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(deleted(X)),
	retract(inserted(X)),
	cleanup.
cleanup :- retract((query :- _)),
	   cleanup.
cleanup :-
	retract(templist(TList)),
	retract(looplist(LList)),
	assert(looplist([])),
	assert(templist([])),
	clean_templist(TList),
	clean_looplist(LList).

clean_templist([]).
clean_templist([Temp|Rest]) :-
	retract((Temp :- _)),
	functor(Temp,Name,NArgs),
	retract(keyed(Name,NArgs,_)),
	clean_templist(Rest).

clean_looplist([]).
clean_looplist([Pred|Rest]) :-
	remove_all(Pred),
	clean_looplist(Rest).

remove_all(Pred) :-
	retract((Pred :- _)), !,
	remove_all(Pred)
	;
	true.


