0

これは、私が問題を抱えているテスト レビューの質問です。演算子「plus」、「minus」、「times」を使用して代数式を評価する方法をどのように記述しますか。以下にいくつかのテスト クエリを示します。

simple(式、結果、リスト)

?- simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]). V = 14

?- simplify(times(2,plus(a,b)),Val,[a:1,b:5]). Val = 12

?- simplify(times(2,plus(a,b)),Val,[a:1,b:(-5)]). Val = -8

私に与えられたのはこれらのサンプル クエリだけで、それ以外の説明はありませんでした。しかし、メソッドが代数式である最初の引数を分析し、3 番目の引数 (リスト) の値を x と y に置き換えていることは確かです。2 番目の引数は、式を評価した後の結果でなければなりません。

メソッドの 1 つは simple(V, Val, L) :- member(V:Val, L) であるべきだと思います。理想的には、あと 4 つの方法しかないはずですが、どうすればよいかわかりません。

私はこれまでに何を持っていますが、体がどうあるべきかわかりません:

simplify(Var, Value, Lst) :- member(Var:Value, Lst).
simplify(plus(Var), Value, Lst) :- 
simplify(minus(Var), Value, Lst) :-
simplify(times(Var), Value, Lst) :-

5番目の方法がどうあるべきかわかりません。

4

1 に答える 1

2

複雑な例に雪が降るのを許してしまったのではないでしょうか。基本ケースが 1 つ欠けているだけで、帰納的なケースはすべて非常に単純です。もっと簡単な例が必要なだけです。まず、これは何を返す必要がありますか?

?- simplify(3, Val, []).

うんVal = 3。それでは、欠落している基本ケースを追加しましょう。

simplify(Num, Num, _) :- number(Num).

帰納的なケースに対する重要な洞察は、plusminusあり、timesすべて同じ再帰バイナリ構造を持っています。simplify両側に再帰的に適用して、物事を評価することができます。別の簡単な例を試してみましょう。

?- simplify(times(3, 3), Val, []).

欲しいVal = 9。必要なことは、左と右の値が何であるかを把握し、それらを乗算することだけです。したがって、次のようになります。

simplify(times(Left, Right), Value, Lst) :-
  simplify(Left, LeftVal, Lst),
  simplify(Right, RightVal, Lst),
  Value is LeftVal * RightVal.

Lst変数も検索できるように、再帰呼び出しに渡します。plusここから、とminusケースがどのように見えるかを推定できるはずです。plus(X)引数が 1 つしかないため、次のようなケースは必要ありません。

Prolog の魔法は、これだけで本当にあなたがしなければならないことです。再帰は、単純なものが機能するようになるとすぐに、複雑な例を処理します。それを試してみてください。:)

お役に立てれば!

于 2013-03-02T04:55:35.297 に答える