1

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

我有一个Animal包含 2 个子类Animal1Animal2. 我有一个属性eats和一个属性isEatenBy,它被定义为eats. 当我添加 Animal1它的子类的描述时eats some(Animal2),我希望推理器添加Animal2它的子类的描述,isEatenBy Animal1但事实并非如此。

知道我应该怎么做才能做到这一点,或者我所期望的无论如何都不应该发生?

4

1 回答 1

1

我认为这里有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)whereanimal1animal2are individual)时,推理器会推断出animal2 isEatenBy animal1.

(3) 类似的类isEatenBy some Animal1有时被称为匿名类,而像AnimalAnimal1的类Animal2则被称为命名类。因为通常可以从一组公理中做出的推论的数量是无限的,所以推理者将他们的推论限制在命名类中。

例如,对于您的eats属性,您可以将域定义为Animal1,将范围定义为Animal2。这意味着无论何时你有eats(x, y),个人x将被推断为类型Animal1和个人y将被推断为类型Animal2

为了现在也得到一个等价的推论isEatenBy some Animal1 SubClassOf Animal2,你需要引入一个新的类,说它AnimalsThatAreEatenByAnimal1等价于isEatenBy some Animal1。推理器现在将推断这AnimalsThatAreEatenByAnimal1是 的子类Animal2

一般来说,要理解推理者可以做出的推论,理解你定义的公理的语义至关重要。为此,您可以查看直接语义。有关逻辑的介绍,请参阅描述逻辑简介

于 2020-11-05T10:11:40.427 回答