2016-11-24 20 views
0

私のコードを1時間読みましたが、どこに問題があるのか​​理解できません。私は、このエラーは、私が前にインスタンス化しなかった引数を使用することを意味しますが、どこにあるのかわかりません。手伝って頂けますか?引数が十分にインスタンス化されていません

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

/* grado massimo */ 
maxdegree(Poly1, Result) :- is_polynomial(Poly1), max_degree(Poly1, Result), !. 
maxdegree(Poly1, Result) :- as_polynomial(Poly1, Result1), max_degree(Result1, Result), !. 

max_degree(poly([]), 0) :- !. 
max_degree(poly([m(_, X, _)|Xs]), X) :- max_degree(poly(Xs), Ys), X > Ys, !. 
max_degree(poly([m(_, X, _)|Xs]), Ys) :- max_degree(poly(Xs), Ys), X =< Ys, !. 

/* grado minimo */ 
mindegree(Poly1, Result) :- is_polynomial(Poly1), min_degree(Poly1, Result), !. 
mindegree(Poly1, Result) :- as_polynomial(Poly1, Result1), min_degree(Result1, Result), !. 

min_degree(poly([m(_, X, _)]), X) :- !. 
min_degree(poly([m(_, X, _)|Xs]), X) :- min_degree(poly(Xs), Ys), X < Ys, !. 
min_degree(poly([m(_, X, _)|Xs]), Ys) :- min_degree(poly(Xs), Ys), X >= 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]), !. 

私はすでに前にそれを使用して、私は、コードのその部分に問題を持っていないcuzを私は/ is_polynomialのコードが含まれていません。私を助けてくれますか? 私が試した例はmaxdegree(x^5 + y^500 + 4、R)です。 (mindegreeについても同じこと)

+0

我々は '' is_polynomial'を持っていないので、 as_polynomial'では、コードを実行して何が起きているのかを見ることはできません。いずれにしても、問題はほぼ確実に 'X'と' Ys'の4つの比較のうちの1つにあります。これらの変数の一方または両方は、ある時点でインスタンス化されていなければなりません。最後に、すべてのルールがカットで終わるということは、コードに深刻な問題があることをほぼ確実に意味します。 – Fatalize

+0

カットを見ないでください。あまりにも多くの人がいることは分かっています。私は/ is_polynomialとして入れます – Anna

+0

'is_monomial'がまだ見当たりませんし、私たちはあなたの問題を再現するためにどの述語に問い合わせるべきかまだ分かりません。 – Fatalize

答えて

0

私は基本ケースとして、両方maxdegreeとmindegreeでclausureを追加私の問題を解決:

max_degree(poly([m(_, _X, [])]), 0) :- !. max_degree(poly([m(_, X, _)]), X).

min_degree(poly([m(_, _X, [])]), 0) :- !. min_degree(poly([m(_, X, _)]), X) :- !.

関連する問題