Ambiguità del meno unitario nella notazione postfissa

sapo931
Buongiorno a tutti.

Sto realizzando un parser di espressioni matematiche (con input in notazione infissa, prefissa e postfissa).

Ho un problema con la tokenizzazione di esepressioni in notazione postfissa (e quindi anche prefissa) con il meno unitario.

Supponiamo infatti che l'utente inserisca un'espressione del tipo:

$15$ $8$ $-$ $-$

Questa può essere considerata in due modi:

$15$ $(8$ $-)$ $-$

oppure

$(15$ $8$ $-)$ $-$

dando quindi due risultati diversi:

$15$ $(8$ $-)$ $-$ $->$ $15$ $-$ $(-$ $8)$ $=$ $23$

$(15$ $8$ $-)$ $-$ $->$ $-$ $(15$ $-$ $8)$ $=$ $-$ $7$

Secondo voi qual'è l'interpretazione più corretta? Io sceglierei la prima, dato che il meno unario ha precedenza maggiore del meno binario, ma è una scelta opinabile.

Idee?

Risposte
apatriarca
Da un certo punto di vista eliminerei l'ambiguità usando simboli diversi oppure costringendo l'utente ad aggiungere uno zero per avere il meno unario. Per esempio potresti usare _ per il meno unario e - per il meno binario. In alternativa potresti richiedere l'uso delle parentesi per ottenere la negazione unaria.

sapo931
"apatriarca":
Da un certo punto di vista eliminerei l'ambiguità usando simboli diversi oppure costringendo l'utente ad aggiungere uno zero per avere il meno unario. Per esempio potresti usare _ per il meno unario e - per il meno binario. In alternativa potresti richiedere l'uso delle parentesi per ottenere la negazione unaria.


Internamente uso lo stesso simbolo per gestire il meno unario e binario (semplicemente ho due operatori con lo stesso simbolo ma con nomi e arietà diversi). Avevo pensato anche io ad imporre delle regole aggiuntive agli utenti, però poi mi è venuto in mente che praticamente tutti i programmi matematici che conosco (da geogebra a wolframalpha passando per la calcolatrice sul mio cellulare) sono perfettamente in grado di distinguere tra i due tipi di meno in notazione infissa, cosa che riesce a fare anche il mio parser. Aggiungere un simbolo diverso castrerebbe questa capacità a livello di notazione infissa, mentre usando un simbolo diverso solo per le altre due notazioni creerebbe disomogeneità tra i vari input.

L'unica alternativa mi sembra l'uso delle parentesi per le notazioni prefissa e postfissa, e semplicemente considerare tutti gli altri meno come binari.

apatriarca
Se devi scegliere una qualche interpretazione, credo sia meglio la seconda. È vero che il meno unario ha precedenza su quello binario nella notazione infissa, ma in questo caso potrebbe portarti a risposte sbagliate. Per esempio, se tu hai
10 5 -
non puoi dare la precedenza all'operazione unaria.. A mio parere devi dare sempre la precedenza all'operazione binaria e usare quella unaria solo quando hai un solo operatore. Se si desidera un comportamento diverso si può sempre fare ricorso a delle parentesi.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.