Prolog 中的定子句语法 - Or 语句

Definite clause grammar in Prolog - Or statement

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

你能不能说:

  1. adverb_phrase(N,adv(N,Adv)) --> Way 1.
  2. adverb_phrase(N,adv(N,Adv)) --> Way 2.

我试过这样做,但我在输出中得到变量(如 _G12345),这看起来不正确。

,您所展示的绝对是 有效 在 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。

显示的变体产生完全相同的答案。您选择的版本取决于几个因素,例如:您是在 "grammar" 还是在 "monad" 意义上更多地使用 DCG。

对于您的具体情况,从第一印象来看,版本 2 似乎很合适。

请注意,这些选项都不是 "or statement"。我们称这些为 非终结符!