以下是以下问题:
对于这个问题,我们考虑二元表达式树,其叶子的形式为tree(empty, Num, empty)
,其中Num是数字,或tree(empty, z, empty)
在这种情况下我们会将字母z视为一种“变量”。
每棵树都是叶子或tree(L, Op, R)
形式,其中L和R是左右子树,而Op是算术运算符'+',' - ','*',' /'(表示加法,减法,乘法和除法)。
编写一个谓词tree_eval(Value, Tree, Eval)
,它将Eval绑定到评估表达式树Tree的结果,变量z set等于指定的Value。例如:
?- tree_eval(2, tree(tree(empty,z,empty),
'+',tree(tree(empty,1,empty),
'/',tree(empty,z,empty))), Eval).
Eval = 2.5 ;
false.
?- tree_eval(5, tree(tree(empty,z,empty),
'+',tree(tree(empty,1,empty),
'/',tree(empty,z,empty))), Eval).
Eval = 5.2 ;
false.
一些好主意?
我们可以在不使用cut(!)的情况下实现它吗?
谢谢你们!
答案 0 :(得分:2)
在寻求帮助之前,你甚至都不会尝试解决这个问题,这是一种耻辱。
您的问题几乎直接转化为解决方案。当树的中间有一个Num时:
tree_eval(_Value, tree(empty,Num,empty), Num).
当有变量时:
tree_eval(Value, tree(empty,z,empty), Value).
一般情况:
tree_eval(Value, tree(tree(LL,LOp,LR),Op,tree(RL,ROp,RR)), Eval) :-
tree_eval(Value, tree(LL,LOp,LR), LEval),
tree_eval(Value, tree(RL,ROp,RR), REval),
Expr =.. [Op,LEval,REval], % is there an easier way to do this?
Eval is Expr.
现在您注意到,此解决方案没有削减。它们不是必需的,因为在这三个条款中只有一个是真的。然而,对于其中一个条款,我无法想出一种方法来使头部明确无误。 This可能会有所帮助。