1

我正在使用 Prolog 算术,并且有一个程序可以生成抽象语法树,例如plus(num(1),num(2))is 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].

等等,但想num(num(x)) --> [x].对大于 3 的数字做类似的事情。关于如何解决这个问题的任何想法?

4

1 回答 1

3

怎么样:

num(num(X)) --> [X], {X > 3}

{}/1 可用于在 DCG 语法规则中嵌入条件和副作用。DCG 存在于许多 Prolog 系统中,但还没有成熟的标准。但大多数 Prolog 系统都具有 {}/1。例如在这里定义:

定从句语法规则
Klaus Daessler
2013 年 8 月 20 日
http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dcgs/dcgsdin130820.pdf

在词汇表中,{}/1 是“语法主体目标”。在较早的出版物中,该构造被称为“辅助动作”、“程序调用”或“额外条件”,这可能比仅将其称为语法体目标更明智,因为我们希望将语法体的所有组成部分视为语法体目标。例如,请参见此处:

语言分析的定句语法
Fernando CN Pereira 和 David HD Warren
人工智能 13 (1980), 231-278
http://cgi.di.uoa.gr/~takis/pereira-warren.pdf

再见

于 2014-02-14T19:14:49.460 回答