-3

これが次の質問です。

この問題では、葉がtree(empty, Num, empty)Num が数値である形式であるかtree(empty, z, empty)、文字 z を一種の「変数」と見なす場合のいずれかである二分式ツリーを考えます。

すべての木は葉であるか、tree(L, Op, R)L と R が左右の部分木で、Op が算術演算子 '+'、'-'、'*'、'/' (加算、減算、掛け算と割り算)。

tree_eval(Value, Tree, Eval)指定された値に等しい変数 z を設定して、式ツリー Tree の評価結果に Eval をバインドする述語を記述します。例えば:

?- 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.

お気づきのとおり、このソリューションにはカットがありません。一度に真になることができるのは 3 つの節のうちの 1 つだけなので、それらは必要ありません。しかし、句の 1 つについては、見出しを明確にする方法を思いつきませんでした。これは役立つかもしれません。

于 2013-03-28T14:37:07.343 に答える