-3

这是以下问题:

对于这个问题,我们考虑二叉表达式树,其叶子要么是tree(empty, Num, empty)Num 是数字的形式,要么tree(empty, z, empty)在这种情况下我们会将字母 z 视为一种“变量”。

每棵树要么是叶子,要么是tree(L, Op, R)L 和 R 是左子树和右子树的形式,Op 是算术运算符“+”、“-”、“*”、“/”之一(表示加法、减法、乘法和除法)。

编写一个谓词tree_eval(Value, Tree, Eval),将 Eval 绑定到表达式树树的计算结果,变量 z 设置为等于指定的值。例如:

?- 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(!) 的情况下实现它吗?

多谢你们!

4

1 回答 1

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.

现在你注意到了,这个解决方案没有任何削减。它们不是必需的,因为一次只能三个子句中的一个为真。然而,对于其中一个条款,我想不出一种方法来使头部明确。可能会有所帮助。

于 2013-03-28T14:37:07.343 回答