Avec Prolog, je souhaite simplifier l ' expression algébrique représentée sous forme de liste de liste:
équation d'algèbre
f = 5x+3 [[5,1],[3,0]]
liste de liste
f = 3x+2x+1+2 [[3,1],[2,1],[1,0],[2,0]]
3
et 2 sont des coefficients
1
et 0
sont des exposants
Cela devrait être évident.
Je cherche des conseils ou des suggestions sur la façon de coder les simplifications pour cet exemple:
[[3,1],[2,0]]
simplifié:
f = 3x+2
J'ai essayé des fonctions intégrées mais je n'ai pas obtenu le une bonne idée sur la façon de les utiliser.
3 Réponses :
Vous pouvez résoudre votre problème de cette manière:
simplify(_,_,S,S,[]):- !. simplify(L,I,Sum,NTot,[[I,S]|T]):- Sum =< NTot, findall(X,member([X,I],L),LO), length(LO,N), S1 is Sum + N, sum_list(LO,S), I1 is I+1, simplify(L,I1,S1,NTot,T). write_function([]). write_function([[D,V]|T]):- write(' + '),write(V),write('x^'),write(D), write_function(T). test:- L = [[3,1],[2,1],[1,0],[2,0]], length(L,N), simplify(L,0,0,N,LO), LO = [[D,V]|T], write('f='),write(V),write('x^'),write(D), write_function(T).
Le prédicat principal est simplify / 5
qui utilise findall / 3
pour trouver tous les coefficients de même degré puis les additionner à l'aide de sum_list / 2
. Ensuite, vous pouvez écrire le résultat d'une manière sophistiquée en utilisant write_function/1
.
merci beaucoup, mais pouvez-vous m'offrir une solution utilisant uniquement la manipulation de liste?
Dans SWI-Prolog, vous pouvez utiliser l'agrégat:
?- simplify([[3,1],[2,1],[1,0],[2,0]], Out). Out = [[5, 1], [3, 0]] ; false.
Par exemple:
pred(>, [_,X], [_,Y]) :- X > Y. pred(<, [_,X], [_,Y]) :- X < Y. pred(=, [_,X], [_,X]). simplify(In, Out) :- aggregate(set([S,X]), aggregate(sum(P), member([P,X], In), S), Temp), predsort(pred, Temp, Out).
merci beaucoup, mais pouvez-vous m'offrir une solution utilisant uniquement la manipulation de liste?
Une doublure, similaire à ce qui est proposé par joel76:
simplify(I,O) :- bagof([S,E],L^(bagof(C,member([C,E],I),L),sum_list(L,S)),O).
Le bagof intérieur collecte C
(coefficients) donné E
(exposants ), la liste résultante L
est additionnée en S
, et associée à E
devient [S, E]
, un élément (monôme) de O.
Si vous omettez le spécificateur de quantification universel (c'est-à-dire L ^
), vous obtenez des monômes uniques lors du retour en arrière.
J'ai utilisé un pré-tri pour obtenir Out = [[5, 1], [3, 0]]; , vous obtenez Out = [[3, 0], [5, 1]] . Je ne sais pas si c'est important!
L'ordre des monômes devrait être sans importance, je pense. L'agrégat BTW est basé sur setof, etc., donc la commande est déjà implicite
Y a-t-il une erreur dans votre exemple?
f = 3x + 2x + 1 + 2
doit être[[3,1], [2,1], [1,0], [2,0]]
au lieu de[[1,3], [2,1], [1,0], [2,0]]
?oui merci, corrigé
Voulez-vous également résoudre des systèmes d'équations?
S'agit-il uniquement d'expressions polynomiales d'une variable?
oui il ne s'agit que d'une seule variable, résoudre le systéme je l'ai fait, mais est-ce que je peux me déranger avec une solution manipulant uniquement des listes?