commit 66dfb6084cde9d3cedb7e3932058c22d13bbb7b8 Author: Hugo Sales Date: Sat Nov 17 16:14:13 2018 +0000 Initial commit diff --git a/polimani.pl b/polimani.pl new file mode 100644 index 0000000..358e7e3 --- /dev/null +++ b/polimani.pl @@ -0,0 +1,106 @@ +%% Follows 'Coding guidelines for Prolog' - Theory and Practice of Logic Programming +%% https://doi.org/10.1017/S1471068411000391 + +polynomial_variables([x, y, z]). +polynomial_variable_p(X) :- + polynomial_variables(V), member(X, V). + +power_p(X) :- + polynomial_variable_p(X), !. +power_p(X^N) :- + polynomial_variable_p(X), integer(N), N > 1, !. + +coefficient_p(K) :- + number(K). + +%% monomial_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), !. + +polynomial_p(M) :- + monomial_p(M), !. +polynomial_p(P + M) :- + monomial_p(M), + polynomial_p(P), !. + +simplify_monomial(1 * P, P) :- + power_p(P), !. +simplify_monomial(0 * _, 0) :- + !. +simplify_monomial(M, M). + +simplify_polynomial(M, M2) :- + monomial_p(M), simplify_monomial(M, M2), !. +simplify_polynomial(P + 0, P) :- + monomial_p(P), !. +simplify_polynomial(0 + P, P) :- + monomial_p(P), !. +simplify_polynomial(P + M, P2 + M2) :- + simplify_polynomial(P, P2), simplify_monomial(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(1*x+(-1)*x, P). + +monomial_parts(X, 1, X) :- + power_p(X), !. +monomial_parts(X^N, 1, X^N) :- + power_p(X^N), !. +monomial_parts(K * M, K, M) :- + coeficient_p(K), !. +monomial_parts(K, K, indep) :- + coeficient_p(K), !. + + +delete_monomial(M, X, M, 0) :- + monomial_p(M), + monomial_parts(M, _, X), !. +delete_monomial(M + M2, X, M, M2) :- + monomial_p(M2), monomial_p(M), + monomial_parts(M, _, X), !. +delete_monomial(P + M, X, M, P) :- + monomial_p(M), monomial_parts(M, _, X), !. +delete_monomial(P + M2, X, M, P2 + M2) :- + delete_monomial(P, X, M, P2). + +add_monomial(K1, K2, K3) :- + number(K1), number(K2), !, + K3 is K1 + K2. +add_monomial(M1, M2, M3) :- + monomial_parts(M1, K1, XExp), + monomial_parts(M2, K2, XExp), + K3 is K1 + K2, + p_aux_add_monomial(K3, XExp, M3). + +p_aux_add_monomial(K, indep, K) :- + !. +p_aux_add_monomial(0, _, 0) :- + !. +p_aux_add_monomial(1, XExp, XExp) :- + !. +p_aux_add_monomial(K, XExp, K * XExp). + +closure_simplify_polynomial(P, P) :- + simplify_polynomial(P, P2), + P==P2, !. +closure_simplify_polynomial(P, P3) :- + simplify_polynomial(P, P2), + closure_simplify_polynomial(P2, P3), !. + +%% ?- simplify_polynomial(1*x+(-1)*x, P). +%@ P = x+ -1*x . +%@ P = x+ -1*x +%@ Unknown action: q (h for help) +%@ Action? +%@ Unknown action: q (h for help) +%@ Action? .