跳轉到內容

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].
[編輯 | 編輯原始碼]

維基百科上的喬姆斯基語法層次結構

華夏公益教科書