Prolog 中的 (+,?,?) 或 (-,-,+) 是什么意思?
What is the meaning of (+,?,?) or (-,-,+) in Prolog?
有时当我在 Prolog 中阅读一些示例时,我会看到它说 "this code is in the form of (+,?,?)"。那么,这些标志的含义是什么。我不知道这个名字,所以我无法搜索更多。
谢谢
+
、?
、-
和 @
是标准谓词参数 实例化模式 。它们用于谓词的文档中,以告知用户调用谓词时可以使用的支持模式。它们的含义,如 ISO Prolog 标准中所定义。是:
+
- 应实例化参数
?
- 参数应实例化或变量
@
- 参数应保持不变
-
- 参数应该是一个变量,当且仅当
目标成功
因此,通常+
参数被视为输入参数,-
参数被视为输出参数, ?
个参数作为输入和输出参数。
一些 Prolog 系统和扩展的文档经常扩展这组参数模式指示符。例如,一些系统可能会提供一个额外的模式指示符来指示在调用谓词时参数应该是 ground。或者一个参数是一个元参数(例如,这将被谓词元调用)。
通常谓词只支持少量不同的模式模板。但有据可查的谓词还应指定在受支持的模板之外使用时会出现哪些错误。
以标准 is/2
谓词为例。它的单一模板是:
is(?term, @evaluable)
请注意,除了实例化模式指示符外,还有类型信息。在这种情况下,第一个参数可以是任何项(包括变量),第二个参数应该是一个可计算的算术表达式。该谓词的完整规范还告诉用户,例如如果在第二个参数中使用未绑定变量调用谓词,我们会收到实例化错误。
一些谓词支持多个模板。一个例子是标准的 atom_concat/3
谓词:
atom_concat(?atom, ?atom, +atom)
atom_concat(+atom, +atom, -atom)
第一个模板告诉用户 atom_concat/3
可以用来 分解 一个原子。第二个模板告诉用户谓词可以按预期用于连接两个原子。通常每个有效模板都与 确定性 信息相关联。例如目标:
| ?- atom_concat(Prefix, Suffix, abc).
有多个解决方案:
Prefix = '',
Suffix = abc ;
Prefix = a,
Suffix = bc ;
Prefix = ab,
Suffix = c ;
Prefix = abc,
Suffix = ''.
您还可以在此示例中看到一些模板包含其他模板。在上面的例子中,我们重新使用模式为 (-atom, -atom, +atom)
.
的谓词
有时当我在 Prolog 中阅读一些示例时,我会看到它说 "this code is in the form of (+,?,?)"。那么,这些标志的含义是什么。我不知道这个名字,所以我无法搜索更多。 谢谢
+
、?
、-
和 @
是标准谓词参数 实例化模式 。它们用于谓词的文档中,以告知用户调用谓词时可以使用的支持模式。它们的含义,如 ISO Prolog 标准中所定义。是:
+
- 应实例化参数?
- 参数应实例化或变量@
- 参数应保持不变-
- 参数应该是一个变量,当且仅当 目标成功
因此,通常+
参数被视为输入参数,-
参数被视为输出参数, ?
个参数作为输入和输出参数。
一些 Prolog 系统和扩展的文档经常扩展这组参数模式指示符。例如,一些系统可能会提供一个额外的模式指示符来指示在调用谓词时参数应该是 ground。或者一个参数是一个元参数(例如,这将被谓词元调用)。
通常谓词只支持少量不同的模式模板。但有据可查的谓词还应指定在受支持的模板之外使用时会出现哪些错误。
以标准 is/2
谓词为例。它的单一模板是:
is(?term, @evaluable)
请注意,除了实例化模式指示符外,还有类型信息。在这种情况下,第一个参数可以是任何项(包括变量),第二个参数应该是一个可计算的算术表达式。该谓词的完整规范还告诉用户,例如如果在第二个参数中使用未绑定变量调用谓词,我们会收到实例化错误。
一些谓词支持多个模板。一个例子是标准的 atom_concat/3
谓词:
atom_concat(?atom, ?atom, +atom)
atom_concat(+atom, +atom, -atom)
第一个模板告诉用户 atom_concat/3
可以用来 分解 一个原子。第二个模板告诉用户谓词可以按预期用于连接两个原子。通常每个有效模板都与 确定性 信息相关联。例如目标:
| ?- atom_concat(Prefix, Suffix, abc).
有多个解决方案:
Prefix = '',
Suffix = abc ;
Prefix = a,
Suffix = bc ;
Prefix = ab,
Suffix = c ;
Prefix = abc,
Suffix = ''.
您还可以在此示例中看到一些模板包含其他模板。在上面的例子中,我们重新使用模式为 (-atom, -atom, +atom)
.