2016-11-23 53 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), ordina_m([v(Z, Y)| Vars], Q), !. 
as_monomial(*(X, Y), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + 1), ordina_m([v(1, Y)| Vars], 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_poly1(List, Sorted) :- sort(2, @>=, List, Sorted). 
ordina_poly2(List, Sorted) :- sort(3, @=<, List, Sorted). 


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)). 


as_polynomial(+(X, Y), poly(C)) :- as_monomial(Y, G), as_polynomial(X, poly(Gs)), inverti(G, H), inverti2(Gs, Hs), ordina_poly2([H| Hs], D), inverti2(D, F), ordina_poly1(F, C), !. 
as_polynomial(-(X, Y), poly(C)) :- as_monomial(-Y, G), as_polynomial(X, poly(Gs)), inverti(G, H), inverti2(Gs, Hs), ordina_poly2([H| Hs], D), inverti2(D, F), ordina_poly1(F, C), !. 
as_polynomial(X, poly([X])) :- is_monomial(X), !. 
as_polynomial(X, poly([Q])) :- as_monomial(X, Q), is_monomial(Q). 

/* coefficienti */ 
coefficients(Poly1, Result) :- is_polynomial(Poly1), coefficienti(Poly1, Result), !. 
coefficients(Poly1, Result) :- as_polynomial(Poly1, Result1), coefficienti(Result1, Result), !. 

coefficienti(poly([]), []) :- !. 
coefficienti(poly([m(X, _, _)|Xs]), [X|Ys]) :- coefficienti(poly(Xs), Ys), !. 

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

variabili(poly([]), []) :- !. 
variabili(poly([m(_, _, X)|Xs]), [X|Ys]) :- variabili(poly(Xs), Ys), !. 

/* monomi */ 
monomials(Poly1, Result) :- is_polynomial(Poly1), monomi(Poly1, Result), !. 
monomials(Poly1, Result) :- as_polynomial(Poly1, Result1), monomi(Result1, Result), !. 

monomi(poly([]), []) :- !. 
monomi(poly([X|Xs]), [X|Ys]) :- monomi(poly(Xs), Ys), !. 

/* somma */ 
polyplus(Poly1, Poly2, Result) :- is_polynomial(Poly1), is_polynomial(Poly2), poly_plus(Poly1, Poly2, Result), !. 
polyplus(Poly1, Poly2, Result) :- is_polynomial(Poly1), as_polynomial(Poly2, Q), poly_plus(Poly1, Q, Result), !. 
polyplus(Poly1, Poly2, Result) :- as_polynomial(Poly1, Q), is_polynomial(Poly2), poly_plus(Q, Poly2, Result), !. 
polyplus(Poly1, Poly2, Result) :- as_polynomial(Poly1, Q1), as_polynomial(Poly2, Q2), poly_plus(Q1, Q2, Result). 

poly_plus(poly([]), poly(Q), poly(Q)) :- !. 
poly_plus(poly([X|Xs]), poly(Q), poly([X|Z])) :- poly_plus(poly(Xs), poly(Q), poly(Ys)), compress_somma(X, Ys, Z), compara(Ys, Z). 
poly_plus(poly([X|Xs]), poly(Q), poly(Z)) :- poly_plus(poly(Xs), poly(Q), poly(Ys)), compress_somma(X, Ys, Z). 

compress_somma(_X, [], []) :- !. 
compress_somma(m(X,Y,Z), [m(R,Y,Z)| List1], [m(K,Y,Z)| List2]) :- compress_somma(m(X,Y,Z), List1, List2), K is (R + X), !. 
compress_somma(X, [Y| List], [Y| List]) :- compress_somma(X, List, List). 


/* differenza */ 
polyminus(Poly1, Poly2, Result) :- is_polynomial(Poly1), is_polynomial(Poly2), poly_minus(Poly1, Poly2, Result), !. 
polyminus(Poly1, Poly2, Result) :- is_polynomial(Poly1), as_polynomial(Poly2, X), poly_minus(Poly1, X, Result), !. 
polyminus(Poly1, Poly2, Result) :- as_polynomial(Poly1, X), is_polynomial(Poly2), poly_minus(X, Poly2, Result), !. 
polyminus(Poly1, Poly2, Result) :- as_polynomial(Poly1, Y), as_polynomial(Poly2, Z), poly_minus(Y, Z, Result). 

poly_minus(poly([]), poly(X), poly(X)) :- !. 
poly_minus(poly([X|Xs]), poly(Q), poly([X|Z])) :- poly_minus(poly(Xs), poly(Q), poly(Ys)), compress_differenza(X, Ys, Z), compara(Ys, Z). 
poly_minus(poly([X|Xs]), poly(Q), poly(Z)) :- poly_minus(poly(Xs), poly(Q), poly(Ys)), compress_differenza(X, Ys, Z). 

compress_differenza(_X, [], []) :- !. 
compress_differenza(m(X,Y,Z), [m(R,Y,Z)| List1], [m(K,Y,Z)| List2]) :- compress_differenza(m(X,Y,Z), List1, List2), K is (X - R), !. 
compress_differenza(X, [Y| List], [Y| List]) :- compress_differenza(X, List, List). 



/*moltiplicazione */ 


compara([], []) :- !. 
compara([X|Xs], [X|Ys]) :- compara(Xs, Ys). 

inverti(m(_, _, []), m(_, _, [])) :- !. 
inverti(m(X, Y, [v(W, Z)| Xs]), m(X, Y, [v(Z, W)| Ys])) :- inverti(m(X, Y, Xs), m(X, Y, Ys)), !. 

inverti2([], []) :- !. 
inverti2([m(X, Y, [])| Zs], [m(X, Y, [])| Ss]) :- inverti2(Zs, Ss), !. 
inverti2([m(X, Y, [v(W, Z)| Xs])| Zs], [m(X, Y, [v(Z, W)| Ys])| Ss]) :- inverti2([m(X, Y, Xs)| Zs], [m(X, Y, Ys)| Ss]), !. 

該計劃給了我作爲輸出是正確的,但是,反而給我它看起來像是在等待着什麼程序的結束,我必須「強制」終「輸入」。有沒有問題或應該是正常的?你能幫助我嗎?謝謝大家

+0

舉一個簡單的例子的輸入,你得到你的程序的這種行爲,以便更好地理解它... – coder

+0

該死的。你是對的。一個例子是這個 'as_polinomial(x + y,P1),as_polinomial(-y,P2),polyplus(P1,P2,R)。' – Anna

+0

您還沒有給出任何「as_polinomial/2」的定義.... – coder

回答

0

好的。我通過@coder解決了我的問題。爲了解決這個問題,我把另一個切(也許是好的)在封閉的單行「as_polynomial」:

as_polynomial(+(X, Y), poly(C)) :- as_monomial(Y, G), as_polynomial(X, poly(Gs)), inverti(G, H), inverti2(Gs, Hs), ordina_poly2([H| Hs], D), inverti2(D, F), ordina_poly1(F, C), !. as_polynomial(-(X, Y), poly(C)) :- as_monomial(-Y, G), as_polynomial(X, poly(Gs)), inverti(G, H), inverti2(Gs, Hs), ordina_poly2([H| Hs], D), inverti2(D, F), ordina_poly1(F, C), !. as_polynomial(X, poly([X])) :- is_monomial(X), **!**. as_polynomial(X, poly([Q])) :- as_monomial(X, Q), is_monomial(Q).

然後我也刪除is_monomial(Q),因爲它是沒有用的