查看Prolog文档时,有时会以以下方式编写谓词签名:
foo(:Bar, +Baz, -Qux, ?Mop)
:
, +
, -
和?
这些符号是什么意思,我该如何解释它们?此外,它们是唯一存在的符号吗,还是还有其他的符号存在?
查看Prolog文档时,有时会以以下方式编写谓词签名:
foo(:Bar, +Baz, -Qux, ?Mop)
:
, +
, -
和?
这些符号是什么意思,我该如何解释它们?此外,它们是唯一存在的符号吗,还是还有其他的符号存在?
在这个上下文中,这些前缀操作符代表实例化模式,即它们告诉您在调用谓词时哪些参数应该是变量或已实例化的。它们还告诉您是否通过调用对参数进行(可能进一步)实例化。它们也可以用来告诉您,被调用的谓词将以某种方式元解释某个参数。其中一些实例化模式是标准的,其他依赖于系统。最常见的有:
-
- 参数应该是未绑定的(可能是输出参数)
+
- 参数应该是绑定的(输入参数)
?
- 参数可以是绑定或未绑定的
@
- 参数不会通过调用进一步实例化
:
- 参数将以某种方式元解释(通常是含糊的)
0
- 参数将被解释为目标并被调用
N
- 其中N是自然数;参数将被解释为一个闭包,将与N个附加参数组合以构造将被调用的目标
不同的系统提供其他或不同的实例化模式。例如,用于声明在调用谓词时参数应该是ground的,或者用于声明参数应该是谓词指示器,或者将其解释为语法规则体。您需要参考所使用的Prolog系统的文档以获取详细信息。
+
- 参数将始终是非变量
-
- 参数将始终是变量
?
- 没有限制member(A, [c|_])
将不符合要求。因此,接口和实现有些相互依赖,这可能导致相当复杂的情况,必须考虑谓词本身执行的统一。:- mode member(?, +).
member(X, [X|_]). % member(X, [X,.._]) in DEC10
member(X, [_|L]) :-
member(X, L).
这里有一个更现代的文档: https://www.swi-prolog.org/pldoc/man?section=modes
对于元谓语,也有类似的注释,应该使用meta_predicate
指令来确保在被调用时正确添加模块。 https://www.swi-prolog.org/pldoc/doc_for?object=(meta_predicate)/1
:- mode(length(?list, ?integer), zero_or_more).
但是这些字符也可能仅用于文档而不是您可以编译的代码。因此,更友好的标题可能是“Prolog实例化模式字符”或“Prolog实例化模式指示器”。 - Paulo Moura