:- export ':='/2.
:- export bulk_ins/2, bulk_del/1.
:- export init_keyappl/0, incr_counter/2.

:- import separate_key_val/4, keyed/3, declare/1 from keys_basics4.
:- import ins/1, createpreds/2 from tr_basics4.
:- import bulkdel/1, bulkins/2, move/2, copy/2 from tr_appl4.
:- import inserting/1, deleting/1 from basic_funs4.
:- import length/2, append/3 from basics.

:- op(450,fx,[ins_key,del_key]).
:- op(900,xfy,[':=']).

init_keyappl :- 
	declare(key(counter/1,0)),
	ins(counter(1)).

bulk_ins(FromPred,ToPred) :-
	bulkins(FromPred,ToPred).

bulk_del(Pred) :-
	bulkdel(Pred).

% assign FromP to ToPred, note that ToPred should have been declared.
%
':='(ToPred,TestPred) :-
	ToPred =.. [Name|Args],
	Temp =.. [temp|Args],
	length(Args,NArgs),
	keyed(Name,NArgs,NKeys),
	NVal is NArgs-NKeys,
	createpreds(NVal,Vals),
	separate_key_val(Args,NKeys,Keys,_),
	append(Keys,Vals,DupArgs),
	DupPred =.. [temp|DupArgs],
	deleting(tr),
	copy((TestPred,not(DupPred)),Temp),
	retractall(OutPred),
	move(Temp,OutPred),
	inserting(tr).

incr_counter(N,Delta) :-
	retract(counter(N)),
	M is N + Delta,
	assert(counter(M)).

