JessTab:我们可以统计所有子类实例吗?

时间:2015-01-03 08:52:13

标签: protege jess

我有一个A类,它由两个子类B和C组成.B类有三个实例,而C两个。我可以编写一个JessTab规则来计算A的所有隐式实例,即给我5?

在Jess中映射A类:

(mapclass http...#A)

规则计算给出0的实例,因为没有A:

的直接实例

最初:

(defrule countAinstances 
?c <- (accumulate (bind ?count 0) 
(bind ?count (+ ?count 1)) 
?count 
(object (ís-a http...#A))
) 
=> 
(printout t ?c " number of class A instances." crlf))

这不计算A的子类实例。

修改版本:

(defrule countAinstances 
?c <- (accumulate (bind ?count 0) 
(bind ?count (+ ?count 1)) 
?count 
(object (OBJECT ?x&:(instanceof ?x http...#A)))
) 
=> 
(printout t ?c " number of class A instances." crlf))

出现以下错误:

  

Jess在执行时报告了例程instanceof中的错误   (instanceof?_20_x(0,2,-1)http ... #A)执行规则LHS(TEQ)时     执行规则LHS(TECT)时。消息:未找到类:   HTTP ...#A。程序文本:( defrule countAinstances?c&lt; - (   accumulate(bind?count 0)(bind?count(+?count 1))?count(   object(OBJECT?x&amp; :( instanceof?x http ... #A))))=&gt; (   打印输出t?c&#34; A类实例的数量。&#34; crlf))在第20行。

     

嵌套异常是:http ... #A

2 个答案:

答案 0 :(得分:1)

访问对象并依赖Jess&#39;自己的函数instanceof,而不是protege槽是-a:

(object (OBJECT ?x&:(instanceof ?x A))) 

如果未导入A,请使用完整的班级名称。

如果您没有Java类名,那么您必须使用(或)函数测试该模式中的所有类和子类。相当单调乏味。

<强>后来

看到这是一个包含可以与类名比较的类引用,这将是编写规则的最简单方法:

defrule countAinstances
?c <- (accumulate (bind ?count 0) 
(bind ?count (+ ?count 1)) 
?count 
(object (is-a ?x&B|C))
      )
=> 
(printout t ?c " number of subclass instances." crlf))

答案 1 :(得分:0)

完整的解决方案规则如下:

(defrule countAinstances
?c <- (accumulate (bind ?count 0) 
(bind ?count (+ ?count 1)) 
?count 
(object (is-a ?x&:(or (= ?x B)(= ?x C))))
)
=> 
(printout t ?c " number of subclass instances." crlf))