我认为这里有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)
whereanimal1
和animal2
are individual)时,推理器会推断出animal2 isEatenBy animal1
.
(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
。
一般来说,要理解推理者可以做出的推论,理解你定义的公理的语义至关重要。为此,您可以查看直接语义。有关逻辑的介绍,请参阅描述逻辑简介。