从 RDF "type qualified literal" 转换为 SWI Prolog 中的 Prolog 原子

Convert from RDF "type qualified literal" to Prolog atom in SWI Prolog

"SWI-Prolog Semantic Web Library 3.0" 允许您像这样轻松地断言和查询 RDF 三元组:

- rdf_assert(number, is, 1).
true.

?- rdf(number, is, X).
X = 1^^'http://www.w3.org/2001/XMLSchema#integer'.

如何将 X 从 "type qualified literal" 格式(描述为 here)转换为标准 Prolog 原子:X = 1?

我找到了 xsdp_convert/3,但它需要类型 ('http://www.w3.org/2001/XMLSchema#integer') 和值 (1) 作为单独的参数传入。如何拆分 "type qualified literal" (1^^'http://www.w3.org/2001/XMLSchema#integer') 来执行此操作?

或者更好的是:value^^type 格式在 Prolog 中是否真的有意义并且允许更优雅的方式来实现它?

您可以使用统一,分解您得到的复合词,或访问它的参数:

?- use_module(library(semweb/rdf11)).
true.

?- rdf_assert(number, is, 1).
true.

?- rdf(number, is, N^^URI).
N = 1,
URI = 'http://www.w3.org/2001/XMLSchema#integer'.

?- rdf(number, is, X), X =.. List.
X = 1^^'http://www.w3.org/2001/XMLSchema#integer',
List = [^^, 1, 'http://www.w3.org/2001/XMLSchema#integer'].

?- rdf(number, is, X), arg(1, X, N).
X = 1^^'http://www.w3.org/2001/XMLSchema#integer',
N = 1.

我认为我们可以(应该?)通过提供的接口使用标准前缀,而不是对它们进行硬编码。所以...

?- rdf(S,P,O^^xsd:integer).
S = number,
P =  (is),
O = 1.

?- rdf(S,P,O),rdf_equal(O,N^^xsd:integer).
S = number,
P =  (is),
O = 1^^'http://www.w3.org/2001/XMLSchema#integer',
N = 1.

SWI-Prolog 追求效率,我们应该使用提供的接口,因为 rdf_prefixes 从术语重写基础设施中得到特殊处理,即在 compiling/loading 源文件时处理文字。

请记住:我们可以定义自己的应用域前缀,以享受与标准定义前缀相同的待遇。