한 시간 동안 코드를 읽었지만 문제가 어디에 있는지 이해할 수 없습니다. 이 오류는 내가 전에 인스턴스화하지 않은 인수를 사용한다는 것을 의미하지만 그 위치가 어디인지는 알 수 없습니다. 너 나 좀 도와 줄 수있어? 이미 전에 그것을 사용하고 난 코드의 조각으로 문제가 없습니다 사촌인수가 인스턴스화되지 않았습니다.
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]), !.
I은 / is_polynomial에 대한 코드를 포함하지 않습니다. 도와 줄수있으세요? 내가 시도한 예제는 maxdegree (x^5 + y^500 + 4, R)입니다. (mindegree에 대한 같은 것)
우리는''is_polynomial'을 가지고 있지 않기 때문에 as_polynomial'을 사용하면 코드를 실행하여 어떤 일이 발생하는지 확인할 수 없습니다. 어쨌든 문제는 'X'와 'Y'사이의 네 가지 비교 중 하나에있는 것이 거의 확실합니다. 한 또는 두 변수 모두 한 지점에서 인스턴스화되지 않아야합니다. 마지막으로, 모든 규칙이 컷 (cut)으로 끝난다는 사실은 거의 확실하게 코드에 잘못된 점이 있음을 의미합니다. – Fatalize
상처를 보지 마십시오. 나는 그들 중 너무 많은 것이 있다는 것을 압니다. 나는/is_polynomial로 넣을 것입니다. – Anna
여전히 is_monomial을 놓치고 있으며, 문제를 재현하기 위해 어떤 술어를 쿼리해야하는지 아직 알지 못합니다. – Fatalize