prolog - DCG : zero-or-more, 出现零次或一次、一次或多次?

标签 prolog repeat dcg

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

我正在用伪代码讨论以下内容:

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

最佳答案

您使用谓词的子句集提供的或不确定性(或者,在本例中,相同 DCG“非终结符”的 DCG 产生式集 - DCG 产生式是 Horn 子句的替代表示法)

将应首先执行的产生式移至顶部。例如,贪婪地收集至少一个单词,但可能更多:

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

根据语法中确定性的程度,您甚至可以剪切:

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

与 float 相同。 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) ; [].

关于prolog - DCG : zero-or-more, 出现零次或一次、一次或多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65484604/

相关文章:

iPhone 开发者--performSelector :withObject:afterDelay or NSTimer?

python - 如何使用函数本身返回的值重复函数?

用 Prolog 编写的 RegEx 解析器

io - 在序言中读取文件

序言匿名变量

prolog - "Returning"Prolog 中谓词的列表

swift - 两个本地通知一起安排并一起显示,但我在 swift 中有不同的时间

prolog - 向 DCG Prolog 寻求答案

prolog - Prolog 中的启发式搜索

tree - 使用累加器的树的大小