我是门生的新手,所以我有一个非常基本的问题。我有Child
和Parent
的课程。 Child
有子类Girl
。
child1
的类型是Girl
,child2
是Child
和anna
,peter
有Parent
的类型。此外,还有没有进一步特征的anna isParentOf child1
和peter isParentOf child2
关系。
现在我想定义类ParentOfGirl
,使其等效于 Parent and isParentOf only Girl
。我希望推理者推断anna
具有这种新类型,但事实并非如此。
我将 Inverse functional
属性添加到isParentOf
,因为父级可以有多个孩子。如果我在关系中也添加Symmetric
,我得到anna
具有类型 ParentOfGirl
,但我不想让isParentOf
对称。
如果我不对称地查看上述语义,我会看到:
ParentOfGirl ≡ {anna, peter} ⋂ { x ∊ owl:Thing | if ∀y (x, y( ∊ isParentOf then y ∊ Girl}
儿童1 ∊ 儿童和儿童1 ∊ 女孩
isParentOf ≡ {(anna, child1(, (peter, child2(}
那么child1
是唯一与anna
有关的Child
型个体,它也具有Girl
型。在我看来,在这种情况下,推理者只能从右到左查看关系,因为如果isParentOf
是对称的,它会推断出anna
.此外,我希望如果peter
与孩子无关,也会ParentOfGirl
2。但这也不会发生。
为什么推理者(Pellet或HermiT(看不到anna
是ParentOfGirl
?
中的@AKSW是正确的。推理者无法判断父母是否只有女孩。您需要断言此功能,例如,通过向个人添加类型。
不过,在这种情况下,此断言等效于您寻求的推论 - 因此这不是一个非常好的解决方法。
如果您将forall更改为某些,您将能够找到至少一个女孩的父母。这是目标类的超类,可能有助于应用程序。