prolog - Prolog 中的 (+,?,?) 或 (-,-,+) 是什么意思?

标签 prolog

有时,当我阅读 Prolog 中的一些示例时,我可以看到它说“此代码的形式为 (+,?,?)”。那么,这些标志的含义是什么呢?我不知道名字,所以无法进行更多搜索。 谢谢

最佳答案

+?-@ 是标准谓词参数实例化模式。它们用于谓词文档中,以告知用户调用谓词时可以使用的支持模式。它们的含义在 ISO Prolog 标准中定义。是:

  • + - 参数应被实例化
  • ? - 参数应被实例化或变量
  • @ - 参数应保持不变
  • - - 参数应该是一个将被实例化的变量 目标成功

因此,通常+参数被视为输入参数,-参数被视为输出参数,? 参数作为输入和输出参数。

一些 Prolog 系统和扩展的文档经常扩展这组参数模式指示符。例如,某些系统可能会提供额外的模式指示符来指示调用谓词时参数应为接地。或者一个参数是一个元参数(例如,它将被谓词元调用)。

谓词通常只支持少量不同的模式模板。但是,有据可查的谓词还应该指定在受支持的模板之外使用时会出现哪些错误。

以标准 is/2 谓词为例。它的单一模板是:

is(?term, @evaluable)

请注意,除了实例化模式指示器之外,还有类型信息。在这种情况下,第一个参数可以是任何项(包括变量),第二个参数应该是可计算的算术表达式。该谓词的完整规范还告诉用户,例如如果在第二个参数中使用未绑定(bind)变量调用谓词,我们会收到实例化错误。

某些谓词支持多个模板。标准 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 - Prolog 中的 (+,?,?) 或 (-,-,+) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427203/

相关文章:

list - 如何向 Prolog 指定列表的所有元素必须为 1 或 0?

prolog - 运行prolog脚本时如何使prolog打印查询结果

prolog - Prolog 中递归谓词末尾的剪切

list - 列表的反向列表

prolog - 确定图形是否在序言中连接

list - Prolog 可能删除列表中的元素

prolog - 如果未声明输入,如何创建无限列表?

prolog - 向 DCG Prolog 寻求答案

prolog - 定义一个包含数字及其否定的谓词并枚举它们

prolog - 使用 Prolog 的爱因斯坦谜语