Umgekehrte Polnische Notation

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Programmierbarer Taschenrechner HP-41CX aus den 1980er Jahren mit auffälliger, überbreiter Enter-Taste für die UPN-Eingabe. Charakteristischerweise fehlen gleichzeitig die bei herkömmlichen Taschenrechnern typischen Klammertasten ( ) und die Gleichheitstaste =.

Die Umgekehrte Polnische Notation (kurz UPN), englisch Reverse Polish Notation (kurz RPN), auch Postfixnotation genannt, ist eine von der Polnischen Notation abgeleitete Schreibweise bzw. Eingabelogik für die Anwendung von Operationen. Bei der umgekehrten polnischen Notation werden zunächst die Operanden niedergeschrieben bzw. eingegeben und danach der darauf anzuwendende Operator.

Größere Verbreitung fand die UPN nur durch die Taschenrechner des Herstellers Hewlett-Packard. Dessen Rechner, wie etwa der HP-48, besitzen eine meist auffällig große Enter-Taste, dafür fehlen die Klammertasten (, ) und die Gleichheitstaste =. Eine konventionelle Löschtaste zur Einleitung der Berechnung fehlt ebenfalls, da nicht mehr benötigte Ergebnisse während der Berechnungen automatisch aus dem Stapel geschoben werden. Eine modifizierte Löschtaste wird allerdings zur Beseitigung von Tippfehlern verwendet.

Prinzip[Bearbeiten]

Flussdiagramm wie mit einem UPN-Taschenrechner eine Berechnung mit mehreren Zahlen und Operationen ausgeführt wird

In der Informatik ist die UPN deshalb von Interesse, weil sie eine stapelbasierte Abarbeitung ermöglicht: Operanden werden beim Lesen auf den Stapel gelegt, ein Operator holt sich die Anzahl an Operanden vom Stapel (Stack), die seiner Stelligkeit entspricht, und legt das Ergebnis der Operation wieder auf dem Stapel ab. Am Ende liegt dann das Ergebnis des Terms oben auf dem Stapel. Deshalb bildet die UPN die Grundlage für stapelbasierte Programmiersprachen wie Forth, RPL, PostScript oder die Anweisungsliste im SPS-Bereich. Eine andere Bezeichnung ist Nulladressmaschine, weil keine expliziten Speicheradressen im Spiel sind.

Es sollen 3 und 4 addiert werden. Die Operanden sind dann 3 und 4, der Operator ist „+“:

In der Schule ist die erlernte Notation die (sequenziell organisierende) Infix-Notation „3+4“. In der umgekehrten polnischen Notation wird hingegen „3 4 +“ geschrieben (zwischen 3 und 4 ist ein Leerraum, damit die Zahlenfolge von der Zahl 34 unterschieden werden kann).

Weiteres Beispiel (in der Infix-Notation): „(3+4)×5“. Bei der UPN können die Klammern entfallen, alle Operationen (hier „+“ und „ד) arbeiten mit den beiden oberen Elementen des Stapels. Das Beispiel heißt in UPN dann: „3 4 + 5 ×“ (zuerst wird der Klammerausdruck „3 4 +“ausgerechnet, danach die hierbei entstandene Zahl 7 mit 5 multipliziert).

Ein ähnliches Prinzip ist auch in der deutschen Sprache und anderen natürlichen Sprachen ("SOV-Sprachen") zu finden. In Infinitiven und Nebensätzen des Deutschen werden erst alle Ergänzungen ("Argumente") eines Verbs hintereinander genannt, und am Schluss das Verb, das einem Operator gleicht, weil es die Ergänzungen zu einem Satz verknüpft:

  • Die Wäsche mit Seife waschen.
  • Das Mehl in einer Schüssel mit den Eiern verrühren
  • wenn jemand dem Hund das Futter wegnimmt.

Sprachlich kann man die Unterschiede der Infix-Notation „(3+4)×5“ und der UPN „3 4 + 5 ד daher wie folgt veranschaulichen:

  • Statt „3 plus 4, mal 5“ sagt man „3 und 4 addieren und mit 5 multiplizieren“.

Bei nicht-kommutativen Operationen ist die Reihenfolge in beiden Schreibweisen identisch.

