2016-11-23 23 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),因为它是没有用的