问题描述
我正在使用protege5-5和推理机hermit 1.4 3.456。
我有一个类Animal
,其中包含2个子类Animal1
和Animal2
。我有一个属性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)
,其中animal1
和animal2
是个体时,推理者将推断出animal2 isEatenBy animal1
。 / p>
(3)有时将诸如isEatenBy some Animal1
的类称为匿名类,而将诸如Animal
,Animal1
和Animal2
的类称为命名类。因为通常可以从一组公理中进行推理的次数是无限的,所以推理程序将其推理限于命名类。
例如,对于您的eats
属性,您可以将域定义为Animal1
,将范围定义为Animal2
。这意味着只要您拥有eats(x,y)
,就将推断个人x
的类型为Animal1
,而推断个人y
的类型为Animal2
。
现在也要获得一个等效于isEatenBy some Animal1 SubClassOf Animal2
的推论,您需要引入一个新的类,例如AnimalsThatAreEatenByAnimal1
,它等效于isEatenBy some Animal1
。现在,推理机将推断AnimalsThatAreEatenByAnimal1
是Animal2
的子类。
通常,要理解推理者可以做出的推论,理解您定义的公理的语义至关重要。为此,您可以查看direct semantics。有关逻辑的介绍,请参见An Introduction to Description Logics。