根据文法画出语法树_更多确定子句语法
本章有兩個主要目標:
1.研究DCG表示法提供的兩個重要功能:額外的參數和額外的
目標。
2.討論DCGs的現狀和局限性。
1??額外參數
在上一章中,我們介紹了基本的DCG表示法。但是DCG所提供的功能遠遠超過我們迄今為止所看到的。首先,DCG允許我們指定額外的參數。多余的參數可以用于許多目的。我們將研究三個。
上下文無關文法的特性
作為第一個例子,讓我們看看如何使用額外的參數向上下文無關文法添加特性。
這是我們在上一章中使用的DCG:
s --> np,vp.
np --> det,n.
vp --> v,np.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
v --> [shoots].
現在,假設我們要處理“她向他開槍”和“他向她開槍”這樣的句子。我們應該做什么?好吧,顯然,我們應該添加規則,說“he”,“she”,“him”和“her”是代詞:
pro --> [he].
pro --> [she].
pro --> [him].
pro --> [her].
此外,我們應該添加一條規則,說名詞短語可以是代詞:
np --> pro.
在這個新的DCG中有什么好處?好吧,到目前為止,它是可行的。例如:
?- s([she,shoots,him],[]).
true.
但是有一個明顯的問題。?DCG還將接受很多明顯錯誤的句子,例如“A woman shoots she”,“Her shoots a man”和“Her shoots she”:
?- s([a,woman,shoots,she],[]).
true.
?- s([her,shoots,a,man],[]).
true.
?- s([her,shoots,she],[]).
true.
就是說,語法不知道“she”和“he”是主語代詞,不能用于賓語位置;因此,“A woman shoots she”是不對的,因為它違反了有關英語的這一基本事實。而且,語法不知道“her”和“him”是賓語代詞,不能在主語中使用。因此,“Her shoots a man”是不對的,因為它違反了這一限制。至于“Her shoots she”,這要設法使兩個問題都立即報出錯誤。
現在,很明顯我們必須做些什么來糾正這個錯誤:我們需要擴展DCG,使其包含哪些代詞可以出現在主語位置,哪些代詞可以出現在賓語位置的信息。有趣的問題是:我們到底該怎么做?首先,讓我們看看一種簡單的糾正方法,即添加新規則:
s --> np_subject,vp.
np_subject --> det,n.
np_object --> det,n.
np_subject --> pro_subject.
np_object --> pro_object.
vp --> v,np_object.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
pro_subject --> [he].
pro_subject --> [she].
pro_object --> [him].
pro_object --> [her].
v --> [shoots].
現在,此解決方案“有效”。例如,
?- s([her,shoots,she],[]).
false.
但無論是計算機科學家還是語言學家都不會認為這是一個好的解決方案。麻煩的是,一個小的詞匯添加導致了DCG發生了很大的變化。讓我們面對現實吧:“she”和“her”(還有“he”和“him”)在很多方面都是一樣的。但是,為了處理它們不同的屬性(即它們在句子中出現的位置),我們不得不對語法進行重大修改:特別是,我們將名詞短語規則的數量增加了一倍。如果我們不得不做進一步的改變(例如,處理復數名詞短語),事情會變得更糟。我們真正需要的是一個更微妙的編程機制,它允許我們處理這些事實,而不必一直被迫添加規則。這就是額外的參數起作用的地方。請看下面的語法:
s --> np(subject),vp.
np(_) --> det,n.
np(X) --> pro(X).
vp --> v,np(object).
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
pro(subject) --> [he].
pro(subject) --> [she].
pro(object) --> [him].
pro(object) --> [her].
v --> [shoots].
需要注意的是,這個新語法只包含一個新的名詞短語規則。事實上,它與我們所寫的第一個語法非常相似,只是現在符號np與一個新的參數(主語、賓語或x)相關聯。一位語言學家會說,我們添加了一些特征來區分各種名詞短語。尤其要注意代詞的四個規則。這里我們用額外的參數來說明哪些代詞可以出現在主語位置,哪些可以出現在賓語位置。因此,這些規則是最基本的,因為它們為我們提供了如何使用這些代詞的基本事實。
那么其他規則怎么辦?好吧,直覺上,規則
np(X) --> pro(X).
使用額外的參數(變量X)將這些關于代詞的基本事實傳遞給由它們構成的名詞短語:由于變量X用作np和代詞的額外參數,Prolog?合一將保證給它們相同的值。特別是,如果我們使用的代詞是“she”(在這種情況下X=主語),那么np將(通過它的額外參數X=主語)標記為主語np。另一方面,如果我們使用的代詞是“her”(在這種情況下X=賓語),那么np的額外參數也將標記為X=賓語。當然,這正是我們想要的行為。
另一方面,盡管名詞短語是使用規則構建的
np(_) --> det, n.
還有一個額外的參數,我們使用了匿名變量作為它的值。本質上,這意味著可以是,這是正確的,因為使用這一規則構建的表達式(如“the man”和“the woman”)可以用于主語和賓語位置。
現在考慮規則
vp --> v, np(object).
這說明要應用這個規則,我們需要使用一個名詞短語,它的額外參數與賓語相結合。這可以是由賓語代詞構成的名詞短語,也可以是由匿名變量作為額外參數值的名詞短語,如“the man”和“the woman”。關鍵的是,標記代詞有主語作為附加參數的值,不能用在這里:原子、賓語和主語不合一。注意規則
s --> np(subject),vp.
以類似的方式防止由賓語代詞構成的名詞短語以主語的形式結束。
這可行。您可以通過構成查詢來檢查它:
?- s(X,[]).
當您逐步完成回答時,您將看到只生成可接受的英語。
不過,雖然剛才給出的直觀解釋是正確的,但到底發生了什么?要記住的關鍵是DCG規則只是一個方便的縮寫。例如,規則
s --> np, vp.
是真正的語法糖
s(A,B):-
np(A,C),
vp(C,B).
也就是說,正如我們在上一章中所了解到的,DCG符號是一種隱藏負責差分表表示的兩個參數的方法,這樣我們就不必考慮它們了。我們使用友好的用戶表示法,Prolog將其轉換為剛剛給出的子句。
好吧,那么我們顯然需要問
s --> np(subject),vp.
翻譯成。答案如下:
s(A,B):-
np(subject,A,C),
vp(C,B).
現在應該清楚了,“額外參數”這個名稱是一個很好的名稱:正如這個翻譯所表明的,主題符號實際上只是普通prolog規則中的一個額外參數。類似地,我們的名詞短語dcg rules轉換為
np(A,B,C) :-
det(B,D),
n(D,C).
np(A,B,C) :-
pro(A,B,C).
注意,這兩個規則都有三個參數。第一個A是額外參數,最后兩個是普通的隱藏DCG參數(這兩個隱藏參數始終是最后兩個參數)。
順便問一下,你認為我們如何用語法來列出語法名詞短語?好吧,如果我們使用的是DCG規則np—>det,n(即,一個沒有額外參數的規則),我們就可以進行查詢
?-np(NP,[]).
因此,鑒于我們剛剛了解到的額外參數,我們需要提出查詢并不奇怪
?- np(X,NP,[]).
與我們的新DCG一起使用時。響應如下:
X = _2625
NP = [the, woman] ;
X = _2625
NP = [the, man] ;
X = _2625
NP = [a, woman] ;
X = _2625
NP = [a, man] ;
X = subject
NP = [he] ;
X = subject
NP = [she] ;
X = object
NP = [him] ;
X = object
NP = [her] ;
false
?? ? ??最后一句話:不要被我們示例語法的這種簡單性所誤導。額外的參數可以用來處理一些復雜的語法問題。DCG不再是過去最先進的語法開發工具,但它們也不是玩具。一旦知道如何使用額外的參數編寫DCG,就可以編寫一些相當復雜的語法。
建立解析樹
到目前為止,我們所討論的程序已經能夠識別語法結構(即,當被問及輸入是句子、名詞短語等時,它們可以正確回答是或否),并生成語法輸出。這是令人愉快的,但我們也希望能夠解析。也就是說,我們希望我們的程序不僅能告訴我們哪些句子是語法上的,而且能給我們分析它們的結構。特別是,我們想看看語法賦予句子的樹。
好吧,僅僅使用標準的prolog工具,我們實際上不能畫出漂亮的樹的圖片,但是我們可以構建清晰描述樹的數據結構。例如,對應于樹
我們可以使用以下項:
s(np(det(a),n(woman)),vp(v(shoots))).
當然:看起來不太好,但所有的信息都在圖上。而且,在一個像樣的圖形包的幫助下,很容易把這個項變成圖。
但我們如何讓DCGs建立這樣的項呢?實際上,這很簡單。畢竟,事實上,DCG在識別句子時必須找出樹的結構。所以我們只需要找到一種方法來跟蹤DCG發現的結構。我們通過添加額外的參數來實現這一點。以下是方法:
s(s(NP,VP)) —> np(NP),vp(VP).
np(np(DET,N)) --> det(DET),n(N).
vp(vp(V,NP)) --> v(V),np(NP).
vp(vp(V)) --> v(V).
det(det(the)) --> [the].
det(det(a)) --> [a].
n(n(woman)) --> [woman].
n(n(man)) --> [man].
v(v(shoots)) --> [shoots].
?? ? ??這里發生了什么?本質上,我們正在為規則左側的語法類別構建解析樹,而不是為規則右側的語法類別構建解析樹。考慮規則vp(vp(V,NP))-->v(V),np(NP)。當我們使用這個DCG進行查詢時,V in v(V)和NP in np(NP)將被實例化為表示解析樹的項。例如,也許V將被實例化為
v(shoots).
NP將被實例化為
np(det(a), n(wpman)).
由這兩種結構組成的vp對應的項是什么?顯然應該是這樣的:
vp(v(shoots),np(det(a),n(woman))).
這正是規則vp(vp(V,NP))-> v(V),np(NP)中給出的額外參數vp(V,NP)返回給我們的:一個函子為vp的項,并且其第一個和第二個自變量分別是V和NP的值。非正式地講:將V和NP項插入vp函子下。
為了解析句子“A woman shoots”,我們提出以下查詢:
?- s(T,[a,woman,shoots],[]).
也就是說,我們要求將額外的參數T實例化為該句子的解析樹。我們得到:
T = s(np(det(a),n(woman)),vp(v(shoots)))
true
此外,我們可以通過執行以下查詢來生成所有解析樹:
?- s(T,S,[]).
前三個響應是:
T = s(np(det(the),n(woman)),
vp(v(shoots),np(det(the),n(woman))))
S = [the,woman,shoots,the,woman] ;
T = s(np(det(the),n(woman)),
vp(v(shoots),np(det(the),n(man))))
S = [the,woman,shoots,the,man] ;
T = s(np(det(the),n(woman)),
vp(v(shoots),np(det(a),n(woman))))
S = [the,woman,shoots,a,woman]
簡而言之,我們剛剛看到了一個優雅的(有用的)示例,說明如何使用合一來構建結構。
額外的參數也可以用來構建語義表示。現在,我們沒有談論任何DCG中的單詞的含義。事實上,現在人們對自然語言的語義已經有了很多的了解,而且建立語義表示法是非常容易的,它可以部分地捕捉句子甚至整個語篇的語義。這種表示通常是某種形式語言(例如一階邏輯、語篇表示結構或數據庫查詢語言)的表達式,它們通常是組合構建的。也就是說,每個單詞的意義都是用形式語言表達的;這個意義是作為單個單詞的DCG條目中的額外參數給出的。然后,對于語法中的每個規則,一個額外的參數顯示如何組合兩個子組件的含義。例如,對于規則s —> np,vp,我們將添加一個額外的參數,說明如何將np含義和vp含義組合起來形成s含義。盡管語義構建過程有些復雜,但它與我們從句子子部分的解析樹構建句子的解析樹的方式非常相似。
超越上下文無關的語言
在上一章中,我們介紹了DCG作為一種有用的Prolog工具,用于表示和使用上下文無關的語法。現在,這當然是思考DCG的一種好方法,但這還不是全部。事實是:DCG可以處理的不僅僅是上下文無關的語言。我們一直在討論的額外論點(實際上,我們不久將介紹的額外目標)為我們提供了應對任何可計算語言的工具。我們將通過為形式語言anbncn?\ {?}提供一個簡單的DCG來說明這一點。
形式語言anbncn?\ {?}由as,bs和cs組成的所有非空字符串組成,其中包括a的連續塊,bs的連續塊和cs的連續塊,所有具有相同長度的三個塊。例如,abc,aabbcc和aaabbbccc都屬于anbncn?\ {?}。
有趣的是,這種語言不是上下文無關的,你想怎么寫就怎么寫,你就不能成功地寫出上下文無關的語法來精確地生成這些字符串。證明這一點會讓我們走得太遠,但證明并不特別困難,你可以在許多關于形式語言理論的書籍中找到它。
另一方面,正如我們現在所看到的,編寫生成這種語言的DCG非常容易。就像上一章一樣,我們將字符串表示為表。例如,字符串abc將使用表[a,b,c]表示。根據這個約定,這是我們需要的DCG:
s(Count) --> ablock(Count),bblock(Count),cblock(Count).
ablock(0) --> [].
ablock(succ(Count)) --> [a],ablock(Count).
bblock(0) --> [].
bblock(succ(Count)) --> [b],bblock(Count).
cblock(0) --> [].
cblock(succ(Count)) --> [c],cblock(Count).
DCG的基礎思想很簡單:我們使用一個額外的參數來跟蹤塊的長度。?s規則只是說我們要一個as塊,一個bs塊,再一個cs塊,并且三個塊的長度都相同,即Count。
Count的值應該是什么?顯而易見的答案是:1、2、3、4,依此類推。但是,到目前為止,我們還不知道如何將DCG和算術混合使用,因此這不是很有幫助。幸運的是,如本DCG所示,這是一種更簡單(更優雅)的方式。就像我們用0表示數字0一樣,用succ(0)表示數字1,用succ(succ(0))表示數字2,用succ(succ(succ(0)))表示數字3,依此類推,就像我們在第3章中做了(就像我們在第3章中所說的,您可以將succ理解為“的繼承人”)。這種符號選擇使我們能夠使用統一計數。
這正是我們新的DCG所做的。例如,假設我們提出以下查詢:
?- s(Count,L,[]).
它要求Prolog生成屬于該語言的符號表L,并給出生成每個項目所需的Count值。然后前四個響應是:
Count = 0
L = [] ;
Count = succ(0)
L = [a, b, c] ;
Count = succ(succ(0))
L = [a, a, b, b, c, c] ;
Count = succ(succ(succ(0)))
L = [a, a, a, b, b, b, c, c, c]
Count的值顯然對應于塊的長度。
因此:DCG不僅是用于處理上下文無關文法的工具,它們的功能還遠遠不止這些,而且(如我們所見),部分額外的功能來自使用額外的參數。
2 ??額外目標
對于常規的Prolog規則,任何DCG規則實際上都是語法糖。因此,允許我們使用其他參數并不奇怪。同樣,我們可以從DCG規則的右側調用任何Prolog謂詞也就不足為奇了。
例如,通過調用Prolog的內置算術功能,可以將上一部分的DCG調整為使用Prolog編號(而不是數字的后繼表示形式)。我們只計算生成了as,bs和cs的數量。這是代碼:
s --> ablock(Count),bblock(Count),cblock(Count).
ablock(0) --> [].
ablock(NewCount) --> [a],ablock(Count),
{NewCount is Count + 1}.
bblock(0) --> [].
bblock(NewCount) --> [b],bblock(Count),
{NewCount is Count + 1}.
cblock(0) --> [].
cblock(NewCount) --> [c],cblock(Count),
{NewCount is Count + 1}.
如本例所示,可以在DCG規則的右側(任何地方)編寫額外的目標,但必須將其放置在大括號之間。當Prolog在將DCG轉換為其內部表示形式時遇到此類大括號時,它只將花括號之間指定的額外目標進行轉換。因此,上述非終端ablock的第二條規則將轉換為:
ablock(NewCount,A,B):-
’C’(A, a, C),
ablock(Count, C, B),
NewCount is Count + 1.
順便說一下,如果您使用此DCG,您會發現它實際上存在一些問題。與上一節中看到的相反,此新版本僅在識別模式下使用時才能正確運行。如果嘗試使用它生成,它將在某個時候進入無限循環。我們不會在這里解決此問題(除了其他方面,我們發現較早的基于succ的方法更為優雅)。
在DCG規則的右側添加任意Prolog目標的可能性使DCG非常強大(這意味著我們可以做普通Prolog中可以做的任何事情)。但是,一般而言,此功能使用不多,這往往表明基本的DCG標記設計得很好。但是,在計算語言學中有一個經典的應用程序可以實現額外的目標:借助額外的目標,我們可以將語法規則和詞匯信息整齊地分開。讓我們看看如何。
分隔規則和詞典
我們將規則和詞典分開。也就是說,我們將消除DCG中所有提及單個詞的內容,而是將所有有關單個詞的信息分別記錄在詞典中。要了解其含義,請返回基本語法:
np --> det,n.
vp --> v,np.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
v --> [shoots].
現在,我們要編寫一種DCG,該DCG生成完全相同的語言,但是沒有規則提及任何單個單詞。有關單個單詞的所有信息將單獨記錄。
這是一個(非常簡單的)詞典的示例。詞匯條目是使用謂詞lex / 2進行編碼的,謂詞lex / 2的第一個參數是單詞,第二個參數是句法類別。
lex(the,det).
lex(a,det).
lex(woman,n).
lex(man,n).
lex(shoots,v).
?? ? ??這是此詞典可以使用的簡單語法。從本質上講,它與上一個相同。實際上,唯一改變的規則是那些提到特定單詞的規則,即det,n和v規則。
np --> det,n.
vp --> v,np.
vp --> v.
det --> [Word],{lex(Word,det)}.
n --> [Word],{lex(Word,n)}.
v --> [Word],{lex(Word,v)}.
考慮新的det規則。該規則部分說“ det可以包含一個包含單個元素Word的表”(請注意Word是一個變量)。然后,額外的目標添加了至關重要的規定:“只要Word與詞典中列出的確定詞合一即可”。對于我們目前的詞典,這意味著Word必須與單詞“ a”或“ the”匹配。因此,這條規則取代了先前的兩個DCG規則det。
這解釋了將規則與詞典分離的“how”,但沒有解釋“why”。真的那么重要嗎?這種寫DCG的新方法真的好嗎?
答案是肯定的!它要好得多,至少有兩個原因。
第一個原因是理論上的。可以說,規則不應提及特定的詞匯項目。規則的目的是列出一般的語法事實,例如句子可以由名詞短語和動詞短語組成的事實。?s,np和vp的規則描述了這樣的一般語法事實,但是det,n和v的舊規則卻沒有。取而代之的是,舊規則只是列出了特定的事實:“ a”是確定因素,“ the”是確定因素,依此類推。從理論的角度來看,只有一條規則說“任何事物都是決定因素(或名詞,動詞或任何事物,?其他語法類別)(如果在詞典中這樣列出)。當然,這正是我們新的DCG規則所說的。
第二個原因是更實際的。計算語言學家在過去二十年左右的時間里學到的關鍵課程之一是,詞典是迄今為止最有趣,最重要(且最昂貴!)的語言知識庫。坦率地說,如果您想從計算的角度掌握自然語言,則需要了解很多單詞,并且需要了解很多有關單詞的知識。
現在,我們的小詞典及其簡單的兩位詞典條目成為了一個玩具。但是,真正的詞典不是(最強調!)。真實的詞典可能很大(可能包含成千上萬個單詞),而且與每個單詞相關的信息可能非常豐富。我們的詞法條目僅給出每個單詞的句法類別,但是真正的詞庫將給出更多信息,例如有關其語音,形態,語義和語用屬性的信息。
因為真實的詞典既大又復雜,所以從軟件工程的角度來看,最好編寫具有簡單,定義明確的方法的簡單語法,以從大量詞典中提取所需的信息。也就是說,應將語法視為可以訪問詞典中包含的信息的單獨實體。然后,我們可以使用專門的機制來有效地存儲詞典并從中檢索數據。
我們的新DCG規則雖然簡單,但卻說明了基本思想。新規則確實只列出了一般的語法事實,而額外的目標充當了我們詞典的接口,從而使規則可以準確地找到所需的信息。此外,我們現在利用Prolog的第一個參數索引功能,可以使在詞典中查找單詞的效率更高。第一個參數索引是一種使Prolog知識庫訪問更加有效的技術。如果在查詢中實例化了第一個參數,則它允許Prolog忽略第一個參數的函子和參數數量不同的所有子句。例如,這意味著我們可以立即獲得所有可能的人類別甚至不必查看詞典中可能存在的所有其他成百上千個單詞的詞典條目。
3 ??結束語
現在,我們對DCG是什么以及它們可以為我們做什么有相當有用的了解。總而言之,讓我們從更高的層次,從形式和語言的角度來考慮它們。
首先是正式講話。在大多數情況下,我們已將DCG展示為一種簡單的工具,用于對上下文無關的語法(或富含主語和賓語等特征的上下文無關的語法)進行編碼。但是DCG不僅于此。我們看到有可能編寫DCG來生成不是上下文無關的語言。實際上,任何程序都可以用DCG表示法編寫。也就是說,DCG本身就是一種成熟的編程語言(使用適當的術語,它們是圖靈完備的)。盡管DCG通常與語言應用程序相關聯,但它們可用于其他目的。
從語言角度看,DCG有多好?好吧,好壞參半。在一個階段(1980年代初),它們幾乎是最先進的。他們使以清晰的方式編寫復雜的語法成為可能,并探索了句法和語義觀念的相互作用。當然,任何計算語言學的解析歷史都會給DCG帶來榮譽。
但是,DCG具有缺點。首先,當目標排序錯誤時(他們在上一章中看到了為聯結添加左遞歸規則的示例),他們傾向于循環的趨勢令人討厭。我們在編寫嚴肅的語法時不想考慮這些問題。此外,雖然添加額外參數的功能很有用,但如果我們需要使用大量參數(對于大語法,我們會使用),則它是一種相當笨拙的機制。
但是,請務必注意,由于Prolog解釋DCG規則的方式而出現了這些問題。它們不是DCG表示法固有的。那些研究過解析算法的人可能都知道所有自頂向下的解析器都在左遞歸語法上循環,因此Prolog以自頂向下的方式解釋DCG的過程在左遞歸語法規則上循環也就不足為奇了。?s—> s conj s。如果我們使用不同的策略來解釋DCG,例如自底向上的策略,我們將不會遇到相同的問題。同樣,如果我們不使用Prolog對DCG的內置解釋,則可以使用額外的參數來更復雜地指定功能,例如?這將有助于使用大型特征結構。
綜上所述,如今DCG可能最好被視為定義帶有某些功能增強的上下文無關文法的好記法,一種表示(忽略左遞歸)兼用作解析器/識別器的記法,也就是說,最好將它們視為方便的工具。用于測試新的語法思想,或用于為特定應用程序實施合理的復雜語法。?DCG不再是最新技術,但它們很有用。即使您以前從未編程過,也只需使用到目前為止所學的知識,就可以開始嘗試進行相當復雜的語法編寫。使用傳統的編程語言(例如C ++或Java),根本不可能?這么快到達這個階段。使用功能性語言(例如Lisp,Caml或Haskell)會更容易,但是即使如此,對于初學者是否能這么早地完成如此之舉還是值得懷疑的。
4?練習
練習8.1??這是我們的基本DCG:
s --> np,vp.
np --> det,n.
vp --> v,np.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
n --> [apple].
n --> [pear].
v --> [eats].
假設我們添加名詞“ men”(復數)和動詞“ know”。然后,我們需要一個DCG,說“The men eat”可以,“The man eats”可以,“The men eats”不能,而“The man eat”不能。更改DCG,使其正確處理這些句子。使用額外的參數來應對單數/復數區別。
練習8.2 ??在本文中,我們僅給出了帶有一個額外參數的DCG規則示例,但實際上您可以根據需要添加任意數量的額外參數。這是DCG規則,其中包含三個額外的參數:
kanga(V,R,Q) --> roo(V,R),jumps(Q,Q),{marsupial(V,R,Q)}.
將其轉換為Prolog使用的形式。
5 ??實踐環節
練習8的目的是幫助您熟悉使用附加參數和目標的DCGs。
首先是一些鍵盤練習:
1.使用DCG跟蹤一些示例,該DCG使用額外的參數來處理主題之間的區別,DCG生成解析,而DCG使用額外的目標來分隔詞典和規則。確保您完全了解所有三個DCG的工作方式。
2.在DCG上對文本中給出的anbncn進行跟蹤(給Count變量賦值為0,succ(0),succ(succ(0)等)。嘗試使用as,bs和cs這三個塊的長度確實相同的情況,以及不存在這種情況的查詢。
現在進行一些編程。我們建議以下微型項目,它借鑒了您到目前為止所學的所有知識。順便說一句,在第12章末尾的實踐環節上,我們將要求進一步擴展這項工作,因此請認真對待該項目。
1.首先,將我們學到的所有關于DCG的英語知識匯總到一個DCG中。特別是,在本文中,我們看到了如何使用額外的參數來處理主語/賓語的區別,在練習中,您被要求使用額外的參數來處理單數/復數的區別。編寫處理這兩個問題的DCG。此外,以這樣一種方式編寫DCG:它將生成解析樹,并使用單獨的詞典。
2.完成此操作后,請擴展DCG,以便可以用形容詞和簡單的介詞短語來修飾名詞短語(也就是說,它應該能夠處理名詞短語,例如“the small frightened woman on the table”或“the big fat cow under the shower”)。然后,進一步擴展它,以便正確處理第一,第二和第三人稱代詞之間的區別(以主語和賓語形式)。
總結
以上是生活随笔為你收集整理的根据文法画出语法树_更多确定子句语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python网页优化_python大佬养
- 下一篇: python字典里存字符_Python字