以两种方式之一定义可以描述副词的短语的最佳方法是什么?
你能说:
我尝试过这样做,但我在输出中得到变量(如_G12345),看起来并不正确。
答案 0 :(得分:2)
是,您展示的内容绝对是一种有效方式来说明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版似乎非常适合第一印象。
请注意,这些选项都不是“或语句”。我们称之为非终结!