让我们考虑以下prolog代码,它允许我形成表达式树:
plus(_,_).
eval(A, A) :- number(A).
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.
我可以通过以下方式轻松定义和评估表达式树:
eval(plus(1,2), R).
评估为
R=3
有些语言允许我们构建表达式树,然后将它们分配给变量,以便以后可以使用它们。在伪代码中:
my_expr = plus(plus(1, 2), 3)
我想知道我目前的树形表示是否能够达到类似的效果?我希望在每个节点中都有一个包含不同表达式树的列表。
的内容[ plus(1, 2), plus(3,plus(2,1)), 3 ]
答案 0 :(得分:1)
为您的例子
my_expr = plus(plus(1, 2), 3)
你不能这样做b / c左手和右手边的=不匹配。如果my_expr是一个变量(大写),那么这将是真的并且会导致my_expr绑定到树加(加(1,2),3)。看看这个 -
?- My_expr = plus(plus(1, 2), 3),
eval(plus(My_expr, My_expr), Times2).
Times2 = 12
My_expr是一个完全合法的结构,可以放入列表或调用下游表达式。