Bei Operatoren mit nur einem Operanden ist UPN auch bei (Taschen-)Rechnern sehr gebräuchlich, die sonst mit der Infix-Notation arbeiten. Beispiele dafür sind die trigonometrischen oder logarithmischen Funktionen, die bei den meisten Taschenrechnern in der Form 2 5 ln oder 2 5 sin eingegeben werden (der Operator „ln“ bzw. „sin“ wird nach dem Operanden „25“ eingegeben).

Für die Konversion zwischen den Schreibweisen lässt sich der Shunting-yard-Algorithmus verwenden.

Vorteile[Bearbeiten]

Der UPN-finanzmathematische Taschenrechner HP-12C wird seit 1981 bis heute gebaut

Unter Anwendern wird häufig der Vorteil der UPN zur algebraischen Notation (Infix-Notation) diskutiert.

Der augenfälligste Vorteil der UPN ist, dass sie im Allgemeinen mit einer geringeren Anzahl von Tastendrücken auskommt. Um zum Beispiel die Rechnung (1+2)×(3+4) vorzunehmen, muss man im algebraischen Modus zwölf Tasten betätigen:

( 1 + 2 ) × ( 3 + 4 ) =

Bei vielen Implementierungen lässt sich die Tastenfolge noch optimieren; dies ist allerdings genaugenommen kein „algebraisches Vorgehen“:

1 + 2 = × ( 3 + 4 =

Im UPN-Modus sind nur neun Tastendrücke erforderlich:

1 Enter 2 + 3 Enter 4 + ×

Es sind also drei Tasten weniger zu drücken als im algebraischen Modus; bei aufwendigeren Rechnungen ist die Ersparnis entsprechend größer.

Ein weiterer Vorteil der UPN ist es, dass die Rechnung stets schrittweise und mit sichtbaren Zwischenergebnissen ausgeführt wird; man kann die Daten also nach und nach weiterbearbeiten; allerdings zeigen auch viele algebraische Taschenrechner Zwischenergebnisse, so weit das möglich ist, zum Beispiel beim Betätigen der )-Taste den Wert des aktuellen Klammerausdrucks.

Die Verfügbarkeit von Zwischenergebnissen erleichtert es nicht nur, die Eingaben zu kontrollieren und Fehler zu identifizieren, sondern erlaubt es im Zusammenhang mit den bei UPN verfügbaren Vertauschungsoperationen innerhalb des Stapels, jedes Zwischenergebnis einfach zu speichern, ohne dass dafür gesonderte Speicherregister benötigt würden, und später weiterzuverarbeiten. Insbesondere lässt sich der häufig vorkommende Fall, dass ein Operand gleich nochmals benötigt wird – wie etwa in der Rechnung (a-b)/b – ohne erneute Eingabe oder Speicherung von b rechnen; UPN-Rechner verfügen dafür über ein Register LASTX, das den letzten Operanden automatisch speichert.

Die Programmierung eines UPN-Rechners folgt normalerweise exakt der manuellen Eingabe einer Berechnung, was vor allem bei häufigen kurzen Rechenaufgaben sehr anwendungsfreundlich ist, weil keine gesonderte Programmiersprache erlernt werden muss. Bei algebraischen Taschenrechnern weicht das Programmiermodell oft (aber nicht immer) von der manuellen Formeleingabe ab.

Nachteile[Bearbeiten]

Nachteil der UPN ist in erster Linie die Tatsache, dass sie häufig nicht aus dem täglichen Leben beziehungsweise der Schule vertraut ist und daher erst erlernt werden muss; hinzu kommt, dass die Vorteile erst beim intensiveren Gebrauch und vor allem bei der Arbeit mit komplizierten Formeln zu bemerken sind. Die Gewöhnung an eine der beiden Notationen kann den Umgang mit der jeweils anderen erschweren.

Umsetzung[Bearbeiten]

In klassischen UPN-Rechnern werden vier Stackebenen verwendet, die mit X (Anzeigewert), Y, Z und T bezeichnet sind. Erste Umsetzungen mit nur drei Registern (X, Y und Z) hatten sich Ende der 1960er Jahre als unzureichend herausgestellt. Ein weiteres Register L (LASTX) speichert automatisch den letzten Wert von X. Zusätzlich ist eine Vertauschung von X und Y (wichtig für nicht-kommutative Operationen) sowie eine zyklische Vertauschung aller vier Register (roll down, der Wert von X gelangt nach T, der Wert von Y nach X, usw.) implementiert. In besser ausgestatteten Rechnern ist auch die umgekehrte zyklische Vertauschung (roll up) und später (im HP-41) das beliebige Speichern und Zurückrufen von Stackregistern möglich.

