【问题标题】:What modules does an unqualified assert add a term to?不合格的断言会在哪些模块中添加术语?
【发布时间】:2020-08-14 08:23:57
【问题描述】:
?- assertz(:- module(foo1, [f/1])).
true.

?- foo1:assertz(f(1)).
true.

?- foo1:f(1).
true.

?- foo2:f(1).
Correct to: "foo1:f(1)"? no
ERROR: Undefined procedure: foo2:f/1
ERROR: In:
ERROR:    [8] foo2:f(1)
ERROR:    [7] <user>

对我来说很有意义。但是后来(从头开始)....

?- assertz(:- module(foo1, [f/1])).
true.

?- assertz(f(1)).
true.

?- foo1:f(1).
true.

?- foo2:f(1).
true.    # Wait, what? foo2 doesn't appear in my program. Should fail?

?- frobnoz:f(1).
true.    # Also odd!

然后……

?- foo2:assertz(f(1)).
true.

?- foo2:f(1).
true.

?- frobnoz:f(1).
ERROR: Undefined procedure: frobnoz:f/1

当我没有提到foo2 时,f 如何被添加到foo2。 为什么frobnoz:f在第二个例子中成功,而在第三个例子中失败了?

什么是模块?我以为它们是命名空间,但现在很困惑。

【问题讨论】:

    标签: module swi-prolog meta-predicate


    【解决方案1】:

    第一个问题:

    如果我不提 foo2,f 是如何添加到 foo2 中的。

    来自SWI-Prolog Manual - Module autoload section

    SWI-Prolog 默认支持从其标准库自动加载。自动加载意味着当在执行过程中发现谓词丢失时,将搜索库并使用 use_module/2 延迟导入谓词。

    你可以去deeper 但是,基本上,当模块没有明确定义时,prolog 搜索它并静默加载它。这是默认行为。您可以使用autoload flag 更改它。

    第二个问题:

    为什么 frobnoz:f 在第二个示例中成功,而在第三个示例中失败?

    可能这个frobnoz:f 可以作为foo1 模块的依赖项找到,您在第三个示例中没有引用它。

    第三个问题:

    什么是模块?我以为它们是命名空间,但现在很困惑。

    正如SWI-Prolog Reference Manual 所说:

    Prolog 模块是谓词的集合,它通过一组提供的谓词和运算符定义公共接口。 Prolog 模块由 ISO 标准定义。不幸的是,该标准被认为是失败的,据我们所知,它没有被任何具体的 Prolog 实现所实现。 SWI-Prolog 模块系统语法源自 Quintus Prolog 模块系统。 Quintus 模块系统已成为 SICStus、Ciao 和 YAP 等多个主流 Prolog 系统的模块系统的起点。 SWI-Prolog 模块系统的底层原语与上述系统不同。这些原语允许文件中的多个模块、分层模块、模拟其他模块接口等 (source)

    在经典的 Prolog 系统中,所有谓词都组织在一个命名空间中,任何谓词都可以调用任何谓词。 [...] Prolog 模块封装了一组谓词并定义了一个接口。模块可以导入其他模块,这使得依赖关系明确。给定明确的依赖关系和定义良好的接口,在不破坏整个应用程序的情况下更改模块的内部组织变得更加容易。 (source)

    通常,模块的名称与定义它的文件的名称相同,没有文件扩展名,但不强制执行此命名。模块被组织在一个单一的平面命名空间中,因此必须小心选择模块名称以避免冲突。正如我们将看到的,模块系统的典型应用很少在源文本中明确使用模块的名称。 (source)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多