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

时间:2014-11-29 06:57:38

标签: prolog

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

 Expr ::= lit(i)
         |add(Expr, Expr)
         |sub(Expr, Expr)

例如,如果E1 = 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)).

2 个答案:

答案 0 :(得分:2)

noadd(lit(_)).
noadd(sub(_,_)).

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

但是,......我们怎么能确定这一点?也许它也不正确?

答案 1 :(得分:0)

不错的问题,转换需要从

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

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

?- 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)).