Prolog中的算术表达式

Prolog中的算术表达式,prolog,dcg,Prolog,Dcg,我得到了一个上下文无关语法,它定义了在给定情况下有效的算术表达式是什么。问题是用haskell和Prolog来写。这是CFG Expr ::= lit(i) | add(Expr, Expr) | sub(Expr, Expr) 在哈斯克尔,这相当简单。我只是使用一种数据类型,称之为Expr,然后我就可以了。以下是我写的: data Expr = Lit Integer | Add Expr Expr | Sub Expr Expr 但我对用P

我得到了一个上下文无关语法,它定义了在给定情况下有效的算术表达式是什么。问题是用haskell和Prolog来写。这是CFG

Expr ::= lit(i)
| add(Expr, Expr)
| sub(Expr, Expr)
在哈斯克尔,这相当简单。我只是使用一种数据类型,称之为Expr,然后我就可以了。以下是我写的:

data Expr = Lit Integer |
            Add Expr Expr |
            Sub Expr Expr
但我对用Prolog编写它感到相当困惑。此外,运行expr(E),其中E是一个算术表达式,如果根据CFG的定义它确实是一个有效的表达式,则应计算为true。到目前为止,我写了这篇文章,但我认为它不正确。帮我弄清楚

expr(lit(i), i).
expr(add(expr(), expr()), Res).
expr(sub(expr(), expr()), Res).

因为不需要对表达式求值,所以代码可以是

expr(lit(_)).
expr(add(E1,E2)) :- expr(E1), expr(E2).
expr(sub(E1,E2)) :- expr(E1), expr(E2).

这不是CFG!终端符号在哪里?假设它是一个非正式的符号CFG,如果它有任何关系的话。终端符号应该是lit(i)中的i。那不是CFG。那add呢?我知道你的意思,但这就是问题的措辞。所以我对此无能为力。你还建议我们怎么称呼这种结构?