Register T hat dabei eine Sonderfunktion. Operationen, die mehr als ein Argument haben, verschieben den Stack "nach unten", und der Wert von T wird kopiert, was für fortgesetztes Rechnen sehr vorteilhaft sein kann. Frühe Umsetzungen löschten auf einigen Rechnern T (T clears on pop), was sich in der Praxis als ungeeignet herausstellte. Es gab auch Modelle (wie den HP-35), die bei komplexen Operationen T als Zwischenspeicher benötigten und dessen Inhalt überschrieben.

In der Vergangenheit, insbesondere in der Frühzeit elektronischer Taschenrechner, galt als wesentlicher Vorteil der UPN, dass sie sich mit geringerem Hardwareaufwand realisieren lässt. Die Praxis zeigt, dass sich relativ komplexe mathematische Berechnungen mit einem Stapel von nur vier Einträgen ausführen lassen. Demgegenüber muss ein algebraischer Taschenrechner für jede Klammerebene und allgemein für jedes Zwischenergebnis („Punkt- vor Strichrechnung“), das er verarbeiten soll, ein eigenes Register besitzen; in der Praxis wurden algebraische Taschenrechner mit bis zu zwölf Operandenregistern zur Speicherung von bis zu elf unvollständigen Operationen hergestellt. Mit der Leistungsfähigkeit der heutigen elektronischen Schaltkreise ist dieser theoretische Vorteil der UPN technisch nicht mehr bedeutsam, und es werden heute moderne UPN-Taschenrechner mit mehr als vier Stapelregistern und mit zusätzlichen Speicherregistern ausgestattet.

Algorithmen[Bearbeiten]

Konvertierung von Infix-Notation nach UPN[Bearbeiten]

Arithmetischer Ausdruck 23\cdot 2 -4 als Term-Baum

Ein arithmetischer Ausdruck in Infix-Notation kann zeichenweise mit dem Shunting-yard-Algorithmus (deutsch: ‚Rangierbahnhof‘-Algorithmus) direkt in die UPN umgewandelt werden.

Bei der Darstellung von einem Ausdruck in Infix-Notation als Term-Baum entspricht die UPN der Ausgabe der Knoten-Labels in einem Postorder-Traversal.

Beispiel:

Infix-Notation: 23\cdot 2-4

Postorder-Traversal:

   postorder(23*2-4)
-> postorder(23*2); postorder(4); print(-);
-> postorder(23); postorder(2); print(*); postorder(4); print(-);
-> print(23); print(2); print(*); print(4); print(-)

Postfix-Notation (UPN): 23 2 * 4 -

Definition: Analog zu einem Postorder-Traversal lässt sich die UPN formal über die Konvertierung von einem Infix-Ausdruck rekursiv definieren:

  1. Wenn der Infix-Ausdruck e ein Operand ist, dann ist e in UPN.
  2. Wenn der Infix-Ausdruck in der Form e_1 \theta e_2 vorliegt, dann ist seine UPN durch e_1' e_2' \theta definiert, wobei e_1' bzw. e_2' die UPN von e_1 bzw. e_2 bezeichnen.
  3. Wenn ein Infix-Ausdruck die Form (e) hat, dann ist e' seine UPN, wobei e' die UPN von e bezeichnet.

Anwendung[Bearbeiten]

Die Umwandlung eines Infix-Terms nach UPN ist ein wichtiger Bestandteil beim Compilerbau.

Auswertung[Bearbeiten]

Ein Ausdruck in UPN wird ausgewertet, indem er von links nach rechts gelesen wird, wobei Operanden auf einen Stack gelegt werden. Wird ein x-stelliger Operator gelesen, werden x Elemente vom Stack entfernt, der Operator auf diese angewendet und das Ergebnis auf den Stack geschoben. Am Ende der Verarbeitung liegt das Gesamtergebnis der Berechnung auf dem Stack. Der folgende Pseudocode spezifiziert diesen Algorithmus:

compute_rpn(input)
  stack_init
  foreach (o in input)
     switch o
       isnumber
         push o
       isbinoperator
         right = pop
         left = pop
         t = compute(left, o, right)
         push t
  return pop

