2014-12-03 127 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).