HI, it's me again. i'm gonna write the rules that i have wrote, and the
purpose of the rules and maybe you can give me some advices. it is my first
time using jess.
I have to calculate all the calls that a method has (i have to do this for
all methods). The calls are represented with the fact call(caller_id,
callee_id). The number of calls is store in the database as
fan-in_method(id_method,fan-in_metric).
After calculating the calls for a method i have to propagate this number to
all the relatives of the method being analyzed. I have defined the folowing
facts Inherits(child_id,father_id), implements(child_id,father_id). So with
this method and Method(id_method,name,class_id) i obtein the class that the
method belongs, after that i search all the relatives, and then propagate
the fan-in_mehtod. I don't know if it's clear, but i'm gonna post the rules,
i hope you can help me with this.
(import model.*)
(deftemplate Interface (declare (from-class Interface)))
(deftemplate Method (declare (from-class Method)))
(deftemplate Class (declare (from-class model.Class)))
(deftemplate Inherits (declare (from-class Inherits)))
(deftemplate Implements (declare (from-class Implements)))
(deftemplate Call (declare (from-class Call)))
(deftemplate call_counted
(slot caller_id)
(slot callee_id)
)
(deftemplate implements_counted
(slot class_id)
(slot Interface_id)
)
(deftemplate inherit_counted
(slot class_id)
(slot father_id)
)
(deftemplate fan-in_metric
"Fan-in of a Method."
(slot method_id)
(slot metric)
)
(deftemplate fan-in_metric_acum
"Fan-in acumulated of a Method. (the one that a method propagate to its
relatives)"
(slot method_id)
(slot metric)
)
(deftemplate final_fan-in_metric
"final fan-in of a method (fan-in + fan-in acum)"
(slot method_id)
(slot metric)
)
(deftemplate familiar
(slot elem)
(slot elem2)
)
(deftemplate father_counted
(slot elem)
(slot elem2)
(slot metodo)
)
(deftemplate son_counted
(slot elem)
(slot elem2)
(slot metodo)
)
(deftemplate calculado
(slot id)
)
(defrule init_fan-in_metric
(Method (id ?Method))
=>
(assert (fan-in_metric (method_id ?Method) (metric 0)))
(assert (fan-in_metric_acum (method_id ?Method) (metric 0)))
(assert (final_fan-in_metric (method_id ?Method) (metric 0)))
)
(defrule count_callers
?OldFanInMetric <- (fan-in_metric (method_id ?Method) (metric ?Metric))
(Call (caller_id ?Caller) (callee_id ?Method))
(not (call_counted (caller_id ?Caller) (callee_id ?Method)))
=>
(assert (call_counted (caller_id ?Caller) (callee_id ?Method)))
(bind ?NewMetric (+ ?Metric 1))
(retract ?OldFanInMetric)
(assert (fan-in_metric (method_id ?Method) (metric ?NewMetric)))
(assert (calculado (id ?Method)))
)
(defrule no_callers
(Method (id ?idMethod))
(not (Call (callee_id ?idMethod)))
=>
(assert (calculado(id ?idMethod)))
)
;defines the relatives of a methods (the next 6 methods)
(defrule assert_familiar_6
(Inherits (child_id ?X) (father_id ?Y))
=>
(assert (familiar(elem ?X)(elem2 ?Y)))
)
(defrule assert_familiar_7
(Implements (child_id ?X) (father_id ?Y))
=>
(assert (familiar(elem ?X)(elem2 ?Y)))
)
(defrule assert_familiar_1
(Inherits (child_id ?X) (father_id ?Y))
(Inherits (child_id ?Y) (father_id ?Z))
=>
(assert (familiar(elem ?X)(elem2 ?Z)))
)
(defrule assert_familiar_2
(Inherits (child_id ?X) (father_id ?Y))
(Implements (child_id ?Y) (father_id ?Z))
=>
(assert (familiar(elem ?X)(elem2 ?Z)))
)
(defrule assert_familiar_3
(Implements (child_id ?X) (father_id ?Y))
(Implements (child_id ?Y) (father_id ?Z))
=>
(assert (familiar(elem ?X)(elem2 ?Z)))
)
(defrule assert_familiar_4
(Inherits (child_id ?X) (father_id ?Y))
(familiar (elem ?Y) (elem2 ?Z))
=>
(assert (familiar(elem ?X)(elem2 ?Z)))
)
(defrule assert_familiar_5
(Inherits (child_id ?X) (father_id ?Y))
(familiar (elem ?Y) (elem2 ?Z))
=>
(assert (familiar(elem ?X)(elem2 ?Z)))
)
(defrule acum_fan-in_padres
(calculado (id ?Method))
(Method (id ?Method)(name ?MethodName)(class_id ?Class))
(fan-in_metric (method_id ?Method) (metric ?MethodMetric))
(familiar (elem ?Class) (elem2 ?Familiar))
(not (father_counted (elem ?Class) (elem2 ?Familiar)(metodo ?Method)))
(Method (id ?FamiliarMethod) (name ?MethodName)(class_id ?Familiar))
?OldFanInMetric <- (fan-in_metric_acum (method_id ?FamiliarMethod)
(metric ?FamiliarMethodMetric))
=>
(assert (father_counted (elem ?Class) (elem2 ?Familiar) (metodo
?Method))) ;se marca como contado.
(bind ?NewMetric (+ ?MethodMetric ?FamiliarMethodMetric))
(retract ?OldFanInMetric) ;se elimina el fan-in viejo.
(assert (fan-in_metric_acum (method_id ?FamiliarMethod) (metric
?NewMetric))) ;se agrega el fan-in nuevo.
)
(defrule acum_fan-in_hijos
(calculado (id ?Method))
(Method (id ?Method)(name ?MethodName)(class_id ?Class))
(fan-in_metric (method_id ?Method) (metric ?MethodMetric))
(familiar (elem ?Familiar) (elem2 ?Class))
(not (son_counted (elem ?Class) (elem2 ?Familiar)(metodo ?Method)))
(Method (id ?FamiliarMethod) (name ?MethodName)(class_id ?Familiar))
?OldFanInMetric <- (fan-in_metric_acum (method_id ?FamiliarMethod)
(metric ?FamiliarMethodMetric))
=>
(assert (son_counted (elem ?Class) (elem2 ?Familiar)(metodo ?Method)))
;se marca como contado.
(bind ?NewMetric (+ ?MethodMetric ?FamiliarMethodMetric))
(retract ?OldFanInMetric) ;se elimina el fan-in viejo.
(assert (fan-in_metric_acum (method_id ?FamiliarMethod) (metric
?NewMetric))) ;se agrega el fan-in nuevo.
)
(defrule final_fan-in
"calculates the final fina in fan-in + fan-in acum"
(Method (id ?Method))
(fan-in_metric(method_id ?Method) (metric ?OwnValue))
(fan-in_metric_acum (method_id ?Method) (metric ?AcumValue))
?OldFanInMetric <- (final_fan-in_metric (method_id ?Method) (metric ?))
=>
(bind ?NewValue (+ ?OwnValue ?AcumValue))
(modify ?OldFanInMetric (metric ?NewValue))
)