% compared to b_noCycle0.pl, this one removes those about no_change
% both Substrate and Enzyme Limiting -- no conditions to guide the road
% indirect mapping from reaction to EC via enzymes's ecClass
% terminology -- catINcreased, catDEcreased


% catalyzed_by_ECclass -- move to network/a.pl

queriedE(concentration(MID,Change,Time),concentration(MID,Change,Time,[MID])).

/*
concentration(X,Change,Time,VisitedNodes):-	% using other examples
	%write('try to use old'),
	ex(EI,concentration(X,Change,Time),1),!.
%,write('-=-=-=-=-=-=-=-=-old do exit-----------------'),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,Time,VisitedNodes):- 
	length(VisitedNodes,K),K>1,
	threeStatesOpposite(Change,Opp1,Opp2),
	ex(EI,concentration(X,Measured,Time),1),
	(Measured=Opp1;Measured=Opp2),
	%write('!!! this metabolite is measured to be '), write({X,Measured}),nl,
	!,
	fail.




/****************** Direct Effect ******************/
/*---------- Blocked/Slower down ----------*/
% 12,15,18 enzyme inhibited
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+((consumed_by(SID,ReactionID,'IMPD'),member(SID,VisitedNodes))),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write({EC_Number,inhibited}).


% enzyme inhibited
concentration(SID,up,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+((produced_by(PID,ReactionID,'IMPD'),member(PID,VisitedNodes))),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%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,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+((consumed_by(SID,ReactionID,'IMPD'),member(SID,VisitedNodes))),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


% enzyme activated
concentration(SID,down,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+((produced_by(PID,ReactionID,'IMPD'),member(PID,VisitedNodes))),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


/*---------- No change----------*/
concentration(PID,no_change,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).	


concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).

concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+produced_by(SID,ReactionID_Any,'IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).


/****************** Indirect Effect -- Substrate Limiting ******************/

% S up
concentration(PID,up,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sUp,Time),
	consumed_by(SID,ReactionID,'IMPD'),
	\+ubiqutousCompound(SID),
	\+member(SID,VisitedNodes),
	concentration(SID,up,Time,[SID|VisitedNodes]).

% S down
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sDown,Time), 
	consumed_by(SID,ReactionID,'IMPD'),
	\+ubiqutousCompound(SID),
	\+member(SID,VisitedNodes),
	concentration(SID,down,Time,[SID|VisitedNodes]).





/************ Integrity Constraint **************/
integrityConstraint:-
	reaction_state0(ReactionID,LimitingType1,Change1,Time),reaction_state0(ReactionID,LimitingType2,Change2,Time),
	Change1\==Change2,LimitingType1\==LimitingType2,write('-----------------------reaction_state Integrity Constraint violated'). % this include the case that their limiting types are different.

integrityConstraint:-
	metConcentration(SID,Change1,Time),metConcentration(SID,Change2,Time), 
	Change1\==Change2,write('-----------------------metabolite constraint violated').



reaction_state(ReactionID,LimitingType,Change,Time):-
	reaction_state0(ReactionID,LimitingType0,Change0,Time),!,
	LimitingType==LimitingType0,Change==Change0.  

closedWorldAssumption((reaction_state(RID,substrateLimiting,HypothesizedState,Time):-member(0,[0]))). % this means, if it is not hypothesised. member(0,[0]) is to add another depth



