2016-11-18 105 views
1

以兩種方式之一定義可以描述副詞的短語的最佳方式是什麼?Prolog中的明確子句語法 - 或者語句

你能不能說:

  1. adverb_phrase(N,進階(N,高級)) - >路1
  2. adverb_phrase(N,進階(N,高級)) - >路2.

我試過這樣做,但我得到的變量(如_G12345)在輸出,看起來不正確。

回答

2

,告訴你什麼是絕對是一個有效的方式在  DCG中狀態的替代品。

還有其他的選擇。這裏有一些:

1.您的版本

這是您的版本,只延伸到一個較爲完整的例子:

 
adverb_phrase(N, adv(N,Adv)) -->adv1(Adv). 
adverb_phrase(N, adv(N,Adv)) -->adv2(Adv). 

adv1(likely) --> []. 
adv2(happily) --> []. 

實例查詢和回答:

 
?- phrase(adverb_phrase(N,A), Ls). 
A = adv(N, likely), 
Ls = [] ; 
A = adv(N, happily), 
Ls = []. 

兩個解決方案可以在回溯中找到。變量N也出現在查詢中。我不知道你爲什麼介紹 吧,如果你不需要它,你可以簡單地省略 它。

2.更緊湊

使用不同的規則來表示替代品是直接的。請注意,您可以重構代碼,使其更 緊湊:

 
adverb_phrase(N, adv(N,Adv)) -->adv(Adv). 

adv(likely) --> []. 
adv(happily) --> []. 

在這種情況下,我只是用相同非終結符號來表示的替代品。

3.使用('|')//2

注意,也有其他方式表示的替代品。一種優雅的方式是使用('|')//2,類比於其他形式中經常指出的替代方法。

例如,你可以寫你最初的例子如:

 
adverb_phrase(N, adv(N,Adv)) -->adv1(Adv) | adv2(Adv). 

adv1(likely) --> []. 
adv2(happily) --> []. 

相反的('|')//2,你也可以使用(;)//2如果你想,類似於純Prolog的 。

顯示的變體產生完全相同的答案。您選擇的版本取決於幾個因素,例如:您是否在「語法」中使用更多的  DCG,或者使用「monad」意義上的更多。

對於您的特定情況,版本  2似乎很適合從第一印象。

請注意,這些選項都不是「或陳述」。我們稱這些爲nonterminals

+1

感謝您爲我詳細闡述! – Dazzler95