我有一个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
答案 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))