Prolog中的确定子句语法 - 或声明

时间:2016-11-18 17:06:57

标签: prolog dcg

以两种方式之一定义可以描述副词的短语的最佳方法是什么?

你能说:

  1. adverb_phrase(N,adv(N,Adv)) - >方式1.
  2. adverb_phrase(N,adv(N,Adv)) - >方式2。
  3. 我尝试过这样做,但我在输出中得到变量(如_G12345),看起来并不正确。

1 个答案:

答案 0 :(得分: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版似乎非常适合第一印象。

请注意,这些选项都不是“或语句”。我们称之为非终结