• 締切済み

prologでの数式の簡単化

prologで微分をするプログラムを作ったのですが計算した結果が、例えば、 0*x^2+a*(2*x^1*1)+(0*x+b*1)+0 のように無駄に長くなってしまいます。そこでこれを簡単化する述語simple(P)を作りたいのですがどのようにしたら良いでしょうか? ?- simple(0*x^2+a*(2*x^1*1)+(0*x+b*1)+0). 2*a*x+b yes できれば上のような動作がするぐらいのものが作りたいです。 少なくとも余計な0,1を除去するくらいはしたいのですが・・・ お願いします。

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

こんな感じでどうでしょう。(かなり無駄がある気がしますが) simple(X^0,1). simple(X^1,X). simple(0*X,0). simple(X*0,0). simple(1*X,X1) :- simple(X,X1). simple(X*1,X1) :- simple(X,X1). simple(0+X,X1) :- simple(X,X1). simple(X+0,X1) :- simple(X,X1). simple(X*Y,Z) :- simple(X,X1),not(X=X1),!,simple(X1*Y,Z). simple(X*Y,Z) :- simple(Y,Y1),not(Y=Y1),!,simple(X*Y1,Z). simple(X+Y,Z) :- simple(X,X1),not(X=X1),!,simple(X1+Y,Z). simple(X+Y,Z) :- simple(Y,Y1),not(Y=Y1),!,simple(X+Y1,Z). simple(X,X). ?- simple(0*x^2+a*(2*x^1*1)+(0*x+b*1)+0,X). X = a*(2*x)+b Yes