From 7d78a123ef820a7a0ed9f29df7cebbbc247134eb Mon Sep 17 00:00:00 2001 From: Diogo Cordeiro Date: Tue, 20 Nov 2018 01:48:23 +0000 Subject: [PATCH] Added polynomial_to_list, list_to_polynomial and scale_polynomial --- polimani.pl | 82 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 10 deletions(-) diff --git a/polimani.pl b/polimani.pl index 75504ff..1d540e4 100644 --- a/polimani.pl +++ b/polimani.pl @@ -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