%% %% %% predicates for manipulating support relationships %% %% pfcAddSupport(+Fact,+Support) pfcAddSupport(P,(Fact,Trigger)) :- assert(support1(P,Fact,Trigger)), assert(support2(Fact,Trigger,P)), assert(support3(Trigger,P,Fact)). pfcGetSupport(P,(Fact,Trigger)) :- nonvar(P) -> support1(P,Fact,Trigger) ; nonvar(Fact) -> support2(Fact,Trigger,P) ; nonvar(Trigger) -> support3(Trigger,P,Fact) ; otherwise -> support1(P,Fact,Trigger). % There are three of these to try to efficiently handle the cases % where some of the arguments are not bound but at least one is. pfcRemSupport(P,(Fact,Trigger)) :- nonvar(P), !, pfcRetractOrWarn(support1(P,Fact,Trigger)), pfcRetractOrWarn(support2(Fact,Trigger,P)), pfcRetractOrWarn(support3(Trigger,P,Fact)). pfcRemSupport(P,(Fact,Trigger)) :- nonvar(Fact), !, pfcRetractOrWarn(support2(Fact,Trigger,P)), pfcRetractOrWarn(support1(P,Fact,Trigger)), pfcRetractOrWarn(support3(Trigger,P,Fact)). pfcRemSupport(P,(Fact,Trigger)) :- pfcRetractOrWarn(support3(Trigger,P,Fact)), pfcRetractOrWarn(support1(P,Fact,Trigger)), pfcRetractOrWarn(support2(Fact,Trigger,P)). pfc_collect_supports(Tripples) :- bagof(Tripple, pfc_support_relation(Tripple), Tripples), !. pfc_collect_supports([]). pfc_support_relation((P,F,T)) :- support1(P,F,T). pfc_make_supports((P,S1,S2)) :- pfcAddSupport(P,(S1,S2),_), (pfcAdd(P); true), !. %% pfcTriggerKey(+Trigger,-Key) %% %% Arg1 is a trigger. Key is the best term to index it on. pfcTriggerKey(pt(Key,_),Key). pfcTriggerKey(pt(Key,_,_),Key). pfcTriggerKey(nt(Key,_,_),Key). pfcTriggerKey(Key,Key). %%^L %% Get a key from the trigger that will be used as the first argument of %% the trigger base clause that stores the trigger. %% pfc_trigger_key(X,X) :- var(X), !. pfc_trigger_key(chart(word(W),_L),W) :- !. pfc_trigger_key(chart(stem([Char1|_Rest]),_L),Char1) :- !. pfc_trigger_key(chart(Concept,_L),Concept) :- !. pfc_trigger_key(X,X).