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

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

Nichtstandardmäßige EvaluierungEvaluierung in Iterationsfunktionen

2.5.6 Evaluierung in Mustern, Regeln und Definitionen

In Mathematica gibt es zwischen Evaluierung und Mustererkennung eine Reihe wichtiger Interaktionen. Die erste Beobachtung besteht darin, daß Mustererkennung gewöhnlich mit Ausdrücken erfolgt, die zumindest teilweise bereits evaluiert worden sind. Deshalb ist es gewöhnlich sinnvoll, daß die Muster, mit denen diese Ausdrücke verglichen werden, selber evaluiert sein sollten.

Die Tatsache, daß das Muster evaluiert wird, bewirkt, daß es zu dem gegebenen Ausdruck paßt.

In[1]:= f[k^2] /. f[x_^(1 + 1)] -> p[x]

Out[1]=

Die rechte Seite der /;-Bedingung wird so lange nicht evaluiert, bis sie während des Mustervergleichs eingesetzt wird.

In[2]:= f[{a, b}] /. f[liste_ /; Length[liste] > 1] -> liste^2

Out[2]=

Es gibt jedoch einige Fälle, in denen Sie ein Muster insgesamt oder teilweise unevaluiert bewahren wollen. Dies erreichen Sie, indem Sie jene Teile, die nicht evaluiert werden sollen, mit HoldPattern einhüllen. Taucht HoldPattern[muster] in einem Muster auf, so ist es für den Mustervergleich im allgemeinen äquivalent zu muster; es beläßt muster aber in einer unevaluierten Form.

Verhinderung der Evaluierung in Mustern

Eine Anwendung für HoldPattern liegt in der Spezifizierung von Mustern, die auf unevaluierte Ausdrücke anwendbar sein können, oder auf Ausdrücke, die in unevaluierter Form gehalten werden.

HoldPattern bewahrt 1 + 1 vor der Evaluierung und ermöglicht, daß es zu 1 + 1 auf der linken Seite des /.-Operators paßt.

In[3]:= Hold[u[1 + 1]] /. HoldPattern[1 + 1] -> x

Out[3]=

Beachten Sie: Während Funktionen wie Hold die Evaluierung von Ausdrücken verhindern, beeinflussen sie nicht die Manipulation von Teilen jener Ausdrücke mit /. und anderen Operatoren.

Hiermit werden Werte für r definiert, wann immer deren Argument kein atomares Objekt ist.

In[4]:= r[x_] := x^2 /; !AtomQ[x]

Gemäß der Definition werden Ausdrücke wie r[3] unverändert belassen.

In[5]:= r[3]

Out[5]=

Das Muster r[x_] wird jedoch gemäß der Definition für r transformiert.

In[6]:= r[x_]

Out[6]=

Sie müssen r[x_] mit HoldPattern versehen, um zu verhindern, daß es evaluiert wird.

In[7]:= {r[3], r[5]} /. HoldPattern[r[x_]] -> x

Out[7]=

Es wurde oben bereits erläutert, daß die linken Seiten von Transformationsregeln, wie zum Beispiel ls -> rs, gewöhnlich sofort evaluiert werden, da die Regeln gewöhnlich auf Ausdrücke angewendet werden, die bereits evaluiert worden sind. Die rechte Seite von ls -> rs wird ebenfalls sofort evaluiert. Bei der verzögerten Regel ls :> rs wird der Ausdruck rs jedoch nicht evaluiert.

Die rechte Seite wird bei ->-Regeln sofort, bei :>-Regeln jedoch nicht sofort evaluiert.

In[8]:= {{x -> 1 + 1}, {x :> 1 + 1}}

Out[8]=

Hier sind die Ergebnisse der Anwendung der Regeln. Die rechte Seite der :>-Regel wird ohne Evaluierung innerhalb Hold eingefügt.

In[9]:= {x^2, Hold[x]} /. %

Out[9]=

Evaluierung in Transformationsregeln

Während die linken Seiten von Transformationen gewöhnlich evaluiert werden, ist dies bei den linken Seiten von Definitionen gewöhnlich nicht der Fall. Der Grund für diesen Unterschied ist folgender: Transformationsregeln werden in der Regel mit /. auf Ausdrücke angewendet, die bereits evaluiert worden sind. Definitionen werden jedoch während der Evaluierung von Ausdrücken eingesetzt und dabei auf Ausdrücke angewendet, die noch nicht vollständig evaluiert worden sind. Um mit derartigen Ausdrücken arbeiten zu können, müssen die linken Seiten von Definitionen in einer zumindest teilweise unevaluierten Form bewahrt werden.

Definitionen für Symbole sind der einfachste Fall. Im vorigen Abschnitt wurde bereits erwähnt, daß ein Symbol auf der linken Seite einer Definition wie x = wert nicht evaluiert wird. Wenn x vorher bereits den Wert y erhalten hätte, dann würde es nach Evaluierung von x = wert in die recht bezugslose Definition y = wert verwandelt werden.

Dies ist eine Definition. Das Symbol auf der linken Seite ist nicht evaluiert.

In[10]:= k = w[3]

Out[10]=

Dies definiert das Symbol neu.

In[11]:= k = w[4]

Out[11]=

Wenn Sie die linke Seite evaluieren, dann definieren Sie nicht das Symbol k, sondern den Wert w[4] des Symbols k.

In[12]:= Evaluate[k] = w[5]

Out[12]=

Nun hat w[4] den Wert w[5].

In[13]:= w[4]

Out[13]=

Obwohl einzelne Symbole, die auf der linken Seite von Definitionen erscheinen, nicht evaluiert werden, werden kompliziertere Ausdrücke teilweise evaluiert. In einem Ausdruck, wie zum Beispiel f[args], auf der linken Seite einer Definition werden die args evaluiert.

1 + 1 wird evaluiert, so daß ein Wert für g[2] definiert wird.

In[14]:= g[1 + 1] = 5

Out[14]=

Dies zeigt den für g definierten Wert.

In[15]:= ?g

Sie können sehen, warum die Argumente einer Funktion, die auf der linken Seite einer Definition erscheint, evaluiert werden müssen, wenn Sie sich die Anwendung der Definition während der Evaluierung eines Ausdrucks anschauen. In Abschnitt 2.5.1 wurde bereits erwähnt, daß Mathematica, wenn es eine Funktion evaluiert, zuerst jedes der Argumente evaluiert und dann versucht, Definitionen für die Funktion zu finden. Sobald Mathematica irgendeine Ihrer Definitionen für die Funktion anwendet, müssen deshalb die Argumente der Funktion bereits evaluiert worden sein. Eine Ausnahme davon liegt vor, wenn die betreffende Funktion Attribute hat, die spezifizieren, daß einige ihrer Argumente unevaluiert gehalten werden sollen.

Evaluierung in Definitionen

Während in den meisten Fällen die Evaluierung von Argumenten einer Funktion, die auf der linken Seite einer Definition erscheint, sinnvoll ist, so gibt es doch einige Situationen, in denen dies unerwünscht ist. Dann können die Teile, die nicht evaluiert werden sollen, mit HoldPattern eingehüllt werden.

Nichtstandardmäßige EvaluierungEvaluierung in Iterationsfunktionen