This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Evaluierung von Ausdrücken /

AttributeNichtstandardmäßige Evaluierung

2.5.4 Das Standard-Evaluierungsverfahren

Dieser Abschnitt beschreibt die Standard-Prozedur, die Mathematica zur Evaluierung von Ausdrücken einsetzt. Die meisten Ausdrücke werden entsprechend dieser Prozedur behandelt. Einige Ausdruckstypen, wie zum Beispiel jene, die zur Darstellung von Mathematica-Programmen und Kontrollstrukturen dienen, werden jedoch nicht standardmäßig evaluiert. Die Behandlung solcher Ausdrücke wird in den anschließenden Abschnitten diskutiert.

Beim Standard-Evaluierungsverfahren evaluiert Mathematica zuerst den Kopf eines Ausdrucks und dann jedes Element des Ausdrucks. Im allgemeinen sind diese Elemente selbst Ausdrücke, auf die dasselbe Evaluierungsverfahren rekursiv angewendet wird.

Die drei Print-Funktionen werden der Reihe nach evaluiert: Jede druckt ihr Argument und liefert dann den Wert Null.

In[1]:= {Print[1], Print[2], Print[3]}

Out[1]=

Dadurch wird dem Symbol ps der Wert Plus zugewiesen.

In[2]:= ps = Plus

Out[2]=

Der Kopf ps wird zuerst evaluiert, darum verhält sich dieser Ausdruck so wie eine Summe von Termen.

In[3]:= ps[ps[a, b], c]

Out[3]=

Sobald Mathematica den Kopf eines Ausdrucks evaluiert hat, prüft es, ob der Kopf ein Symbol mit Attributen ist. Hat das Symbol die Attribute Orderless, Flat oder Listable, dann führt Mathematica nach Evaluierung der Elemente des Ausdrucks sofort die mit diesen Attributen verknüpften Transformationen durch.

Der nächste Schritt im Standard-Evaluierungsverfahren besteht darin, Definitionen anzuwenden, die Mathematica für die Ausdrücke kennt, die es gerade evaluiert. Mathematica versucht zuerst, Definitionen zu verwenden, die Sie aufgestellt haben, und falls es keine anwendbaren gibt, versucht es eingebaute Definitionen.

Stößt Mathematica auf eine anwendbare Definition, so wendet es die entsprechende Transformation auf den Ausdruck an. Das Ergebnis ist ein anderer Ausdruck, der dann entsprechend dem Standard-Evaluierungsverfahren selbst wieder evaluiert werden muß.

Das Standard-Evaluierungsverfahren

Mathematica richtet sich, wie in Abschnitt 2.5.1 erwähnt wurde, nach dem Prinzip, daß jeder Ausdruck evaluiert wird, bis keine weiteren Definitionen mehr anwendbar sind. Dies bedeutet, daß Mathematica wiederholt die Evaluierung von Ergebnissen fortsetzen muß, bis ein Ausdruck durch das Evaluierungsverfahren unverändert bleibt.

Im folgenden Beispiel wird gezeigt, wie das Standard-Evaluierungsverfahren mit einem einfachen Ausdruck verfährt. Wir nehmen a = 7 an.

Ein einfaches Beispiel für die Evaluierung in Mathematica

Mathematica bietet verschiedene Wege für den Trace (Ablaufverfolgung) des Evaluierungsverfahrens (siehe dazu Abschnitt 2.5.10). Die Funktion Trace[ausdr] ergibt eine verschachtelte Liste, die jeden während der Evaluierung erzeugten Unterausdruck zeigt. (Beachten Sie, daß die Standard-Evaluierung beim Durchschreiten des Ausdrucksbaumes zuerst in die Tiefe, zu den Blättern, geht, so daß die kleinsten Unterteile des Ausdrucks in den Ergebnissen von Trace zuerst erscheinen.)

Setze zuerst a gleich 7.

In[4]:= a = 7

Out[4]=

Dies ergibt eine verschachtelte Liste aller Unterausdrücke, die während der Evaluierung des Ausdrucks erzeugt werden.

In[5]:= Trace[2 a x + a^2 + 1]

Out[5]=

Die Reihenfolge, in der Mathematica verschiedene Definitionsarten anwendet, ist wichtig. Die Tatsache, daß Mathematica von Ihnen stammende Definitionen vor eingebauten Definitionen anwendet, erlaubt, daß Sie Definitionen aufstellen können, die die Eingebauten außer Kraft setzen, so wie das in Abschnitt 2.4.12 diskutiert wird.

Dieser Ausdruck wird mit den eingebauten Definitionen für ArcSin evaluiert.

In[6]:= ArcSin[1]

Out[6]=

Sie können ArcSin Ihre eigene Definition geben. Dazu müssen Sie zuerst das Protektionsattribut entfernen.

In[7]:= Unprotect[ArcSin]; ArcSin[1] = 5Pi/2;

Ihre Definition wird vor der Eingebauten verwendet.

In[8]:= ArcSin[1]

Out[8]=

In Abschnitt 2.4.10 wurde bereits erwähnt, daß Sie Definitionen mit Symbolen entweder als Auf-Wert oder als Ab-Wert verknüpfen können. Mathematica versucht immer, Auf- vor Ab-Wert-Definitionen anzuwenden.

