Арифметическое выражение в Prolog

Мне дана контекстно-свободная грамматика, которая определяет, какое действительное арифметическое выражение находится в данной ситуации. И вопрос заключается в том, чтобы написать его в haskell и Prolog. Вот CFG.

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 является арифметическим выражением, должно оцениваться как true, если оно действительно является выражением, которое является истинным по определению CFG. До сих пор я писал это, но я не думаю, что это правильно. Так помогите мне понять это.

expr(lit(i), i).
expr(add(expr(), expr()), Res).
expr(sub(expr(), expr()), Res).
1 ответ

Поскольку вам не требуется оценивать выражение, код может быть

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

licensed under cc by-sa 3.0 with attribution.