IEC 13211-1-97 (2013) 编程语言 Prolog 第1部分:核心标准技术解析

全面解读 ISO/IEC 13211-1:1995 国际标准对 Prolog 语言的定义、要求与实施指南

1. 标准概况与适用范围

IEC 13211-1-97 (2013) 等同于 ISO/IEC 13211-1:1995 及其后续技术勘误,是信息技术领域内正式定义 Prolog 编程语言核心 的国际标准。该标准由 ISO/IEC JTC 1 联合技术委员会制定,并于 1995 年首次发布,之后通过 2007、2012 年的技术勘误以及 2013 年的系统复审与确认,至今(2026 年)仍作为 Prolog 语言实现与互操作性的根本依据。

标准的适用对象包括:

  • Prolog 解释器/编译器的开发者:提供精确的语言定义,保证实现的一致性;
  • 终端用户与程序员:了解标准 Prolog 的语法、语义和内置功能;
  • 教育与研究机构:在教学和课题中使用统一、权威的 Prolog 参考;
  • 软件质量保障与合规测试机构:依据标准验证系统的合规性。

标准覆盖了 Prolog 的核心概念:语法(术语、原子、数字、变量、复合项)、数据类型、一元/二元谓词的预定义集合、控制结构、输入/输出(I/O)、动态数据库操作、异常处理以及程序执行模型。此外,标准附录 A 提供了合规性测试的用例子集,附录 B 则给出了形式化语义。

技术提示: IEC 13211-1-97 严格定义了“合规 Prolog 系统”必须支持的最小功能集合,同时允许实现扩展,但扩展不得破坏核心语义。开发者若希望兼具高性能与可移植性,应在扩展前优先确保核心符合该标准。

2. 主要技术内容与要求

2.1 数据类型与术语

标准明确 Prolog 的四类基本数据对象:

类型描述示例
原子小写字母开头的标识符或单引号括起的字符串foo'Hello World'
数字整数与浮点数(IEEE 754 双精度)423.14-17
变量大写字母或下划线开头的标识符X_Result_(匿名变量)
复合项函子(原子)与若干参数(任意项)组成的结构person(name('Alice'), age(30))

列表作为复合项的语法糖([]|)也被标准化,包括空列表 [] 和函子 . 的表示。

标准规定字符串为双引号括起的字符列表("hello" 等同于 [104,101,108,108,111]),而非单独的原子或字符串类型——这一点与一些商用 Prolog 系统(如 SWI-Prolog 将双引号字符作为字符串类型)存在显著区别,开发者需特别留意。

重要提醒: IEC 13211-1-97 将双引号字符串解释为整数列表,这与许多现代 Prolog 实现将字符串视为独立数据类型不同。若需编写可移植代码,请使用原子(单引号)表示文本,或严格依赖标准定义的行为。

2.2 核心谓词与控制结构

标准定义了约 40 个内置谓词,涵盖以下功能类别:

  • 控制谓词true/0fail/0call/1not provable (+/1)once/1
  • 算术运算is/2=:=/2=/2(统一)的比较谓词,integer/1float/1 类型测试;
  • 动态数据库asserta/1assertz/1retract/1abolish/1
  • I/O 操作read/1write/1nl/0open/3close/1current_input/1current_output/1
  • 程序状态访问listing/0listing/1current_predicate/1clause/2
  • 异常处理catch/3throw/1

每个谓词均定义了参数模式、可选择性(部分元数必须实现为内置,部分允许为用户定义)、异常类型(如 instantiation_errortype_errordomain_error)等。标准还规范了算术表达式的求值顺序与运算符优先级(表 2 给出了完整的 12 个运算符类别)。

2.3 标准合规性要求

标准规定了两种合规级别:

  1. 最小合规系统(Minimal Conforming System):必须实现标准中列出的所有强制内置谓词和语法规则,并提供书面文档说明任何偏离;
  2. 扩展合规系统(Extended Conforming System):在最小合规的基础上,可添加额外的谓词或语法扩展,但不得违反核心语义,且必须将所有非标准扩展明确标识为非标准。

附录 A 提供了约 200 个测试用例(称为“合规性测试集”),用于评估系统对标准的符合程度。这些测试涵盖语法、统一、回溯、剪枝(!/0)、I/O 等关键方面。

测试类别测试数关键覆盖点
语法与读入35操作符定义、字符转义、注释、数字格式
统一与相等28发生检查(occurs check)、比较、类型测试
内置谓词与算术65is/2、比较谓词、算术函数
数据库与程序状态30assertretractclauseabolish
控制结构22catch/throwcall/1!/0
输入/输出20流处理、终结符、错误处理
强制性要求: 任何宣称符合 IEC 13211-1-97 的 Prolog 系统必须通过附录 A 中标记为“M”(强制)的所有测试用例。如果存在测试失败,系统必须将其作为已知偏离记录在文档中,并说明差异。

