%      Production system KORE/IE (version 12.48)
%
%          (C)1992 Institute for New Generation Computer Technology
%                          (Read COPYRIGHT for detailed information)
%
%      1992.7 Check and refine every programs 
%                             for IFS (ICOT Free Software) release.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% REMOVE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/*
# remove   --- remove fact from working memory
	USAGE:remove(Element).
	Elememnt ::= Designator or Time Tag
*/

%%%%% REMOVE/1 (At Top Level)
remove(Position) :-
	integer(Position),
	pp_wm,
	ppwm_collect(remove,WM),
	keysort(WM,PPWM),
	SEARCH =.. [search|PPWM],
	arg(Position,SEARCH,Element-Ppwm),
	Ppwm =.. [F|PPwm],
	RET =.. [F,Element|PPwm],
	retract(RET),
	!,
	remove_cs(Element),
	structure(_,F,FF,N,_,_),
	Call =.. [FF,-,=,Rule_Name,Rule_Base,VL,Instantiation,NUS,Element|PPwm],
	(call(Call),
	 ass(+,Rule_Base,Rule_Name,Instantiation,NUS,VL),
	 fail;
	 true),
	!.
remove(Element) :-
	number(Element),
	structure(_,F,FF,Arity,_,_),
	functor(RET,F,Arity),
	RET =.. [F,Element|WM],
	retract(RET),
	remove_cs(Element),
	Call =.. [FF,-,=,Rule_Name,Rule_Base,VL,Instantiation,NUS,Element|WM],
	(call(Call),
	 ass(+,Rule_Base,Rule_Name,Instantiation,NUS,VL),
	 fail;
	 true),
	!.

%%%%% REMOVE/4 (In Recognize-Act Cycle)
remove(F, FF, Arity, Element) :-
	number(Element),
	functor(RET,F,Arity),
	RET =.. [F,Element|WM],
	retract(RET),
	remove_cs(Element),
	Call =.. [FF,-,=,RN,RB,VL,Inst,NUS,Element|WM],
	(call(Call),
	 ass(+,RB,RN,Inst,NUS,VL),
	 fail;
	 true),
	!.
remove(_,_,_,_) :-
	!.

%%%%% remove_cs
remove_cs(Element) :-
	retract(cs(Rule_Base,CS)),
	remove_member(Element,CS,NCS),
	asserta(cs(Rule_Base,NCS)),
	fail.
remove_cs(_) :-
	!.

%%%%% remove_members
remove_members([H|T],Inst,R) :-
	remove_member(H,Inst,INST),
	!,
	remove_members(T,INST,R).
remove_members([],I,I) :-
	!.

%%%%% remove_member
remove_member(E,[[RL,ELS,SELS,NUS,VL]|T],R) :-
	mem(E,ELS),
	!,
	remove_member(E,T,R).
remove_member(E,[H|T],[H|R]) :-
	!,
	remove_member(E,T,R).
remove_member(_,[],[]) :-
	!.
