1

作为 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 中完成此操作?

谢谢

4

1 回答 1

1

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

除此之外,(SWI-)Prolog(大多数 Prolog,但不是全部)具有术语扩展,允许您在将读取的术语交给编译器之前重写它。那是用来重写的论点rdf/3:每一次出现都prefix:local被扩展为一个完整的原子。您可以通过使用listing/1前缀表示法调用 rdf/3 的谓词来检查这一点。

另见rdf_meta

于 2018-11-21T14:48:03.823 回答