3. 实施与应用要点

3.1 开发者的最佳实践

对于使用 Prolog 开发应用的工程师,遵循标准可显著提升代码的可移植性与可维护性。建议:

  • 优先使用核心内置谓词,避免依赖特定实现的扩展(如 between/3findall/3 虽常见但非标准核心);
  • 明确区分标准数据类型的字符串表示:双引号作列表,单引号作原子;
  • 自定义操作符时遵循标准优先级:可参考标准第 6 章的操作符表;
  • 利用 catch/3throw/1 实现异常处理,替代非标准的全局错误标志;
  • 避免依赖发生检查(occurs check):标准不要求内置统一包含发生检查,因此 X = f(X) 在多数系统中会循环,需使用 unify_with_occurs_check/2(部分系统提供,但非标准核心)。

此外,测试部门可使用标准附录 A 的测试套件进行初步验证。许多开源项目(如 Prolog 一致性测试框架)已将该套件转化为可执行脚本。

实施益处: 严格遵循 IEC 13211-1-97 的 Prolog 系统,能够与符合同一标准的其他系统无缝交互(如使用代换指令、加载标准格式的模块)。这使得教科书示例、研究代码、遗留系统的迁移成本大幅降低。

3.2 测试与合规认证

由于 IEC 13211-1-97 并非免费发布(需通过 ISO 或 IHS 等渠道购买),许多实现参考了公开的草案或归纳版测试。然而,正式的认证测试只能基于官方文档。开发者应注意:

  • 目前并无第三方认证机构提供“Prolog 合规标记”,多数系统通过自宣或用户社区验证;
  • 常见的 Prolog 解释器(如 SWI-Prolog、GNU-Prolog、YAP、SICStus、B-Prolog)在核心层面基本符合该标准,但各有已知偏离;
  • 为保证代码可移植,建议在目标平台上运行附录 A 的全部测试。

一个实用的合规性报告应当列出:

  1. 所有强制谓词的可用性及语义正确性;
  2. 数据表示(特别是字符串/列表)是否符合标准;
  3. 算术异常的抛出是否符合预定义错误类型。
常见误区: 许多程序员认为 “ISO Prolog” 就等同于某个具体实现(如 SWI-Prolog 的“ISO 模式”),但实际上 SWI-Prolog 的 ISO 模式仅涵盖了大多数强制内置谓词,并非完全满足所有测试用例(如文件结束符的处理、字符输入的行为)。务必参考实际标准文档。

4. 与其他标准的关系

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 版本完全一致,仅在体例上适用加拿大标准要求。因此,使用该文件的工程师可以确信其内容与最新国际标准等同。

技术提示: 若有计划开发 Prolog 课程或认证,建议将 IEC 13211-1-97 与 ISO/IEC 13211-2(模块)一同参考。虽然大多数教学仍以第一部分为主,但模块系统的标准化有助于大型项目的组织。

常见问题(FAQ)

问: IEC 13211-1-97 (2013) 标准是免费可用的吗?
答: 不免费。该标准受版权保护,需通过 ISO、IEC、CSA 或授权销售渠道购买。ISO 官方网站常提供部分预览,但完整文本须付费。不过,许多合规测试用例被开源社区整理发布,可用于自测。
问: 如何验证我的 Prolog 系统是否完全符合该标准?
答: 最可靠的方法是获取官方标准文档,并将其附录 A(合规性测试)手工或自动化执行。此外,可参考国际组织 “Prolog 标准工作组” 维护的测试集(如 PTTP 测试套件),并对照标准中每个内置谓词的精确语义逐项检查。
问: 标准中是否需要割词(!/0)在特定条件下保证可移植?
答: 是的。标准对 !/0 的行为有精确定义:它丢弃当前选择点以及所有由调用该谓词的子句创建的选择点。然而,!/0 的使用经常导致非逻辑语义,标准允许实现以剪枝为名进行优化,但必须保证结果与标准描述一致。在编写可移植代码时,建议用 once/1-> 条件控制代替裸割。
问: IEC 13211-1-97 与常见的 Edinburgh Prolog 有何主要区别?
答: Edinburgh Prolog(如 DEC-10 Prolog)是早期的方言,二者在语法上基本兼容,但 IEC 标准正式化了异常处理机制(catch/throw)、统一了 I/O 流模型、规定了所有内置谓词的错误条件。此外,标准删除了 recorded/3 等过时谓词,并强制要求 op/3 的声明以符合特定优先级规则。简而言之,标准是 Edinburgh 子集的一个严格超集,并增加了现代化特性。

📥 标准文件下载

🔒
请等待 10 秒,广告加载完成后将自动显示下载链接

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注