Protege推理程序不推断属性逆的子类

问题描述

我正在使用protege5-5和推理机hermit 1.4 3.456。

我有一个Animal,其中包含2个子类Animal1Animal2我有一个属性eats一个属性isEatenBy,它被定义为eats的反函数。当我在Animal1的描述中添加它是eats some(Animal2)的子类时,我希望推理者在Animal2的描述中添加它是isEatenBy Animal1的子类,但它没有

有什么主意我该怎么做才能使它发生,或者如果我所期望的无论如何都不会发生?

解决方法

我认为这里有3个问题。

(1)陈述Animal1 SubClassOf eats some Animal2仅声明Animal1集的个体的一个子集,即eats至少有1个人属于Animal2的集合。最多可以推断出Animal2吞噬了Animal1的某些个体。那就是isEatenBy some Animal1 SubClassOf Animal2。在(3)中,我将解释为什么您没有得到这个推论。

最重要的是,它不能推断Animal2所有个人被Animal1吃掉了,这就是推断Animal2 SubClassOf isEatenBy some Animal1所需要的。

(2)逆角色对个人提出主张。因此,当您有关于特定个体的陈述,例如eats(animal1,animal2),其中animal1animal2是个体时,推理者将推断出animal2 isEatenBy animal1。 / p>

(3)有时将诸如isEatenBy some Animal1的类称为匿名类,而将诸如AnimalAnimal1Animal2的类称为命名类。因为通常可以从一组公理中进行推理的次数是无限的,所以推理程序将其推理限于命名类。

例如,对于您的eats属性,您可以将域定义为Animal1,将范围定义为Animal2。这意味着只要您拥有eats(x,y),就将推断个人x的类型为Animal1,而推断个人y的类型为Animal2

现在也要获得一个等效于isEatenBy some Animal1 SubClassOf Animal2的推论,您需要引入一个新的类,例如AnimalsThatAreEatenByAnimal1,它等效于isEatenBy some Animal1。现在,推理机将推断AnimalsThatAreEatenByAnimal1Animal2的子类。

通常,要理解推理者可以做出的推论,理解您定义的公理的语义至关重要。为此,您可以查看direct semantics。有关逻辑的介绍,请参见An Introduction to Description Logics

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...