SWI-prolog semweb库处理URI

SWI-prolog semweb library processing of URI

作为 prolog 的新手,我正在阅读现有代码(以及尝试编写一些代码)。在 semweb 中有一些先前的背景,我开始使用它并看到一些让我感到困惑的东西。断言示例:

?- rdf_assert(ex:bob, rdf:type, foaf:'Person').

我还在文档中找到了以下内容:

Remember: Internally, all resources are atoms. The transformations
above are realised at compile-time using rules for goal_expansion/2
provided by the rdf_db library

我假设图书馆以某种方式将三个 URI 视为原子,我是否正确?我以为编译器会将其视为 module_name:predicate,但事实并非如此。如果这是真的,能否请您提供一个简单的示例,说明如何在序言中完成此操作?

谢谢

Prolog 不是函数式语言。这意味着 2+3 不会 评估为 5 并且只是一个从处理它的谓词中获得 含义 的术语.同样,ex:bob 只是一个与模块或模块没有直接关系的术语 谓词。只有 call/1 这样的谓词才会将其解释为 "call bob in the module ex".

除此之外,(SWI-)Prolog(大多数 Prolog,但不是全部)有 术语扩展 允许您重写在传递给之前读取的术语编译器。用于重写 rdf/3 的参数:prefix:local 的每次出现都扩展为一个完整的原子。您可以通过在使用前缀符号调用 rdf/3 的谓词上使用 listing/1 来检查。

另见 rdf_meta