以两种方式之一定义可以描述副词的短语的最佳方式是什么?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