2016-11-26 38 views
0

我想在prolog中做一個謂詞,它將我給出的值替換爲多項式的變量,然後計算結果。這裏是我的代碼:爲什麼不統一? Prolog問題

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」,它應該返回poly(m(1,0)[m],m(1,0),m(3,0,[]))。你能幫我做嗎?我只是想解決這個問題,後來我還會實現這些數字之間的和數,這些數字相當簡單,其餘的代碼我都有。謝謝你們

回答

0

如果你想知道,最後我自己解決問題(也就是說,根據你們中的一些人,最好的學習方法和我同意)。所以我的poly-val變成:

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)), !.`