在 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/