以兩種方式之一定義可以描述副詞的短語的最佳方式是什麼?Prolog中的明確子句語法 - 或者語句
你能不能說:
- adverb_phrase(N,進階(N,高級)) - >路1
- adverb_phrase(N,進階(N,高級)) - >路2.
我試過這樣做,但我得到的變量(如_G12345)在輸出,看起來不正確。
以兩種方式之一定義可以描述副詞的短語的最佳方式是什麼?Prolog中的明確子句語法 - 或者語句
你能不能說:
我試過這樣做,但我得到的變量(如_G12345)在輸出,看起來不正確。
是,告訴你什麼是絕對是一個有效的方式在 DCG中狀態的替代品。
還有其他的選擇。這裏有一些:
這是您的版本,只延伸到一個較爲完整的例子:
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
也出現在查詢中。我不知道你爲什麼介紹 吧,如果你不需要它,你可以簡單地省略 它。
使用不同的規則來表示替代品是直接的。請注意,您可以重構代碼,使其更 緊湊:
adverb_phrase(N, adv(N,Adv)) -->adv(Adv). adv(likely) --> []. adv(happily) --> [].
在這種情況下,我只是用相同非終結符號來表示的替代品。
('|')//2
注意,也有其他方式表示的替代品。一種優雅的方式是使用('|')//2
,類比於其他形式中經常指出的替代方法。
例如,你可以寫你最初的例子如:
adverb_phrase(N, adv(N,Adv)) -->adv1(Adv) | adv2(Adv). adv1(likely) --> []. adv2(happily) --> [].
相反的('|')//2
,你也可以使用(;)//2
如果你想,類似於純Prolog的 。
顯示的變體產生完全相同的答案。您選擇的版本取決於幾個因素,例如:您是否在「語法」中使用更多的 DCG,或者使用「monad」意義上的更多。
對於您的特定情況,版本 2似乎很適合從第一印象。
請注意,這些選項都不是「或陳述」。我們稱這些爲nonterminals!
感謝您爲我詳細闡述! – Dazzler95