簡體   English   中英

在 PROLOG 中創建 DCG 解析器

[英]Create a DCG Parser in PROLOG

我必須在 PROLOG 中實現一個上下文無關的解析器,它使用可以生成的語法:

I saw a tutorial.
I went in a library.
In library a tutorial I saw. 

(我知道這在語法上不正確,但我需要看看如何匹配模式)

我收到一個輸入作為查詢 - 讓我們假設它是第一句話 - 我必須打印規則應用程序的數量才能成功解析,否則為 false。

為了實現這一點,我找到了這些語法:


s(X,Z):- vp(Y,Z), np(X,Y)。
np(X,Z):- det(X,Y), n(Y,Z)。
np(X,Z):- det(X,Y), n(Y,Z), np(X,Z)。
vp(X,Z):- det(X,Y), v(Y,Z)。

det([i|W],W)。
det([a|W],W)。
det([in|W],W)。

n([教程|W],W)。
n([庫|W],W)。

v([去|W],W)。
v([鋸|W],W)。


它適用於前 2 個句子,但我不知道如何使它適用於最后一個句子,我不知道如何打印成功解析的規則應用程序的數量。

謝謝!

這將有助於成功解析規則的應用數量。 但是,如您所見,它始終與句子中的單詞數量相同。 我所做的是在每個規則的參數中實現一個“計數器”,每次“基本規則”成功時它都會增加“計數器”的值。

det([i|W], W, A, R) :- R is A + 1.
det([a|W], W, A, R) :- R is A + 1.
det([in|W], W, A, R) :- R is A + 1.

n([tutorial|W], W, A, R) :- R is A + 1.
n([library|W], W, A, R) :- R is A + 1.

v([went|W], W, A, R):- R is A + 1.
v([saw|W], W, A, R):- R is A + 1.

np([], R, R).
np(X, A, R2):- det(X, Y, A, R), np(Y, R, R2).
np(X, A, R3):- det(X, Y, A, R), n(Y, Z, R, R2), np(Z, R2, R3).
vp(X, Z, R2):- det(X, Y, 0, R), v(Y, Z, R, R2).

s(X, R2):- atomic_list_concat(L,' ', X), vp(L, Z, R), np(Z, R, R2), !.

結果如下 結果。

正如您所看到的最后一句話仍然失敗,那是因為如果您遵循算法流程或對它的調用,您可以看到規則“s”調用規則“vp”,該規則只允許“det”后跟'v',所以如果你看到第三句的第一個詞是 'In','vp' 中的 'det' 會起作用,但是下一個詞是 'library' 在 'v' 上不會成功,因為 'library ' 不是動詞,所以這就是它失敗的原因。 總而言之,如果您希望第三句話成功,您必須對語法進行一些更改。 順便說一句,有更好的方法,實現起來可能有點復雜,但是一旦您了解如何使用它,使用 Prolog DCG https://www.swi會更快地工作並且更容易創建復雜的語法-prolog.org/pldoc/man?section=DCG 我提到了,以防你不知道這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM