Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
国际标准 IEC 13211-2-02 由 IEC 与 ISO 联合制定,其文本与 ISO/IEC 13211-2:2002 完全等同。该标准是 Prolog 编程语言标准化体系的关键组成部分,旨在为 Prolog 程序定义一套通用、语义自洽的模块系统。本文将从标准概况、核心技术内容、实施要点以及与其他标准的关系四个维度进行深入剖析。
IEC 13211-2-02 的全称为《信息技术 — 编程语言 — Prolog — 第 2 部分:模块》(Information technology — Programming languages — Prolog — Part 2: Modules)。该标准于 2002 年首次发布,由 ISO/IEC JTC 1/SC 22(编程语言及其环境分技术委员会)负责制定。其主要目标是为 Prolog 语言引入一个可选的模块机制,在不偏离 ISO/IEC 13211-1(核心 Prolog)的前提下,为较大规模程序的封装、命名空间管理及重用提供标准支撑。
本标准适用于:
适用范围涵盖模块的声明语法、导入导出规则、模块间谓词可见性、以及一组用于模块间操作的预定义谓词。标准不强制所有 Prolog 系统实现模块系统,但如果声称符合 ISO/IEC 13211-2,则必须完整实现其全部要求。
一个模块由模块定义指令 :- module(ModuleName, PublicList) 起始,其中 ModuleName 是原子类型,代表模块唯一标识;PublicList 是由谓词指示器(谓词名/元数)组成的列表,声明了该模块对外公开的谓词。未在 PublicList 中出现的谓词默认为模块私有,外部不可见。
示例:
:- module(util, [reverse/2, append/3]).
reverse([], []). reverse([H|T], R) :- reverse(T, RevT), append(RevT, [H], R).
% private predicate helper(X) :- ...
模块内部可以包含任意核心 Prolog 子句,但只有导出的谓词才能被其他模块导入使用。
模块 B 若要使用模块 A 中导出的谓词,必须通过 :- use_module(ModuleFile, ImportList) 指令声明。其中 ModuleFile 是模块源文件的路径(通常不含后缀),ImportList 指定欲导入的谓词指示器。导入后,这些谓词在当前模块中变为可见,如同本地定义。
标准还支持:
:- use_module(ModuleFile) 将导入该模块公开列表中的所有谓词;:- use_module(ModuleFile, [..., reexport]) 形式,可以将被导入的谓词从当前模块再次导出,形成模块层次传递。标准定义了一组可查询和操作模块状态的预定义谓词,下表给出了最常用的几个:
| 谓词 | 功能描述 |
|---|---|
current_module/1 | 枚举当前系统中所有已加载的模块名(回溯时产生多个解) |
module/1 | 返回当前所在模块的名称 |
use_module/[1,2,3] | 加载并导入其他模块的谓词;第三个参数用于指定导入的谓词列表以及可选的 reexport 选项 |
unload_module/1 | 卸载指定模块,释放其占用的所有资源 |
export/1 | 运行时修改当前模块的公开列表,添加新导出的谓词 |
这些服务谓词允许程序在运行时动态管理模块,为反射式编程和插件体系结构提供了标准化接口。
符合 IEC 13211-2-02 的实现必须满足以下兼容性约束:
call/1、findall/3)对模块敏感时须遵循标准指定的作用域规则。call(':'(Module, Pred)))均应被拒绝或引发permission_error异常。这是模块封装性的最低保障。 对于 Prolog 系统开发者,实现模块系统时需重点处理:
assert/1、retract/1 等动态操作应自动归类到当前模块的存储空间;module/2,并列出所有公有谓词——即使只导出其中一个;:- use_module/1,2 时尽量显式列出导入的谓词,避免一次性导入全部,降低意外冲突几率;myapp_io、myapp_utils);IEC 13211-2-02 必须与 ISO/IEC 13211-1(核心 Prolog)协同使用。核心部分定义了 Prolog 的基础数据类型、控制流、输入输出、异常处理及元编程等;模块部分在此基础上增加了一套作用域和封装机制,但不会改变核心谓词的用法。两个标准共同构成了完整、分层的 Prolog 语言规范。
与其他编程语言标准的关系:本标准在封装思想(模块、导入、导出)上与 Ada、Modula-2、Python 等语言的模块/包系统类似,但保留了 Prolog 特有的逻辑变量和回溯特性。因此,不存在直接替换关系,而是为异构语言互操作提供规范的 Prolog 端接口。
此外,IEC 13211-2-02 也与 C/C++等语言的链接规范无直接关联;但当需要将 Prolog 代码嵌入其他语言时,模块系统的标准化命名空间有助于生成稳定的外部调用点。
save/1 和 restore/1(状态保存/还原)?© 2026 本文档为基于国际标准 IEC 13211-2-02 的技术解读,所有权利归原作者及发布方所有。文中所述内容仅供技术参考,不构成法律或认证意见。