Die Reihenfolge, in der die Operanden vom Stack entnommen werden, ist nicht beliebig. Sie ergibt sich direkt aus der Definition der Umwandlung von Infix-Ausdrücken in die UPN. Bei nicht-kommutativen Operatoren kann eine falsche Operandenfolge zu einem falschen Ergebnis führen.

Beispiel: 23 2 * 4 -

           stack : []
o = 23     stack : [23]
o = 2      stack : [23,2]
o = *
right = 2  stack : [23]
left = 23  stack : []
t = 46     stack : [46]
o = 4      stack : [46,4]
o = -
right = 4  stack : [46]
left = 46  stack : []
t = 42     stack : [42]

Modelle[Bearbeiten]

Es gibt im Vergleich zu rein algebraischen Taschenrechnern nur wenige Taschenrechnermodelle, die auch oder ausschließlich UPN unterstützen; der einzige bekannte Hersteller, der eine größere Zahl UPN-fähiger Geräte herstellt, ist Hewlett Packard. Mit Ausnahme des seit 1981 erhältlichen reinen UPN-Taschenrechners HP-12C und einiger rein algebraischer Geräte im unteren Preisbereich unterstützen die Anfang 2007 neu auf den Markt gekommenen HP-Taschenrechner wie der HP-50g beide Eingabenotationen.

Derzeit bietet auch die russische Firma Semico Taschen- und Tischrechner mit UPN-Eingabe, allerdings ausschließlich mit kyrillischer Tastatur, an.[1]

Der in Emacs integrierte Taschenrechner Calc verwendet optional die umgekehrte polnische Notation. Auf der Shell nahezu jedes Unix-Systems steht der Rechner dc zur Verfügung, der ebenfalls auf der umgekehrten polnischen Notation beruht. Auch der Rechner von Mac OS X kann optional im UPN-Betrieb genutzt werden, wobei allerdings eine falsche Implementierung des Stacks die Benutzbarkeit einschränkt.

Darüber hinaus werden insbesondere im Open Source, Free- und Sharewarebereich etliche Programme angeboten, die UPN-Rechner emulieren bzw. die UPN verwenden.

Geschichte[Bearbeiten]

Die Polnische Notation (auch Präfix-Notation oder Łukasiewicz-Notation) verdankt ihren Namen dem polnischen Mathematiker Jan Łukasiewicz, der sie in den 1920er-Jahren entwickelte (eine genauere Datierung ist wohl nicht möglich[2]). Łukasiewicz stellte die polnische Notation als kompakte und klammerfreie Schreibweise für die Aussagenlogik vor.

Łukasiewicz weist selbst darauf hin,[3] dass seine Schreibweise zwar die kompakteste und die erste linear geschriebene klammerfreie Schreibweise ist, aber nicht die erste klammerfreie Schreibweise überhaupt. Das Verdienst, die Logik von der Klammer befreit zu haben, kommt Gottlob Frege mit seiner bereits 1879 veröffentlichten Begriffsschriftnotation zu.

Der gleiche Effekt der Klammerfreiheit wird erreicht, wenn der Operator nicht vor den Operanden, sondern danach steht. Diese Variante der polnischen Notation, die als „Umgekehrte Polnische Notation“ bezeichnet wird, wurde vermutlich ebenfalls bereits von Łukasiewicz gesehen. Explizit angesprochen und praktisch verwendet wurde die Umgekehrte Polnische Notation allerdings wohl erst in den 1950er-Jahren vom australischen Philosophen Charles Hamblin.

Einzelnachweise[Bearbeiten]

  1. http://mk.semico.ru/
  2. „Die ältesten Texte in den ‚Selected Works‘, in denen Łukasiewicz polnische Notation verwendet, datieren relativ spät, sind aber Präsentationen vorangehender Arbeiten, die ‚in the course of the years 1920–1930‘ (Seite 131) stattgefunden haben, also auch keine genauere Zeitangabe geben.“ (Ch. Gottschall: Logische Notationen und deren Verarbeitung auf elektronischen Rechenanlagen aus theoretischer, praktischer und historischer Sicht (Diplomarbeit), Wien 2005, S. 88)
  3. „On the history of the logic of propositions“, abgedruckt in: Łukasiewicz, 1970

Literatur[Bearbeiten]

Weblinks[Bearbeiten]