Tôi gặp vấn đề nhỏ với đệ quy trái trong ngữ pháp này. Tôi đang cố gắng viết nó trong Prolog, nhưng tôi không biết cách loại bỏ đệ quy trái.Xóa đệ quy trái trong DCG - Prolog
<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 }.
Tôi đã viết một cái gì đó tương tự, nhưng nó sẽ không hoạt động chút nào. Làm thế nào để thay đổi nó để có được chương trình này làm việc?
Vâng, cách tiếp cận cổ điển để loại bỏ đệ quy trái bằng cách thay đổi ngữ pháp và sử dụng bộ tích lũy. Đã cho tôi một vài năm để theo liên kết "ở đây" của bạn. –