2016-11-18 27 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