如何定义RDF列表的子类(是的,它必须是RDF列表),以反映对方法签名的参数列表的数据类型的限制?
给出方法签名:
void set(uint, string);
ABox语句如下所示:
# syntax: Turtle
("42"^^xsd:unsignedInt "Doug") a :SetCallArgumentList .
# syntax: Turtle
:SetCallArgumentList
rdfs:subClassOf a owl:Class ;
owl:intersectionOf (
rdf:List
[
a owl:Restriction ;
owl:onProperty rdf:first ;
owl:cardinality "1"^^xsd:nonNegativeInteger ;
owl:allValuesFrom xsd:unsignedInt ; # 1st parameter: uint
]
[
a owl:Restriction ;
owl:onProperty rdf:rest ;
owl:cardinality "1"^^xsd:nonNegativeInteger ;
owl:allValuesFrom [
a owl:Class ;
owl:intersectionOf rdf:List, [
a owl:Restriction ;
owl:onProperty rdf:first ;
owl:cardinality "1"^^xsd:nonNegativeInteger ;
owl:allValuesFrom xsd:string ; # 2nd parameter: string
], [
a owl:Restriction ;
owl:onProperty rdf:rest ;
owl:cardinality "1"^^xsd:nonNegativeInteger ;
owl:hasValue rdf:nil ; # end-of-list
] ;
] ;
] ;
) .
我在这里所做的工作是否存在任何危险,冗余或疏忽?欢迎任何评论。
答案 0 :(得分:1)
假设我们有一个类C
和一个方法f(p1:P1, p2:P2):R
,这意味着f
是一个采用p1
和P1
类型的参数p2
的方法类型P2
的对象返回类型R
的对象。类型P1
,P2
和R
可以是数据类型或类。
基本思想是引入一个类,该类将使用具体化来表示您的方法及其签名。因此,我们引入了一个类Method_f
,它具有属性r_f
,r_f_inv
,r_p1
,r_p2
和r_R
。 r_f
。 r_f
是对象属性,其r_f_inv
取反。根据{{1}},r_p1
和r_p2
是类还是数据类型,r_R
,P1
和P2
将是对象属性或数据属性。即如果R
是类P1
将是对象属性,如果它是数据类型,则r_p1
将是数据属性。在整个过程中,我将使用对象属性。
(1)类r_p1
必须表示一个元组(在这种情况下,由4个组件组成),为此我们添加了以下公理:
Method_f
(2)为确保为类Class: Method_f
SubClassOf:
r_f_inv exactly 1 Thing and
r_p1 exactly 1 Thing and
r_p2 exactly 1 Thing and
r_R exactly 1 Thing
的给定实例提供参数C
和p1
的给定值的方法不会返回不同的结果,我们为类{ {1}}以下密钥:
p2
对于不返回任何内容的方法,该键将被省略。
(3)为确保参数和返回值具有正确的类型,添加了以下公理:
Method_f
(4)为确保类 Haskey:
r_f_inv, r_p1, r_p2
的实例可以调用方法ObjectProperty: r_p1
Domain: Method_f
Range: P1
ObjectProperty: r_p2
Domain: Method_f
Range: P2
ObjectProperty: r_R
Domain: Method_f
Range: R
,我们添加了公理:
C
要表示正在调用的方法f
,我们必须:
(1)具有Class: C
SubClassOf:
r_f some Method_f
,f
,C
和P1
的实例,例如P2
,R
,{{1} },c
。
(2)具有p1
的实例:
p2
(3)调用它。
r
有关此问题的详细说明,请参见我的dissertation的第5章。