Prolog/确定子句语法
外观
< 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].