Added polynomial_to_list, list_to_polynomial and scale_polynomial

This commit is contained in:
Diogo Cordeiro 2018-11-20 01:48:23 +00:00
parent 1c6d63ed1b
commit 7d78a123ef

View File

@ -1,3 +1,4 @@
%% vim: set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
%% -*- mode: prolog-*-
%% Follows 'Coding guidelines for Prolog' - Theory and Practice of Logic Programming
%% https://doi.org/10.1017/S1471068411000391
@ -19,7 +20,7 @@ polynomial_variable(X) :-
polynomial_variable(P) :-
polynomial_variable_list(V),
member(X, V),
P = X^N.
P = X^_.
%% Tests:
%% ?- term_to_list(X, [x^4]).
%@ X = x^4 .
@ -61,15 +62,15 @@ term(L * R) :-
% predicate the problem ocurred.
%
is_term_valid_in_predicate(T, F) :-
(
(
term(T)
;
;
write("Invalid term in "),
write(F),
write(": "),
write(T),
fail
).
).
%% Tests:
%% ?- is_term_valid_in_predicate().
@ -139,8 +140,8 @@ simplify_term(T, T2) :-
sort(0, @=<, L, L2),
join_like_terms(L2, L3),
list_to_term(L3, T2). % Responsible for parenthesis
%% sort(0, @>=, L3, L4),
%% term_to_list(T2, L4).
%% sort(0, @>=, L3, L4),
%% term_to_list(T2, L4).
%% Tests:
%% ?- simplify_term(2*y*z*x^3*x, X).
%@ X = 2*(x^4*(y*z)).
@ -182,20 +183,24 @@ join_like_terms([], []).
%% simplify_polynomial(+P:atom, -P2:atom) is det
%
% Simplifies a polynomial.
% TODO: not everything is a +, there are -
%
simplify_polynomial(M, M2) :-
%% Are we dealing with a valid term?
is_term_valid_in_predicate(M, "simplify_polynomial(M, M2)"),
%is_term_valid_in_predicate(M, "simplify_polynomial(M, M2)"),
term(M),
%% If so, simplify it.
simplify_term(M, M2),
!.
simplify_polynomial(P + 0, P) :-
%% Ensure valid term
is_term_valid_in_predicate(P, "simplify_polynomial(P + 0, P)"),
%is_term_valid_in_predicate(P, "simplify_polynomial(P + 0, P)"),
term(P),
!.
simplify_polynomial(0 + P, P) :-
%% Ensure valid term
is_term_valid_in_predicate(P, "simplify_polynomial(0 + P, P)"),
%is_term_valid_in_predicate(P, "simplify_polynomial(0 + P, P)"),
term(P),
!.
simplify_polynomial(P + M, P2 + M2) :-
simplify_polynomial(P, P2),
@ -215,7 +220,6 @@ simplify_polynomial(P + M, P2 + M2) :-
%
% Simplifies a list of polynomials
%
simplify_polynomial_list([L1], L3) :-
simplify_polynomial(L1, L2),
L3 = [L2].
@ -226,6 +230,64 @@ simplify_polynomial_list([L1|L2],L3) :-
% There is nothing further to compute at this point
!.
%% polynomial_to_list(+P:polynomial, -L:List)
%
% Converts a polynomial in a list.
% TODO: not everything is a +, there are -
%
polynomial_to_list(T1 + T2, L) :-
polynomial_to_list(T1, L1),
L = [T2|L1],
% The others computations are semantically meaningless
!.
polynomial_to_list(P, L) :-
L = [P].
%% Tests:
%%?- polynomial_to_list(2*x^2+5+y*2, S).
%@S = [y*2, 5, 2*x^2].
%% list_to_polynomial(+P:polynomial, -L:List)
%
% Converts a list in a polynomial.
% TODO: not everything is a +, there are -
%
list_to_polynomial([T1|T2], P) :-
list_to_polynomial(T2, L1),
(
not(L1 = []),
P = L1+T1
;
P = T1
),
% The others computations are semantically meaningless
!.
list_to_polynomial(T, P) :-
P = T.
%% Tests:
%% TODO
%% append_two_atoms_with_star(+V1, +V2, -R) is det
%
% Returns R = V1 * V2
%
append_two_atoms_with_star(V1, V2, R) :-
term_string(V2, V3),
atom_concat(V1, *, V4),
atom_concat(V4, V3, S),
term_string(R, S).
%% Tests:
% TODO
%% scale_polynomial(+P:polynomial,+C:constant,-S:polynomial) is det
%
% Scales a polynomial with a constant
%
scale_polynomial(P, C, S) :-
polynomial_to_list(P, L),
maplist(append_two_atoms_with_star(C), L, L2),
list_to_polynomial(L2, S).
%simplify_polynomial(S1, S).
%% monomial_parts(X, Y, Z)
%
% TODO Maybe remove