2016-11-26 5 views
0

私は多項式の変数に与える値を代入し、結果を計算するプロローグで述語を実行しようとしています。ここに私のコードは次のとおりです。なぜ統合されないのですか?プロローグの問題

as_monomial(X, m(X, 0, [])) :- number(X), !. 
as_monomial(^(Y, Z), m(1, Z, [v(Z, Y)])) :- !. 
as_monomial(*(X, ^(Y, Z)), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + Z), compress_monomial([v(Z, Y)| Vars], A), ordina_m(A, Q), !. 
as_monomial(*(X, Y), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + 1), compress_monomial([v(1, Y)| Vars], A), ordina_m(A, Q), !. 
as_monomial(-(X), m(-A, Y, L)) :- as_monomial(X, m(A, Y, L)). 
as_monomial(X, m(1, 1, [v(1, X)])). 

ordina_m(List, Sorted) :- sort(2, @=<, List, Sorted). 
ordina_var(List, Sorted) :- sort(0, @=<, List, Sorted). 

compress_monomial([], []) :- !. 
compress_monomial([X| Xs], A2) :- compress_monomial(Xs, A), compress_monomial2(X, A, A2), !. 

is_monomial(m(_C, TD, VPs)) :- integer(TD), TD >= 0, is_list(VPs). 

is_polynomial(poly(M)) :- is_list(M), foreach(member(Monomio, M), is_monomial(Monomio)). 

variables(Poly1, Result) :- is_polynomial(Poly1), variabili(Poly1, Result), !. 
variables(Poly1, Result) :- as_polynomial(Poly1, Result1), variabili(Result1, Result), !. 

variabili(poly([]), []) :- !. 
variabili(poly([m(_, _, [])| Xs]), Ys) :- variabili(poly(Xs), Ys), !. 
variabili(poly([m(X, Y, [v(_, A)| Vs])| Xs]), Z) :- variabili(poly([m(X, Y, Vs)| Xs]), Ys), ordina_var([A| Ys], R), compressV(R, Z), !. 

compressV([], []). 
compressV([X|T],[X|T1]):- member(X,T),!,canc(X,T,R), compressV(R,T1). 
compressV([X|T],[X|T1]) :- compressV(T,T1). 

canc(_L, [], []). 
canc(L, [L|S], Z) :- canc(L, S, Z). 
canc(L, [H|S], [H|Z]):- canc(L, S, Z), !. 

as_polynomial(+(X, Y), poly(C)) :- as_monomial(Y, G), as_polynomial(X, poly(Gs)), compress_polynomial([G| Gs], C), !. 
as_polynomial(-(X, Y), poly(C)) :- as_monomial(-Y, G), as_polynomial(X, poly(Gs)), compress_polynomial([G| Gs], C), !. 
as_polynomial(X, poly([X])) :- is_monomial(X), !. 
as_polynomial(X, poly([Q])) :- as_monomial(X, Q), !. 

compress_polynomial([], []) :- !. 
compress_polynomial([X| Xs], A2) :- compress_polynomial(Xs, A), compress_polynomial2(X, A, A2), !. 

compress_polynomial2(m(X, Y, Z), [], [m(X, Y, Z)]) :- !. 
compress_polynomial2(m(X, Y, Z), [m(X1, Y, Z)| Xs], [m(X2, Y, Z)| Xs]) :- X2 is (X + X1), !. 
compress_polynomial2(X, [Y| Ys], [Y| Z]) :- compress_polynomial2(X, Ys, Z), !. 

polyval(Poly1, V, Result) :- is_polynomial(Poly1), variables(Poly1, Vars), poly_val(Poly1, Vars, V, Result), !. 
polyval(Poly1, V, Result) :- as_polynomial(Poly1, P1), variables(P1, Vars), poly_val(P1, Vars, V, Result), !. 

poly_val(poly([]), , , poly([])) :- !. 
poly_val(poly([m(X, Y, Z)| Xs]), Vars, V, poly([R| Ys])) :- poly_val(poly(Xs), Vars, V, poly(Ys)), print(m(X, Y, Z)), mon_val(m(X, Y, Z), Vars, V, R), !. 

mon_val(m(X, Y, []), [_], [_], m(X, Y, [])) :- !. 
mon_val(m(X, Y, [v(W, Z)| Vs]), [Z| Vs2], [Val| Vvs], m(X2, Y2, Z2)) :- integer(Val), mon_val(m(X, Y, Vs), Vs2, Vvs, m(X3, Y2, Z2)), X2 is (X3 * (Val^W)), !. 
mon_val(m(X, Y, [v(W, Z)| Vs]), [_| Vs2], [_| Vvs], m(X, Y2, Z2)) :- mon_val(m(X, Y, [v(W, Z)| Vs]), Vs2, Vvs, m(X, Y3, Z2)), Y2 is (Y3 + W), !. 

私は私はあなたが私にそれを言うと、私はそれのために謝罪してください場合には、それを証明するために必要なすべてのコードを入れたいと考えています。私はカットについて知っていますが、現時点では単なる試練です。私の問題はmon_valにあります。なぜなら、それは統一したくないからです。私が使用するクエリの例は、polyval(x + x + y、[1,3]、Q)です。出力は "false"で、ポリ(m(1、0、[])、m(1,0、[])、m(3,0、[]))が返されます。あなたはそれをやって私を助けることができますか?私はちょうど問題を解決したいし、後で私はまた、残りのコードとかなり簡単な数字の間の合計を実装します。ありがとうございました

答えて

0

あなたが知りたいのであれば、私は自分自身で問題を解決します(つまり、あなたの中には、学ぶ最もよい方法です、私は同意します)。私のポリバールは次のようになります:

polyval(Poly1, V, Result) :- is_polynomial(Poly1), variables(Poly1, Vars), poly_val(Poly1, Vars, V, Result), !. 
polyval(Poly1, V, Result) :- as_polynomial(Poly1, P1), variables(P1, Vars), poly_val(P1, Vars, V, Result), !. 

poly_val(poly([]), _, _, poly([])) :- !. 
poly_val(poly([X| Xs]), Vars, V, poly(Z)) :- poly_val(poly(Xs), Vars, V, poly(Ys)), mon_val(X, Vars, V, R), compress_polynomial([R| Ys], Z), !. 

/* mon_val(Monomio, Variabili, ValoreVariabili, Result) */ 

mon_val(m(X, _, []), [_], [_], m(X,0, [])) :- !. 
mon_val(m(X, _, Z), [], [], m(X,0, Z)) :- !. 
mon_val(m(X, Y, [v(W, Z) | R]), [Z| Vs], [Val|Vvs], m(X2, Y2, Z2)) :- integer(Val), mon_val(m(X, Y, R), Vs, Vvs, m(X3, Y2, Z2)), X2 is (X3 * (Val^W)), !. 
mon_val(m(X, Y, Z), [_|Vs2], [_| Vvs], m(X2, Y2, A)) :- mon_val(m(X, Y, Z), Vs2, Vvs, m(X2, Y2, A)), !.` 
関連する問題