1/***************************************************************************** 2 * This file is part of the Prolog Development Tool (PDT) 3 * 4 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start 5 * Mail: pdt@lists.iai.uni-bonn.de 6 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn 7 * 8 * All rights reserved. This program is made available under the terms 9 * of the Eclipse Public License v1.0 which accompanies this distribution, 10 * and is available at http://www.eclipse.org/legal/epl-v10.html 11 * 12 ****************************************************************************/ 13 14:- module(edge_counter,[count_call_edges_between_predicates/0, 15 call_edges_for_predicates/3]). 16 17:- ensure_loaded('../pdt_factbase'). 18 19%:- dynamic call_edges_for_predicates/3. %call_edges_for_predicates(SourceID,TargetID,Counter) 20%count_call_edges_between_predicates:- 21% retractall(call_edges_for_predicates(_,_,_)), 22% forall( call_edge(TargetId, SourceLiteralId), 23% ( ( literalT(SourceLiteralId,_,SourceRule,_,_,_), 24% pred_edge(SourceRule,SourceId) 25% ) 26% -> inc_call_edges_for_predicates(SourceId,TargetId) 27% ; ( predicateT(TargetId,_,TFunctor,TArity,TModule), 28% format('Problem with call-edge: ~w -> ~w (~w:~w/~w)~n',[SourceLiteralId, TargetId, TModule, TFunctor, TArity]) 29% ) 30% ) 31% ). 32% 33%inc_call_edges_for_predicates(SourceID,TargetID):- 34% call_edges_for_predicates(SourceID,TargetID,Counter), 35% retract(call_edges_for_predicates(SourceID,TargetID,Counter)), 36% New_Counter is (Counter + 1), 37% assert(call_edges_for_predicates(SourceID,TargetID,New_Counter)). 38%inc_call_edges_for_predicates(SourceID,TargetID):- 39% assert(call_edges_for_predicates(SourceID,TargetID,1)). 40 41:- use_module(pdt_common_pl('callgraph/pdt_call_graph')). 42 43count_call_edges_between_predicates :- 44 ensure_call_graph_generated. 45 46call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :- 47 var(CallerId), 48 var(CalleeId), 49 !, 50 calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls), 51 predicateT(CallerId, _, CallerName, CallerArity, CallerModule), 52 predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule). 53call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :- 54 var(CallerId), 55 nonvar(CalleeId), 56 !, 57 predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule), 58 calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls), 59 predicateT(CallerId, _, CallerName, CallerArity, CallerModule). 60call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :- 61 nonvar(CallerId), 62 var(CalleeId), 63 !, 64 predicateT(CallerId, _, CallerName, CallerArity, CallerModule), 65 calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls), 66 predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule). 67call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :- 68% nonvar(CallerId), 69% nonvar(CalleeId), 70% !, 71 predicateT(CallerId, _, CallerName, CallerArity, CallerModule), 72 predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule), 73 calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls)