2014-11-29 1 views
1

술어 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)) 경우 다음 E2add(lit(2), add(lit(3), add(lit(4), lit(5))))

나는 모든 프롤로그 편안하지 않다해야하고, 나는 그것으로 많은 경험이없는 :와 같은 표현은 정의된다. 그 말로는, 나는 작동하지 않는 다음과 같은 글을 써 보았고 어떻게 작동시키는 지 모릅니다. 어떤 도움을 주셔서 감사합니다.

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

하지만 ... 우리는 어떻게 이것에 대해 확신 할 수 있습니까? 어쩌면 잘못된 것일 수도 있습니다.

0

니스 문제는 변환

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). 
(나에게, 그냥 쉽게 읽을 수) 좀 상수의 이름을 변경

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

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

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

'l2r (1- (a + b + c), B)'와 비슷합니다. – false

+0

no diff'rence ... – false

+0

@false : 알아요, 나는 트리 변형에 대한 힌트를 원했기 때문에 정확한 심볼 세트를 건너 뛰었습니다. 나는 목적에 따라 이름이 바뀌었다 ... – CapelliC

관련 문제