Prolog 中谓词名称后出现在 DCG 上下文中的双斜杠“//”是什么意思?

What is the meaning of a double slash `//` after the predicate name in Prolog, appearing in the context of DCGs?

一些“谓词指示符”(这是表示 谓词函子[= 的句法 name/arity 表达式的 23=](这两个术语是等价的)不满足于一个斜线,而是两个斜线。这总是出现在 DCG 的上下文中。示例:

What is the meaning of a double slash // after the predicate name in Prolog, appearing in the context of DCGs?

它被 Prolog 的术语重写系统(SWI-Prolog src)使用,但对于一个人来说,它让你知道谓词是一个 DCG 并且有两个隐藏的参数添加到末尾谓词。

例如,这是一个非常简单的 DCG,它有 1 个可见参数。

simple_dcg(X) -->
    { X is 1 + 2 }.

看到列表时

?- listing(simple_dcg).
simple_dcg(X, A, B) :-
    X is 1+2,
    B=A.

true.

出现两个额外的隐藏参数 (A, B)。


如果您一直在 SWI-Prolog 论坛上关注我的 EDCG questions,那么您就会知道它会变得更加复杂。

根据 recent drafts WDTR 13211-3 (3.19),这称为非终端指示符。类似于谓词指示符 (3.131),它用于表示一个特定的非终结符。

请注意,大多数实现将非终结符 nt//n 转换为谓词 nt /n+2。但是,您不能依赖精确的翻译方式。因此,通过调用相应谓词直接调用非终结符的结果,即具有相同名称和两个额外参数的结果未定义。特别是第二个附加参数必须小心处理。直接使用可能会违反坚定性,特别是在使用 .