【问题标题】:AI Prolog exercise [closed]AI Prolog 练习 [关闭]
【发布时间】:2013-03-28 13:52:02
【问题描述】:

以下是问题:

对于这个问题,我们考虑二叉表达式树,其叶子的形式要么是 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(!) 来实现它吗?

谢谢大家!

【问题讨论】:

  • 家庭作业?到目前为止,您尝试过什么?

标签: prolog artificial-intelligence


【解决方案1】:

很遗憾你在寻求帮助之前甚至都不会尝试解决它。​​

您的问题几乎可以直接转化为解决方案。当树中间有一个 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 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多