Prolog 将表达式转换为右括号形式的谓词?

Prolog 将表达式转换为右括号形式的谓词?,prolog,Prolog,我正在尝试编写一个谓词rightBrack(E1,E2),其中E2是表达式E1,但格式为右括号。表达式定义为: Expr ::= lit(i) |add(Expr, Expr) |sub(Expr, Expr) 因此,例如,如果E1=add(add(add)(add(lit(2),lit(3)),lit(4)),lit(5))那么E2应该是add(lit(2),add(lit(3),add(lit(4),lit(5)) 我对Prolog一点也不舒服,而且我

我正在尝试编写一个谓词
rightBrack(E1,E2)
,其中
E2
是表达式
E1
,但格式为右括号。表达式定义为:

 Expr ::= lit(i)
         |add(Expr, Expr)
         |sub(Expr, Expr)
因此,例如,如果
E1=add(add(add)(add(lit(2),lit(3)),lit(4)),lit(5))
那么
E2
应该是
add(lit(2),add(lit(3),add(lit(4),lit(5))

我对Prolog一点也不舒服,而且我对它也没有太多的经验。话虽如此,我还是试着写了以下不可行的东西,我不知道如何让它起作用。感谢您的帮助

rightBrack(add(add(E1, E2), E3), add(E4, add(E5, E6))) :-
   rightBrack(E1, E4),
   rightBrack(E2, E5),
   rightBrack(E3, E6).
rightBrack(add(E1, E2), add(E3, E4)) :-
   rightBrack(E1, E3),
   rightBrack(E2, E4).
rightBrack(sub(E1, E2), sub(E3, E4)) :-
   rightBrack(E1, E3),
   rightBrack(E2, E4).
rightBrack(lit(N), lit(N)).

但是。。。我们如何确定这一点?也许它也不正确?

问题很好,转换需要从

?- draw(add(add(add(lit('2'), lit('3')), lit('4')),lit('5'))).

               add
                |
            +-------+
           add     lit
            |       |
        +------+    |
       add    lit   |
        |      |    |
     +----+    |    |
    lit  lit   |    |
     |    |    |    |
     |    |    |    |
     2    3    4    5

我重命名了一些常量(对我来说,只是更容易阅读)

小型测试:

?- l2r(+(+(+(1,2),3),4),R),display(R).
+(1,+(3,+(2,4)))
R = 1+ (3+ (2+4)).

?- l2r(+(1,+(+(2,3),4)),R),display(R).
+(1,+(2,+(3,4)))
R = 1+ (2+ (3+4)).

@false:我知道,我只是想得到关于树转换的提示,所以我跳过了确切的符号集。我故意改名了。。。
?- draw(add(lit('2'), add(lit('3'), add(lit('4'), lit('5'))))).

            add
             |
     +---------+
    lit       add
     |         |
     |    +-------+
     |   lit     add
     |    |       |
     |    |    +----+
     |    |   lit  lit
     |    |    |    |
     |    |    |    |
     2    3    4    5
l2r(+(A,B),+(C,D)) :-
    l2r(A,B, C,D), !.
l2r(A, A).

l2r(+(A1,A2),B1, A3,+(A4,B2)) :-
    l2r(A1,B1, A3,B2),
    l2r(A2,A4).
l2r(A1,+(B1,B2), A2,+(B3,B4)) :- % as noted by @false
    l2r(B1,B2, B3,B4),
    l2r(A1,A2).
l2r(A,B, A,B).
?- l2r(+(+(+(1,2),3),4),R),display(R).
+(1,+(3,+(2,4)))
R = 1+ (3+ (2+4)).

?- l2r(+(1,+(+(2,3),4)),R),display(R).
+(1,+(2,+(3,4)))
R = 1+ (2+ (3+4)).