跳转到内容

Prolog/确定子句语法

来自维基教科书,开放世界中的开放书籍

Prolog 有一种用于定义特定语法的机制,称为确定子句语法表示法。这使得编写解析器变得容易。注意,虽然 DCG 的语法是 ISO 标准的一部分,但 DCG 的语义则不是。[需要引用]

语法规则可以写成以下形式

head --> body

例如

sentence --> noun_phrase, verb_phrase.

这将被翻译为

sentence(L0,LREMAINDER):-
   noun_phrase(L0,L1),verb_phrase(L1,LREMAINDER).

这意味着,sentence 子句将接收 L0 作为输入,并在从 L0 中的句子进行解析后,它将返回 LREMAINDER。假设你的起始符号是 sentence。然后,在成功解析后,LREMAINDER 预计为 [ ]。此子句主体的解释是:如果我们从句子中解析出一个 noun_phrase 和一个 verb_phrase,我们将得到一个空列表。

你也可以使用花括号调用 prolog 谓词。

一个可以解析数字的示例 DCG 程序

number --> digit, number_remaining.
number_remaining --> dot,number_remaining.
number_remaining --> digit,number_remaining.
number_remaining([],[]).
dot -->[0'.].
digit --> [J], {digit_code(J)}.
digit_code(J):- J >= 0'0, J =< 0'9.

注意:0'9 表示字符 9(或更准确地说,是 9 的字符代码,因为 SWI 中没有单独的字符数据类型)。

如果你尝试咨询此程序,你可能会收到警告,因为我们重新定义了内置的 number/2 谓词。

运行程序

?- number("120",L).
L = [] ;
fail.

我们得到了一个“结果”:这意味着解析没有歧义。(输入只有一个可能的解析树。)

早期的示例之一,revappend,可以使用 DCG 编写

revappend([]) --> [].
revappend([X|Xs]) --> revappend(Xs), [X].
[编辑 | 编辑源代码]

维基百科上的乔姆斯基语法层次结构

华夏公益教科书