2012-05-09 21 views
8

Eventuali duplicati:
Strategies for simplifying math expressionsSemplificare espressione algebrica

Ho un parser di un'espressione matematica che costruisce un albero per rappresentare l 'espressione. Diciamo, per esempio, io di ingresso 2+y+3+y, la rappresentazione interna di questo sarebbe:

enter image description here

Ora, noi, come esseri umani, possiamo subito vedere che 2+y+3+y = 2y + 5. La parte difficile per il computer che vedo è che se mi trovassi sulla sinistra +, non avrei idea di avere un'altra aggiunta a destra nell'altro ramo - non importa quando si valuta ma quando si semplifica non vedo come questo possa essere fatto bene.

Questo è come le classi si combinano tra loro: enter image description here

ho cercato di google questo, ma non ho trovato niente che mi potrebbe aiutare qui. Solo qualche waypoint generale, o un url o qualcosa del genere sarebbe apprezzato

MODIFICA: Nota che per l'esempio ho incluso solo l'aggiunta. Il parser supporta espressioni come: 1 + 2 * (3^4-4/5 * (1 + 2))

+0

L'aggiunta è transitiva. Dalla radice +, può non vedere che entrambi i bambini sono anche un'aggiunta: significa che può riorganizzare le costanti e le variabili come meglio crede? –

+0

Sono questi compiti? –

+2

Potresti rendere '+' avere più di 2 bambini? Credo che linguaggi matematici simbolici come Mathematica memorizzino il tuo esempio come una lista '[2, y, 3, y]' con una testa di 'Plus', che verrebbe automaticamente semplificata usando alcune regole. – JohnPS

risposta

0

Poiché l'insieme di espressioni che possono essere espresse con la struttura della classe è abbastanza limitato, puoi semplicemente contare quanto spesso ogni variabile si verifica e somma tutte le costanti.

var nodes = tree.Flatten(); 

var variables = nodes 
    .OfType<Variable>() 
    .GroupBy(x => x.Name) 
    .Select(g => new Multiplication(
     new Variable(g.Key), new Constant(g.Count()))); 

var constants = nodes 
    .OfType<Constant>() 
    .Sum(x => x.Value); 

var result = new Addition(
    variables.Aggregate((x, y) => new Addition(x, y)), 
    new Constant(constants)); 
+0

Ho incluso un numero limitato di operatori e funzioni. Ho + - */log pow exp(). – ErikTJ

+3

@ErikTJ: Ma hai chiesto solo di aggiungere. Una soluzione generica per l'espressione algebrica arbitraria è qualcosa che è probabile trovare nei libri di testo CS; IMO è troppo chiedere qui. – dtb