Prolog谓词参数中实例化模式指示符的含义

14

查看Prolog文档时,有时会以以下方式编写谓词签名:

foo(:Bar, +Baz, -Qux, ?Mop)

:, +, -?这些符号是什么意思,我该如何解释它们?此外,它们是唯一存在的符号吗,还是还有其他的符号存在?

3个回答

14

在这个上下文中,这些前缀操作符代表实例化模式,即它们告诉您在调用谓词时哪些参数应该是变量或已实例化的。它们还告诉您是否通过调用对参数进行(可能进一步)实例化。它们也可以用来告诉您,被调用的谓词将以某种方式元解释某个参数。其中一些实例化模式是标准的,其他依赖于系统。最常见的有:

- - 参数应该是未绑定的(可能是输出参数)

+ - 参数应该是绑定的(输入参数)

? - 参数可以是绑定或未绑定的

@ - 参数不会通过调用进一步实例化

: - 参数将以某种方式元解释(通常是含糊的)

0 - 参数将被解释为目标并被调用

N - 其中N是自然数;参数将被解释为一个闭包,将与N个附加参数组合以构造将被调用的目标

不同的系统提供其他或不同的实例化模式。例如,用于声明在调用谓词时参数应该是ground的,或者用于声明参数应该是谓词指示器,或者将其解释为语法规则体。您需要参考所使用的Prolog系统的文档以获取详细信息。


“前缀运算符”是文档的语言吗?我认为这可能对初学者用户很有价值,如果可能的话,我想让标题更适合谷歌搜索。 - user797257
1
在一些Prolog系统和Logtalk中,实例化模式字符确实被声明为前缀运算符,因此您可以编写例如 :- mode(length(?list, ?integer), zero_or_more). 但是这些字符也可能仅用于文档而不是您可以编译的代码。因此,更友好的标题可能是“Prolog实例化模式字符”或“Prolog实例化模式指示器”。 - Paulo Moura

9
Mode声明最早出现在1970年代末的DECsystem-10编译器中,其中1978年9月的DECsystem-10用户指南是最早的描述之一。动机是在1982年11月10日给出的:
“这些信息使编译器能够生成更紧凑的代码,更好地利用运行时存储。尤其是在节省运行时存储方面,通常可以节省很多空间。模式声明还帮助其他人理解您的程序如何运作。”
DECsystem-10 + - 参数将始终是非变量 - - 参数将始终是变量 ? - 没有限制
请注意,这些声明适用于每个目标。特别是,它们适用于递归目标。通过以下模式声明及其定义,第二个参数不是部分列表。因此,目标member(A, [c|_])将不符合要求。因此,接口和实现有些相互依赖,这可能导致相当复杂的情况,必须考虑谓词本身执行的统一。
:- mode member(?, +).
member(X, [X|_]). % member(X, [X,.._]) in DEC10
member(X, [_|L]) :-
   member(X, L).

如果一个模式声明被具体目标违反,该声明将被忽略,或者将产生一个错误,即写出一个错误消息并失败。DECsystem-10解释器总是忽略这些声明。
在上世纪70年代,DEC 10用户指南对模式声明产生了两种解释:第一种是规范的,如果调用者未满足模式,则会产生错误;第二种是完全非正式的,在运行时忽略模式声明。前者用于Prolog标准中,后者在一些Prolog系统的文档中找到。
ISO/IEC-Prolog:模板和模式子句
Prolog标准(ISO/IEC 13211-1:1995, 2007, 2012)使用以下格式定义内置谓词。它以子句.1描述、.2模板和模式、.3错误为开头,可能继续包括.4示例、.5引导内置谓词。
8.1.2 模板和模式:
内置谓词参数类型和哪些参数必须实例化的规范。这些情况构成了一个互斥集。
具体模式如下:
+ — 参数必须实例化。
@ — 像+,参数必须保持不变。
- — 参数必须是一个变量,当目标成功时将被实例化。
? — 没有模式要求,参数可以是变量或已实例化的。
如果谓词以不同的模式调用,则会产生instantiation_error或uninstantiation_error。如果类型不匹配,则会产生type_error。通过查看模板和模式子句,程序员可以预测许多错误,而无需阅读详细的错误条件。
其他系统
与ISO不同的系统在模式解释方面也各不相同。许多系统在应该适当的情况下执行静默失败。他们认为模式声明是指出谓词期望以未定义的含义工作的情况的一种方法。通常情况下,-被解释如下所示。由于没有实际定义该含义,这是我非正式收集到的:
- — 参数是“输出参数”。这意味着它将与目标执行后的结果项统一。因此参数是坚定的。通常,此类参数没有关联的错误。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接