Prolog中(+,?,?)或( - , - ,+)的含义是什么?

时间:2015-05-24 19:02:32

标签: prolog

有时当我在Prolog中阅读一些样本时,我可以看到它已经说过"这段代码的形式是(+,?,?)"。那么,这些标志的含义是什么呢?我不知道这个名字,然后我无法搜索更多。 感谢

1 个答案:

答案 0 :(得分:3)

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

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

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

一些Prolog系统和扩展的文档通常会扩展这组参数模式指标。例如,某些系统可能会在调用谓词时提供一个附加模式指示符来指示参数应该 ground 。或者一个参数是一个元参数(例如,谓词会被谓词元调用)。

谓词通常只支持少量不同的模式模板。但是,有充分记录的谓词预计还会指定在支持的模板之外使用时会出现哪些错误。

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

is(?term, @evaluable)

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

某些谓词支持多个模板。一个例子是标准atom_concat/3谓词:

atom_concat(?atom, ?atom, +atom)
atom_concat(+atom, +atom, -atom)

第一个模板告诉用户atom_concat/3可用于分解原子。第二个模板告诉用户可以按预期使用谓词来连接两个原子。通常,每个有效模板都与 determinism 信息相关联。例如,目标:

| ?- atom_concat(Prefix, Suffix, abc).

有多种解决方案:

Prefix = '',
Suffix = abc ;
Prefix = a,
Suffix = bc ;
Prefix = ab,
Suffix = c ;
Prefix = abc,
Suffix = ''.

您还可以在此示例中看到某些模板包含其他模板。在上面的示例中,我们使用带有模式(-atom, -atom, +atom)的谓词。