我正在使用Prolog算法并且有一个生成抽象语法树的程序,例如plus(num(1),num(2))
,它只是1+2
。这是通过使用DCG完成的。在此示例中,plus(num(1),num(2))
与前缀列表表示[+,1,2]
相同。
我的问题是我只想允许num(x)
大于3.例如,num(4)
是允许的,但不是num(1)
。
我是这样做的:
num(num(4)) --> [4].
num(num(5)) --> [5].
num(num(6)) --> [6].
num(num(7)) --> [7].
等。但对于大于3的数字,我想对num(num(x)) --> [x].
做一些事情。对于如何处理这个问题有任何想法吗?
答案 0 :(得分:3)
怎么样:
num(num(X)) --> [X], {X > 3}
{} / 1可用于嵌入条件和副作用 在DCG语法规则中。在许多Prolog系统中都可以找到DCG 但还没有一个成熟的标准。但大多数Prolog 系统确实有{} / 1。例如,这里定义:
明确的条款语法规则
Klaus Daessler
2013年8月20日
http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dcgs/dcgsdin130820.pdf
在词汇表中,{} / 1作为“语法体目标”。在较旧的 该出版物被称为“辅助行动”,“程序” 称“或”额外条件“,这可能比更合理 只是称它为语法体目,因为我们希望看到所有 语法体的组成部分作为语法体目标。看看 例如:
语言分析的明确条款语法
Fernando C. N. Pereira和David H. D. Warren
人工智能13(1980),231-278
http://cgi.di.uoa.gr/~takis/pereira-warren.pdf
再见