Удаление левой рекурсии в DCG - Пролог

У меня небольшая проблема с левой рекурсией в этой грамматике. Пытаюсь написать на Прологе, но не знаю, как убрать левую рекурсию.

<expression> -> <simple_expression>
<simple_expression> -> <simple_expression> <binary_operator> <simple_expression>
<simple_expression> -> <function>
<function> -> <function> <atom>
<function> -> <atom>
<atom> -> <number> | <variable>

<binary_operator> -> + | - | * | /

expression(Expr) --> simple_expression(SExpr), { Expr = SExpr }.
simple_expression(SExpr) --> simple_expression(SExpr1), binary_operator(Op), simple_expression(SExpr2), { SExpr =.. [Op, SExpr1, SExpr2] }.
simple_expression(SExpr) --> function(Func), { SExpr = Func }.
function(Func) --> function(Func2), atom(At), { Func = [Func2, atom(At)] }.
function(Func) --> atom(At), { Func = At }.

Я написал что-то подобное, но это вообще не сработает. Как изменить его, чтобы эта программа работала?

6
задан Transfinite Numbers 5 June 2016 в 21:59
поделиться