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

Prolog谓词参数中实例化模式指示符的意义,prolog,signature,iso-prolog,Prolog,Signature,Iso Prolog,查看Prolog文档,谓词签名有时编写如下: foo(:Bar, +Baz, -Qux, ?Mop) 什么是:,+,-和?以及如何解释它们?此外,这些是唯一存在的还是更多的?在本文中,这些前缀运算符表示实例化模式,即它们告诉您在调用谓词时哪些参数应该是变量或实例化。它们还会告诉您调用是否会(可能会进一步)实例化参数。它们还可以用来告诉您,您正在调用的谓词将以某种方式对参数进行元解释。其中一些实例化模式是标准的,另一些则取决于系统。最常见的是: --参数应解除绑定(可能是输出参数) +-应绑定参

查看Prolog文档,谓词签名有时编写如下:

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

什么是
+
-
以及如何解释它们?此外,这些是唯一存在的还是更多的?

在本文中,这些前缀运算符表示实例化模式,即它们告诉您在调用谓词时哪些参数应该是变量或实例化。它们还会告诉您调用是否会(可能会进一步)实例化参数。它们还可以用来告诉您,您正在调用的谓词将以某种方式对参数进行元解释。其中一些实例化模式是标准的,另一些则取决于系统。最常见的是:

-
-参数应解除绑定(可能是输出参数)

+
-应绑定参数(输入参数)

-参数可以是绑定的,也可以是未绑定的

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

-参数将以某种方式进行元解释(通常不明确)

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

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


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

模式声明最早出现在20世纪70年代末的DECsystem-10编译器中。1978-09年的DECsystem-10用户指南是最早的描述之一。动机见1982-11-10:

这些信息使编译器能够生成更紧凑的代码 更好地利用运行时存储。运行时的保存 特别是存储量通常非常大。模式 声明还帮助其他人了解您的 程序运行

DECsystem-10
+
-参数始终为非变量

-
-参数将始终是一个变量

-无限制

请注意,这些声明适用于每个目标。最值得注意的是,它们适用于递归目标。以这种方式,下面的模式声明及其定义意味着第二个参数不是部分列表。因此,目标
成员(a[c |)
将不符合要求。因此,接口和实现在某种程度上是相互依赖的,这可能导致非常复杂的情况,这时必须考虑谓词本身执行的统一

:- mode member(?, +).
member(X, [X|_]). % member(X, [X,.._]) in DEC10
member(X, [_|L]) :-
   member(X, L).
如果某个具体目标违反了某个模式声明,则该声明要么被忽略,要么将产生一个错误,此时意味着写出一条错误消息并失败。DECsystem-10解释器总是忽略声明

在20世纪70年代,12月10日的《用户指南》对模式声明产生了两种解释:第一种解释是规定性的,在调用者不满足模式时会产生错误。第二个是完全非正式的,在运行时忽略模式声明。前者用于Prolog标准,后者可在一些Prolog系统的文档中找到

ISO/IEC序言:模板和模式子条款 Prolog标准(ISO/IEC 13211-1:1995、2007、2012)使用以下格式定义内置谓词。它从子类.1描述、.2模板和模式、.3错误开始,并可选地继续使用.4个示例、.5个引导内置谓词

8.1.2模板和模式

参数类型和参数类型的规范
其中一个应为内置谓词实例化为
心满意足。这些案例构成了一个相互排斥的集合。

。。。 混凝土模式为:

+
-应实例化参数

@
-与
+
类似,参数应保持不变

-
-参数应为一个变量,如果目标成功,该变量将被实例化

-无模式要求,参数可以是变量或实例化参数

如果使用不同的模式调用谓词,则会生成
实例化错误
非实例化错误
。如果类型不匹配,将产生
type\u错误
。 通过这种方式,程序员只需查看模板和模式子类,而无需阅读详细的错误条件,就可以预测许多错误

其他系统 不同于ISO的系统在模式的精确解释方面也各不相同。当一个类型错误是合适的时,许多执行静默故障。他们将模式声明视为一种手段,以指示谓词在其他情况下使用未定义含义的情况。通常,
-
大致解释如下。由于没有实际的参考来定义含义,我非正式地收集了以下内容:


-
-该参数是一个“输出参数”。这意味着在执行目标后,它将与产生的术语统一。因此,这一论点是坚定的。通常,此类参数不会出现错误。

这里有一个更现代的文档:

元谓词也有类似的注释,它们应该有
meta\u谓词
指令,以确保在需要时正确添加模块