% Dianhuan -- 24 Sep 2010 -- no 'no_change' state
% both Substrate and Enzyme Limiting are considered -- no assumptions(all possibilities are considered)
% indirect mapping from reaction to EC via enzymes's ecClass -- via the predicate 'catalyzed_by_ECclass'
% terminology -- activated=catalytically increased, inhibited=catalytically decreased



catalyzed_by_ECclass(ReactionID,EC_Number):-
	setof(EC_Num,
		EnzID^(catalyzed_by(ReactionID,EnzID,'IMPD'),
		part_of_catalyzing_class(EnzID,EnzClassID,'IMPD'),
		concept_accession(EnzClassID,'EC',EC_Num,false)),
	EC_Nums),
	member(EC_Number,EC_Nums).


%enzyme_state(EC_Number,no_change):- \+enzyme_state(EC_Number,inhibited).

concentration(X,Change,VisitedNodes):-	% using other examples
	length(VisitedNodes,K),K<3,
	ex(EI,concentration(X,Change),1),!,
	write('***using this example***'), writeq(EI-X), write(' and '), write(VisitedNodes),nl.
% won't be used in reasoning, but used in T for excluding those useless
concentration(X,Change,VisitedNodes):- 
	neg(Change,OppositeChange),
	ex(EI,concentration(X,OppositeChange),1),%write('!!! you are looking for sth inconsistent'),
	!,
	fail.




/****************** Direct Effect ******************/
/*---------- Blocked/Slower down ----------*/
% 12,15,18 enzyme inhibited
concentration(PID,down,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number),
	enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write({EC_Number,inhibited}).


% enzyme inhibited
concentration(SID,up,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number),
	enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write(' weird if long effect'),write({EC_Number,inhibited}).



/*---------- Speeded Up ----------*/
% 10,13,16 enzyme activated
concentration(PID,up,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number),
	enzyme_state(EC_Number,activated),portray_clause(VisitedNodes),write({EC_Number,activated}).


% enzyme activated
concentration(SID,down,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number),
	enzyme_state(EC_Number,activated),portray_clause(VisitedNodes),write(' weird if long effect'),write({EC_Number,activated}).


/****************** Indirect Effect ******************/
% enzyme no_change -- S up
concentration(PID,up,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number), 
	%\+concentration_enzClass(EC_Number,Change),
	enzyme_state(EC_Number,no_change),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,up,[SID|VisitedNodes]).

% enzyme no_change -- S down
concentration(PID,down,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	catalyzed_by_ECclass(ReactionID,EC_Number),
	%\+concentration_enzClass(EC_Number,Change),
	enzyme_state(EC_Number,no_change),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,down,[SID|VisitedNodes]).



/************ Integrity Constraint **************/
integrityConstraint:-
enzyme_state(EC_Number,State1),enzyme_state(EC_Number,State2),State1\==State2. %,write('Integrity Constraint is Disobeyed'),nl.


/****************** Simple direct rules ******************/
%This integrity constraint can be put into top theory directly.
/* this can be transform into integrity constraint 
enzyme_state(EC_Number,activated):- concentration_enzClass(EC_Number,up).
enzyme_state(EC_Number,no_change):- concentration_enzClass(EC_Number,no_change).
enzyme_state(EC_Number,inhibited):- concentration_enzClass(EC_Number,down).
*/



