Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
IEC 13211-1-97 (2013) 等同于 ISO/IEC 13211-1:1995 及其后续技术勘误,是信息技术领域内正式定义 Prolog 编程语言核心 的国际标准。该标准由 ISO/IEC JTC 1 联合技术委员会制定,并于 1995 年首次发布,之后通过 2007、2012 年的技术勘误以及 2013 年的系统复审与确认,至今(2026 年)仍作为 Prolog 语言实现与互操作性的根本依据。
标准的适用对象包括:
标准覆盖了 Prolog 的核心概念:语法(术语、原子、数字、变量、复合项)、数据类型、一元/二元谓词的预定义集合、控制结构、输入/输出(I/O)、动态数据库操作、异常处理以及程序执行模型。此外,标准附录 A 提供了合规性测试的用例子集,附录 B 则给出了形式化语义。
标准明确 Prolog 的四类基本数据对象:
| 类型 | 描述 | 示例 |
|---|---|---|
| 原子 | 小写字母开头的标识符或单引号括起的字符串 | foo,'Hello World' |
| 数字 | 整数与浮点数(IEEE 754 双精度) | 42,3.14,-17 |
| 变量 | 大写字母或下划线开头的标识符 | X,_Result,_(匿名变量) |
| 复合项 | 函子(原子)与若干参数(任意项)组成的结构 | person(name('Alice'), age(30)) |
列表作为复合项的语法糖([] 与 |)也被标准化,包括空列表 [] 和函子 . 的表示。
标准规定字符串为双引号括起的字符列表("hello" 等同于 [104,101,108,108,111]),而非单独的原子或字符串类型——这一点与一些商用 Prolog 系统(如 SWI-Prolog 将双引号字符作为字符串类型)存在显著区别,开发者需特别留意。
标准定义了约 40 个内置谓词,涵盖以下功能类别:
true/0,fail/0,call/1,not provable (+/1),once/1;is/2,=:=/2,=/2(统一)的比较谓词,integer/1,float/1 类型测试;asserta/1,assertz/1,retract/1,abolish/1;read/1,write/1,nl/0,open/3,close/1,current_input/1,current_output/1;listing/0,listing/1,current_predicate/1,clause/2;catch/3,throw/1。每个谓词均定义了参数模式、可选择性(部分元数必须实现为内置,部分允许为用户定义)、异常类型(如 instantiation_error、type_error、domain_error)等。标准还规范了算术表达式的求值顺序与运算符优先级(表 2 给出了完整的 12 个运算符类别)。
标准规定了两种合规级别:
附录 A 提供了约 200 个测试用例(称为“合规性测试集”),用于评估系统对标准的符合程度。这些测试涵盖语法、统一、回溯、剪枝(!/0)、I/O 等关键方面。
| 测试类别 | 测试数 | 关键覆盖点 |
|---|---|---|
| 语法与读入 | 35 | 操作符定义、字符转义、注释、数字格式 |
| 统一与相等 | 28 | 发生检查(occurs check)、比较、类型测试 |
| 内置谓词与算术 | 65 | is/2、比较谓词、算术函数 |
| 数据库与程序状态 | 30 | assert、retract、clause、abolish |
| 控制结构 | 22 | catch/throw、call/1、!/0 |
| 输入/输出 | 20 | 流处理、终结符、错误处理 |
对于使用 Prolog 开发应用的工程师,遵循标准可显著提升代码的可移植性与可维护性。建议:
between/3、findall/3 虽常见但非标准核心);catch/3 和 throw/1 实现异常处理,替代非标准的全局错误标志;X = f(X) 在多数系统中会循环,需使用 unify_with_occurs_check/2(部分系统提供,但非标准核心)。此外,测试部门可使用标准附录 A 的测试套件进行初步验证。许多开源项目(如 Prolog 一致性测试框架)已将该套件转化为可执行脚本。
由于 IEC 13211-1-97 并非免费发布(需通过 ISO 或 IHS 等渠道购买),许多实现参考了公开的草案或归纳版测试。然而,正式的认证测试只能基于官方文档。开发者应注意:
一个实用的合规性报告应当列出:
IEC 13211-1-97 是 Prolog 标准体系的第一部分,其配套标准为 ISO/IEC 13211-2:2000(模块系统)和 ISO/IEC 13211-3:2013(语法与语义的附加约束)。后两者定义了模块化扩展和更严格的执行模型,与第一部分共同构成完整的语言规范。
在更广阔的编程语言生态中,Prolog 标准与 ISO/IEC 9798-3(实体鉴别)等安全标准无直接关系,但常作为知识表示语言在人工智能、专家系统中与 ISO/IEC 2382(术语标准)关联。
对于加拿大市场,CSA(加拿大标准协会)采纳了该标准,将其发布为 CAN/CSA-ISO/IEC 13211-1-97 (R2013),即路径中所见的“CAN CSA ISO IEC 13211-1-97 (2013).pdf”。该版本于 2013 年重新确认,内容与 IEC 版本完全一致,仅在体例上适用加拿大标准要求。因此,使用该文件的工程师可以确信其内容与最新国际标准等同。
!/0 的行为有精确定义:它丢弃当前选择点以及所有由调用该谓词的子句创建的选择点。然而,!/0 的使用经常导致非逻辑语义,标准允许实现以剪枝为名进行优化,但必须保证结果与标准描述一致。在编写可移植代码时,建议用 once/1 或 -> 条件控制代替裸割。catch/throw)、统一了 I/O 流模型、规定了所有内置谓词的错误条件。此外,标准删除了 recorded/3 等过时谓词,并强制要求 op/3 的声明以符合特定优先级规则。简而言之,标准是 Edinburgh 子集的一个严格超集,并增加了现代化特性。