【问题标题】:Prolog dependencies: include vs ensure_loadedProlog 依赖项:include vs ensure_loaded
【发布时间】:2016-11-05 15:36:29
【问题描述】:

我正在用 prolog 编写一个程序。我有 3 个文件:Class.pl、main.pl、utilities.pl。

类.pl:

:- include('utilities.pl').

main.pl:

:- include('utilities.pl').
:- include('Class.pl').

当我编译 main.pl 时,我收到警告“...的子句不在一起”。

但是,如果我用 ensure_loaded 切换包含,它不会再给我警告。我假设这与循环依赖和utilities.pl 中的谓词被重写有关?在 C++ 中,ensure_loaded 是否像 #pragma once 一样工作?

但我也读过某个地方 include 实际上包含代码,而 ensure_loaded 只参考它?

如果有人能为我解决问题并让我知道我应该做什么,我将非常感激:)

【问题讨论】:

    标签: prolog


    【解决方案1】:

    大致而言,指令include/1 表示#includeensure_loaded/1 表示带有包含保护的#include。因此#include-once。嗯,大概吧。

    您收到警告是因为 utilities.pl 包含两次。

    以下是标准 ISO/IEC 13211-1:1995 中的相关部分:

    7.4.2.7include/1

    如果F 是实现定义的基本术语指定
    Prolog 文本单元,然后是 Prolog 文本 P1,其中包含
    一个指令 include(F) 与通过以下方式获得的 Prolog 文本 P2
    相同 用 Prolog 文本替换 P1 中的指令 include(F)F表示。

    7.4.2.8ensure_loaded/1

    ...

    当多个指令 ensure_loaded(P_text) 存在时
    Prolog 文本,即 Prolog 文本包含在
    Prolog 文本中 只准备执行一次。
    位置 包括的是实现定义。

    当前的 Prolog 系统要求包含的文本是有效的 Prolog 文本。所以它不会留下任何子句或/*-cmets。因此,文本包含并没有完全按照字面意思理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多