1

これは私が問題を抱えているテストレビューの質問です。plus演算子、、 minusおよびを使用して代数式を評価するメソッドをどのように記述しますかtimes。ここにいくつかのテストクエリがあります:

simplify(Expression, Result, List)

?- 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つは理想的にはあと4つだけであるはずだと思いsimplify(V, Val, L) :- member(V:Val, L). ます...しかし、これをどうやって行うのかわかりません。

4

1 に答える 1

2

小さく始めて、知っていることを書き留めてください。

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

完全に良いスタートです: (+ (* 4 2) (* 3 (- 4 2))) = 8 + 3*2 = 14. しかし、もちろん、

simplify(times(x,y),V,[x:4,y:2]):- V is 4*2.

はさらに優れています。また、

simplify(minus(x,y),V,[x:4,y:2]):- V is 4-2.
simplify(plus(x,y),V,[x:4,y:2]):- V is 4+2.
simplify(x,V,[x:4,y:2]):- V is 4.

すべて完全に優れた Prolog コードです。しかしもちろん、私たちが本当に意味することは明らかです。

simplify(A,V,L):- atom(A), getVal(A,L,V).
simplify(C,V,L):- compound(C), C =.. [F|T], 
  maplist( simp(L), T, VS),       % get the values of subterms
  calculate( F, VS, V).           % calculate the final result

simp(L,A,V):- simplify(A,V,L).    % just a different args order

などは、何らかの方法でリストgetVal/3から値を取得し、シンボリック操作名と計算値のリストを指定して実際に計算を実行する必要があります。Lcalculate/3

勉強maplist/3して=../2

(未完成、未テスト)。


OK、maplistこれはやり過ぎでした=..。すべての用語はおそらくop(A,B). したがって、定義は次のように簡略化できます

simplify(plus(A,B),V,L):-
  simplify(A,V1,L),
  simplify(B,V2,L),
  V is V1 + V2.         % we add, for plus

simplify(minus(A,B),V,L):-
  % fill in the blanks
  .....
  V is V1 - V2.         % we subtract, for minus

simplify(times(A,B),V,L):-
  % fill in the blanks
  .....
  V is .... .           % for times we ...

simplify(A,V,L):-
  number(A),
  V = .... .            % if A is a number, then the answer is ...

そして最後の可能性は、xまたはyその他を満たすことatom/1です。

simplify(A,V,L):-
  atom(A),
  retrieve(A,V,L).

したがって、上記の節からの最後の呼び出しは のようretrieve(x,V,[x:4, y:3])になるか、またはのようになりますretrieve(y,V,[x:4, y:3])。実装するのは簡単なことです。

于 2013-03-03T15:07:49.940 に答える