AI Prolog练习

时间:2013-03-28 13:52:02

标签: prolog artificial-intelligence

以下是以下问题:

对于这个问题,我们考虑二元表达式树,其叶子的形式为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(!)的情况下实现它吗?

谢谢你们!

1 个答案:

答案 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可能会有所帮助。