2014-12-03 101 views
1

我给出了一种上下文无关语法,它定义了给定情况下有效的算术表达式的含义。问题在于把它写在haskell和Prolog中。这是CFG。Prolog中的算术表达式

Expr ::= lit(i) 
| add(Expr, Expr) 
| sub(Expr, Expr) 

在Haskell中它相当简单。我只是使用数据类型,将其称为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). 
+0

这是** **不是一个CFG!终端符号在哪里? – false 2014-12-03 10:26:42

+0

让我们假设它是一个非正式的,象征性的CFG,如果它很重要的话。 – 2014-12-03 10:28:58

+0

终端符号喊我点燃(i)。 – 2014-12-03 10:31:18

回答

3

既然你不需要评估表达,代码可能是

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