2011-06-30 28 views
6

據我瞭解,在Prolog中捕捉功能,在分析,像這樣:Prolog DCGs多功能?

foo(feature(X)) --> [X], bar. 

這是常見的設計時DCG中?

foo(featureA(X), featureB(Y)) --> [X], [Y], bar. 

回答

5

DCGs描述列表和非終端的論點之間的關係。但是,這些論點只是術語。它們可以用來表示特徵,但不直接表示它們。爲了看到不同之處,假設您想要將特徵值指定給每個節點。在DCG中,您現在需要根據具體情況決定如何表示該功能。在一個節點中它是feature(X, singular),而在另一個節點中它可能看起來不同。或者您可能決定用列表統一表示所有功能,因此[nodename=idx,..., numerus=singular,...]

+0

什麼是均勻地表示它們作爲一個列表,而不是作爲化合物(β)項的優點/缺點? – dnolen

+2

它更統一:所以提取功能要簡單得多。將特徵放入某些複合術語的參數意味着您必須爲每種複合術語編寫訪問代碼。 – false

4

它非常有效,而且非常有用。作爲一個例子,考慮這個規則,從經典的(現在免費的!)書PNLA,它使用兩個參數來捕捉及物動詞tv的拐點和「意義」(邏輯形式,LF)採取:

tv(nonfinite,  LF) --> [TV], {tv(TV, _, _, _, _, LF)}. 
tv(finite,   LF) --> [TV], {tv(_, TV, _, _, _, LF)}. 
tv(finite,   LF) --> [TV], {tv(_, _, TV, _, _, LF)}. 
tv(past_participle, LF) --> [TV], {tv(_, _, _, TV, _, LF)}. 
tv(pres_participle, LF) --> [TV], {tv(_, _, _, _, TV, LF)}. 

甲動詞然後可以定義爲

tv(write, writes, wrote,  written, writing, X^Y^ `writes(X,Y) ). 

See full example.

+0

僅僅指出,除非事實(例如'tv/6')被所有參數索引,否則單詞形式(例如'書面')的查找將是緩慢的。更快的詞典表示將是電視(寫,過去部分,X^Y ^寫(X,Y))'。 – Kaarel

+0

@Kaarel:好點,我沒有考慮索引。 –