diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34f5c2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*#* +.#* +*~ \ No newline at end of file diff --git a/polimani.pl b/polimani.pl index 358e7e3..fd62f7c 100644 --- a/polimani.pl +++ b/polimani.pl @@ -10,45 +10,105 @@ power_p(X) :- power_p(X^N) :- polynomial_variable_p(X), integer(N), N > 1, !. -coefficient_p(K) :- - number(K). +%% coefficient_p(K) :- +%% number(K). -%% monomial_p(X) :- +%% term_p(X) :- %% polynomial_variable_p(X), !. -monomial_p(N) :- - number(N), !. -monomial_p(X) :- - power_p(X), !. -monomial_p(K * X) :- - coefficient_p(K), - power_p(X), !. + +term_p(N) :- + number(N). +term_p(X) :- + power_p(X). +term_p(L * R) :- + term_p(L), + term_p(R), !. polynomial_p(M) :- - monomial_p(M), !. -polynomial_p(P + M) :- - monomial_p(M), - polynomial_p(P), !. + term_p(M). +polynomial_p(L + R) :- % Left greedy + polynomial_p(L), !, % Why? + term_p(R), !. -simplify_monomial(1 * P, P) :- - power_p(P), !. -simplify_monomial(0 * _, 0) :- +%% ?- polynomial_p(3*x^2+y*z). +%@ true. +%% ?- polynomial_p(x^100*y*z). +%@ true. +%% ?- polynomial_p(x+y+z). +%@ true. +%@ false. +%@ false. +%% ?- polynomial_p(3*x^2+y*z+x^100*y*z). +%@ true. +%@ true . +%@ false. +%@ false. +%@ false. +%@ false. + +simplify_term(1 * P, P) :- + term_p(P), !. +simplify_term(0 * _, 0) :- !. -simplify_monomial(M, M). +simplify_term(T, S) :- + term_to_list(T, L), + sort(L, L2), + join_like_terms(L2, S). + +%% ?- simplify_term(2*y*z*x^3*x, X). +%@ X = [2, x^1, x^3, y^1, z^1]. + +join_like_terms([T1, T2 | L], [P^N | L]) :- + P^N1 is T, + P^N2 is T2, + N is N1 + N2, + !. +join_like_terms([N1, N2 | L], [N | L]) :- + N is N1 * N2, + !. +join_like_terms(T, T). + +%% ?- join_like_terms([2, 3, x^1, x^2], T). +%@ ERROR: Arguments are not sufficiently instantiated +%@ ERROR: In: +%@ ERROR: [9] _3138^_3140 is _3134 +%@ ERROR: [8] join_like_terms([2,3|...],[_3188^_3190,...|...]) at /tmp/ediprologODLYxF:62 +%@ ERROR: [7] +%@ Exception: (8) join_like_terms([2, 3, x^1, x^2], _2428) ? abort +%@ % Execution Aborted +%@ T = [6, x^1, x^2]. +%@ T = [6, x^1]. +%@ T = [6]. +%@ T = [2]. + +term_to_list(L * N, [N | TS]) :- + number(N), + term_to_list(L, TS), !. +term_to_list(L * T, [T2 | TS]) :- + power_p(T), + power_to_canon(T, T2), + term_to_list(L, TS), !. +term_to_list(T, [T]). + +power_to_canon(T, T^1) :- + polynomial_variable_p(T). +power_to_canon(T^N, T^N) :- + polynomial_variable_p(T). simplify_polynomial(M, M2) :- - monomial_p(M), simplify_monomial(M, M2), !. + term_p(M), simplify_term(M, M2), !. simplify_polynomial(P + 0, P) :- - monomial_p(P), !. + term_p(P), !. simplify_polynomial(0 + P, P) :- - monomial_p(P), !. + term_p(P), !. simplify_polynomial(P + M, P2 + M2) :- - simplify_polynomial(P, P2), simplify_monomial(M, M2). + simplify_polynomial(P, P2), simplify_term(M, M2). simplify_polynomial(P + M, P2 + M3) :- monomial_parts(M, _, XExp), delete_monomial(P, XExp, M2, P2), !, add_monomial(M, M2, M3). simplify_polynomial(P + M, P2 + M2) :- - simplify_polynomial(P, P2), simplify_monomial(M, M2). + simplify_polynomial(P, P2), simplify_term(M, M2). %% ?- simplify_polynomial(1*x+(-1)*x, P). @@ -63,13 +123,13 @@ monomial_parts(K, K, indep) :- delete_monomial(M, X, M, 0) :- - monomial_p(M), + term_p(M), monomial_parts(M, _, X), !. delete_monomial(M + M2, X, M, M2) :- - monomial_p(M2), monomial_p(M), + term_p(M2), term_p(M), monomial_parts(M, _, X), !. delete_monomial(P + M, X, M, P) :- - monomial_p(M), monomial_parts(M, _, X), !. + term_p(M), monomial_parts(M, _, X), !. delete_monomial(P + M2, X, M, P2 + M2) :- delete_monomial(P, X, M, P2).