Wenn Sie Ausdrücke wie f[g[x]] haben, dann gibt es im allgemeinen zwei Sätze von Definitionen, die anwendbar sein könnten: Ab-Werte, verknüpft mit f, und Auf-Werte, verknüpft mit g. Mathematica testet die mit g verknüpften Definitionen vor jenen, die mit f verknüpft sind.

Diese Reihenfolge folgt der allgemeinen Strategie, spezielle Definitionen vor allgemeineren zu versuchen. Durch die Anwendung von Auf-Werten, verknüpft mit Argumenten, vor dem Anwenden von Ab-Werten, verknüpft mit einer Funktion, erlaubt Ihnen Mathematica, Definitionen für spezielle Argumente zu erstellen, die die allgemeinen Definitionen für die Funktion mit beliebigen Argumenten ersetzen.

Dies definiert eine Regel für f[g[x_]], die mit f verknüpft sein soll.

In[9]:= f/: f[g[x_]] := frule[x]

Dies definiert eine Regel für f[g[x_]], die mit g verknüpft sein soll.

In[10]:= g/: f[g[x_]] := grule[x]

Diese mit g verknüpfte Regel wird vor der Regel versucht, die mit f verknüpft ist.

In[11]:= f[g[2]]

Out[11]=

Wenn Sie Regeln entfernen, die mit g verknüpft sind, wird die mit f verknüpfte Regel versucht.

In[12]:= Clear[g] ; f[g[1]]

Out[12]=

Die Reihenfolge, in der Definitionen angewendet werden

Die meisten Funktionen, wie zum Beispiel Plus, die in Mathematica eingebaut sind, haben Ab-Werte. Es gibt jedoch einige Objekte in Mathematica, die eingebaute Auf-Werte haben. Zum Beispiel haben SeriesData-Objekte, die Potenzreihen repräsentieren, eingebaute Auf-Werte in Bezug auf verschiedene mathematische Operationen.

Für einen Ausdruck wie f[g[x]] lautet die vollständige Folge der Definitionen, die im normalen Evaluierungsverfahren versucht wird:

FilledSmallSquare Definitionen, die Sie gegeben haben, verknüpft mit g;

FilledSmallSquare Eingebaute Definitionen, verknüpft mit g;

FilledSmallSquare Definitionen, die Sie gegeben haben, verknüpft mit f;

FilledSmallSquare Eingebaute Definitionen, verknüpft mit f.

Die Tatsache, daß Auf-Werte vor Ab-Werten versucht werden, ist in vielen Situationen wichtig. In einem typischen Fall möchten Sie vielleicht eine Operation wie Verkettung definieren. Geben Sie Auf-Werte für verschiedene Objekte bezüglich der Verkettung an, so werden diese Auf-Werte verwendet, sobald derartige Objekte auftauchen. Sie können jedoch auch eine allgemeine Prozedur für die Verkettung angeben, die dann zu verwenden ist, wenn keine Spezialobjekte vorhanden sind. Sie können diese Prozedur als Ab-Wert für die Verkettung angeben. Da Ab-Werte nach Auf-Werten versucht werden, wird die allgemeine Prozedur nur dann verwendet, wenn keine Objekte mit Auf-Werten vorhanden sind.

Dies ist eine zu q gehörige Definition für die Verkettung von „q-Objekten".

In[13]:= q/: comp[q[x_], q[y_]] := qcomp[x, y]

Dies ist eine allgemeine Regel für die Verkettung, die an comp gebunden ist.

In[14]:= comp[f_[x_], f_[y_]] := gencomp[f, x, y]

Wenn Sie zwei q-Objekte zusammensetzen, wird die an q gebundene Regel verwendet.

In[15]:= comp[q[1], q[2]]

Out[15]=

Wenn Sie r-Objekte zusammensetzen, wird die allgemeine Regel verwendet, die an comp gebunden ist.

In[16]:= comp[r[1], r[2]]

Out[16]=

Im allgemeinen kann es mehrere Objekte geben, die Auf-Werte in einem bestimmten Ausdruck haben. Mathematica betrachtet zuerst den Kopf des Ausdrucks und versucht dann alle an ihn geknüpften Auf-Werte. Dann betrachtet es nacheinander jedes Element des Ausdrucks und versucht jeden existierenden Auf-Wert. Mathematica führt diese Prozedur zuerst für Auf-Werte durch, die Sie explizit definiert haben, und dann für eingebaute Auf-Werte. Diese Prozedur führt dazu, daß in einer Elementfolge Auf-Werte, die mit vorangehenden Elementen verknüpft sind, Vorrang gegenüber solchen haben, die mit späteren verknüpft sind.

Dies definiert einen Auf-Wert für p in Bezug auf c.

In[17]:= p/: c[l___, p[x_], r___] := cp[x, {l, r}]

Dies definiert einen Auf-Wert für q.

In[18]:= q/: c[l___, q[x_], r___] := cq[x, {l, r}]

Welcher Auf-Wert verwendet wird, hängt davon ab, welcher in der Argumentfolge für c zuerst auftritt.

In[19]:= {c[p[1], q[2]], c[q[1], p[2]]}

Out[19]=

AttributeNichtstandardmäßige Evaluierung