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 的上下文中。示例:
- syntax_error//1: "在输入的当前位置抛出语法错误
Error
。此谓词旨在从 phrase_from_file/3
的处理程序中调用。""=25 =]
- js_expression(+Expression)//:“发出一个 JSON 参数。”
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。但是,您不能依赖精确的翻译方式。因此,通过调用相应谓词直接调用非终结符的结果,即具有相同名称和两个额外参数的结果未定义。特别是第二个附加参数必须小心处理。直接使用可能会违反坚定性,特别是在使用 dcg-semicontext.
时
一些“谓词指示符”(这是表示 谓词 或 函子[= 的句法 name/arity
表达式的
- syntax_error//1: "在输入的当前位置抛出语法错误
Error
。此谓词旨在从phrase_from_file/3
的处理程序中调用。""=25 =] - js_expression(+Expression)//:“发出一个 JSON 参数。”
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。但是,您不能依赖精确的翻译方式。因此,通过调用相应谓词直接调用非终结符的结果,即具有相同名称和两个额外参数的结果未定义。特别是第二个附加参数必须小心处理。直接使用可能会违反坚定性,特别是在使用 dcg-semicontext.