dポイントプレゼントキャンペーン実施中!

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を除去するくらいはしたいのですが・・・
お願いします。

A 回答 (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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!