% File : pfcdebug.pl % Author : Tim Finin, finin@prc.unisys.com % Author : Dave Matuszek, dave@prc.unisys.com % Updated: % Purpose: provides predicates for examining the database and debugginh % for Pfc. :- dynamic pfcTraced/1. :- dynamic pfcSpied/2. :- dynamic pfcTraceExecution/0. :- dynamic pfcWarnings/1. :- pfcDefault(pfcWarnings(_), pfcWarnings(true)). %% predicates to examine the state of pfc pfcQueue :- listing(pfcQueue/1). pfcPrintDB :- pfcPrintFacts, pfcPrintRules, pfcPrintTriggers, pfcPrintSupports. %% pfcPrintFacts ... pfcPrintFacts :- pfcPrintFacts(_,true). pfcPrintFacts(Pattern) :- pfcPrintFacts(Pattern,true). pfcPrintFacts(P,C) :- pfcFacts(P,C,L), pfcClassifyFacts(L,User,Pfc,_Rule), format("~n~nUser added facts:",[]), pfcPrintitems(User), format("~n~nPfc added facts:",[]), pfcPrintitems(Pfc). %% printitems clobbers it's arguments - beware! pfcPrintitems([]). pfcPrintitems([H|T]) :- numbervars(H,0,_), format("~n ~w",[H]), pfcPrintitems(T). pfcClassifyFacts([],[],[],[]). pfcClassifyFacts([H|T],User,Pfc,[H|Rule]) :- pfcType(H,rule), !, pfcClassifyFacts(T,User,Pfc,Rule). pfcClassifyFacts([H|T],[H|User],Pfc,Rule) :- pfcGetSupport(H,(user,user)), !, pfcClassifyFacts(T,User,Pfc,Rule). pfcClassifyFacts([H|T],User,[H|Pfc],Rule) :- pfcClassifyFacts(T,User,Pfc,Rule). pfcPrintRules :- bagof((P=>Q),clause((P=>Q),true),R1), pfcPrintitems(R1), bagof((P<=>Q),clause((P<=>Q),true),R2), pfcPrintitems(R2), bagof((P<=Q),clause((P<=Q),true),R3), pfcPrintitems(R3). pfcPrintTriggers :- format("Positive triggers...~n",[]), bagof(pt(T,B),pfcGetTrigger(pt(T,B)),Pts), pfcPrintitems(Pts), format("Negative triggers...~n",[]), bagof(nt(A,B,C),pfcGetTrigger(nt(A,B,C)),Nts), pfcPrintitems(Nts), format("Goal triggers...~n",[]), bagof(bt(A,B),pfcGetTrigger(bt(A,B)),Bts), pfcPrintitems(Bts). pfcPrintSupports :- % temporary hack. setof((S > P), pfcGetSupport(P,S),L), pfcPrintitems(L). %% pfcFact(P) is true if fact P was asserted into the database via add. pfcFact(P) :- pfcFact(P,true). %% pfcFact(P,C) is true if fact P was asserted into the database via %% add and contdition C is satisfied. For example, we might do: %% %% pfcFact(X,pfcUserFact(X)) %% pfcFact(P,C) :- pfcGetSupport(P,_), pfcType(P,fact), call(C). %% pfcFacts(-ListofPfcFacts) returns a list of facts added. pfcFacts(L) :- pfcFacts(_,true,L). pfcFacts(P,L) :- pfcFacts(P,true,L). %% pfcFacts(Pattern,Condition,-ListofPfcFacts) returns a list of facts added. pfcFacts(P,C,L) :- setof(P,pfcFact(P,C),L). brake(X) :- X, break. %% %% %% predicates providing a simple tracing facility %% pfcTraceAdd(P) :- % this is here for upward compat. - should go away eventually. pfcTraceAdd(P,(o,o)). pfcTraceAdd(pt(_,_),_) :- % hack for now - never trace triggers. !. pfcTraceAdd(nt(_,_),_) :- % hack for now - never trace triggers. !. pfcTraceAdd(P,S) :- pfcTraceAddPrint(P,S), pfcTraceBreak(P,S). pfcTraceAddPrint(P,S) :- pfcTraced(P), !, copy_term(P,Pcopy), numbervars(Pcopy,0,_), (S=(user,user) -> format("~nAdding (u) ~w",[Pcopy]) ; format("~nAdding ~w",[Pcopy])). pfcTraceAddPrint(_,_). pfcTraceBreak(P,_S) :- pfcSpied(P,add) -> (copy_term(P,Pcopy), numbervars(Pcopy,0,_), format("~nBreaking on add(~w)",[Pcopy]), break) ; true. pfcTraceRem(pt(_,_)) :- % hack for now - never trace triggers. !. pfcTraceRem(nt(_,_)) :- % hack for now - never trace triggers. !. pfcTraceRem(P) :- (pfcTraced(P) -> format('~nRemoving ~w.',[P]) ; true), (pfcSpied(P,rem) -> (format("~nBreaking on rem(~w)",[P]), break) ; true). pfcTrace :- pfcTrace(_). pfcTrace(Form) :- assert(pfcTraced(Form)). pfcTrace(Form,Condition) :- assert((pfcTraced(Form) :- Condition)). pfcSpy(Form) :- pfcSpy(Form,[add,rem],true). pfcSpy(Form,Modes) :- pfcSpy(Form,Modes,true). pfcSpy(Form,[add,rem],Condition) :- !, pfcSpy1(Form,add,Condition), pfcSpy1(Form,rem,Condition). pfcSpy(Form,Mode,Condition) :- pfcSpy1(Form,Mode,Condition). pfcSpy1(Form,Mode,Condition) :- assert((pfcSpied(Form,Mode) :- Condition)). pfcNospy :- pfcNospy(_,_,_). pfcNospy(Form) :- pfcNospy(Form,_,_). pfcNospy(Form,Mode,Condition) :- clause(pfcSpied(Form,Mode), Condition, Ref), erase(Ref), fail. pfcNospy(_,_,_). pfcNoTrace :- pfcUntrace. pfcUntrace :- pfcUntrace(_). pfcUntrace(Form) :- retractall(pfcTraced(Form)). % needed: pfcTraceRule(Name) ... % if the correct flag is set, trace exection of Pfc pfc_trace_msg(Msg,Args) :- pfcTraceExecution, !, format(user_output, Msg, Args). pfc_trace_msg(_Msg,_Args). pfcWatch :- assert(pfcTraceExecution). pfcNoWatch :- retractall(pfcTraceExecution). pfcError(Msg) :- pfcError(Msg,[]). pfcError(Msg,Args) :- format("~nERROR/Pfc: ",[]), format(Msg,Args). %% %% These control whether or not warnings are printed at all. %% pfcWarn. %% nopfcWarn. %% %% These print a warning message if the flag pfcWarnings is set. %% pfcWarn(+Message) %% pfcWarn(+Message,+ListOfArguments) %% pfcWarn :- retractall(pfcWarnings(_)), assert(pfcWarnings(true)). nopfcWarn :- retractall(pfcWarnings(_)), assert(pfcWarnings(false)). pfcWarn(Msg) :- pfcWarn(Msg,[]). pfcWarn(Msg,Args) :- pfcWarnings(true), !, format("~nWARNING/Pfc: ",[]), format(Msg,Args). pfcWarn(_,_). %% %% pfcWarnings/0 sets flag to cause pfc warning messages to print. %% pfcNoWarnings/0 sets flag to cause pfc warning messages not to print. %% pfcWarnings :- retractall(pfcWarnings(_)), assert(pfcWarnings(true)). pfcNoWarnings :- retractall(pfcWarnings(_)).