2015-12-03 19 views
3

我試圖在Prolog中瞭解更多關於DCG的內容,同時通過閱讀不同來源,我注意到在某些情況下,短語並未被使用?什麼時候在Prolog中使用短語?

從瞭解的Prolog現在的網站,它提出這個例子:

s --> np,vp. 
np --> det,n. 
vp --> v,np. 
vp --> v. 
det --> [the]. 
det --> [a]. 
n --> [woman]. 
n --> [man]. 
v --> [shoots]. 

然後,他們使用查詢s(X,[])來生成語法的所有句子。 我試過phrase(s,L),它也產生了語法描述的所有句子。

使用s(X,[])phrase(s,L)有什麼區別?何時應該使用短語?

+2

你的意思是'(X,[])'不是'([],X)'。查詢'([],X)'將失敗。 :) – lurker

回答

2

應始終使用phrase/2-3謂詞來訪問語法規則。當實例化第一個參數時,應該期望Prolog編譯器將phrase/2-3調用轉換爲對編譯調用語法規則生成的謂詞的調用。因此,使用phrase/2-3謂詞不應該有開銷。

+1

使用s(X,[])''''np([a,woman],[])'和其他相同形式的查詢是不好的做法嗎?如果是這樣,爲什麼這些做法會被用於學習資料? – user5636966

+0

從Prolog早期的壞習慣,我認爲。 –

+2

現在是學習Prolog的壞建議!網站。他們甚至不提「短語/ 2-3」。 – lurker

2

實際上,SWI-Prolog的執行類型檢查(參數必須適當列表),然後使用短語/ 3時,顯示出的性能損失。另外,爲了允許使用DCG並執行'狀態線程',即將狀態傳播轉交給隱藏參數,已經引入了call_dcg/3。

但是,對於正常使用 - 詞法分析和生成短語是要走的路。

+0

是的,但在這種情況下,SWI-Prolog類型檢查非常輕。在最近的版本中,它只檢查第二個和第三個參數是變量還是有一個列表函子。 –

相關問題