DCG:零次或多次、零次或一次、一次或多次?

DCG : zero-or-more, zero-or-one , one-or-more occurrences?

在 DCG 中,您如何实现:零次或多次、零次或一次、一次或多次出现?

我在伪代码中谈论以下内容:

  sentence --> word+
  float --> int+, ['.'], int+
  nilORa --> a? 
  nilORaaaa --> a*

您使用谓词的子句集提供的 or-nondeterminism(或者,在这种情况下,同一 DCG“非终结符”的 DCG 产生式集 - DCG 产生式是 Horn 子句的另一种表示法)

将应该首先执行的制作移到顶部。例如,要收集至少一个 word,但可能更多,贪婪地:

sentence --> word, sentence.
sentence --> word.

根据语法中确定性的多少,你甚至可以削减:

sentence --> word, !, sentence.
sentence --> word.

与浮点数相同。 digits 至少是一位数。我认为库中已经有 digit 的定义:

float --> digits, ['.'], digits.

digits --> digit, digits.
digits --> digit.

nilORa 是一个 a -- 或者可能什么都不是:

nilORa --> a.
nilORa --> [].

nilORaaaa 是一个 a 后跟 nilORaaaa -- 或者可能什么都没有:

nilORaaaa --> a, nilORaaaa.
nilORaaaa --> [].

你应该也可以部署 ; 我认为:

nilORaaaa --> (a, nilORaaa) ; [].