我正在尝试编写谓词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)).
答案 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)).