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 /  Transformationsregeln und Definitionen /

Funktionen, die sich an die gefundenen Werte erinnernDefinition von numerischen Werten

2.4.10 Definitionen mit verschiedenen Symbolen verknüpfen

Wenn Sie eine Definition der Form f[args] = rs oder f[args] := rs aufstellen, verknüpft Mathematica Ihre Definition mit dem Objekt f. Deshalb werden diese Definitionen angezeigt, wenn Sie ?f eintippen. Im allgemeinen werden Definitionen für Ausdrücke, in denen das Symbol f als Kopf erscheint, Ab-Werte von f genannt.

Mathematica unterstützt jedoch auch Auf-Werte, wodurch Definitionen mit Symbolen verknüpft werden können, die nicht direkt als ihr Kopf erscheinen.

Betrachten Sie zum Beispiel eine Definition wie Exp[g[x_]] := rs. Diese Definition könnte mit dem Symbol Exp verknüpft werden und als Ab-Wert von Exp angesehen werden. Dies ist jedoch wahrscheinlich nicht das Beste, sowohl vom Standpunkt der Organisation aus als auch von dem der Effizienz.

Besser ist es, Exp[g[x_]] := rs als mit g verknüpft und damit als Auf-Wert von g anzusehen.

Definitionen mit Symbolen an verschiedenen Positionen verknüpfen

Dadurch wird ein Ab-Wert für f definiert.

In[1]:= f[g[x_]] := fg[x]

Sie können die Definition sehen, wenn Sie nach f fragen.

In[2]:= ?f

Dadurch wird ein Auf-Wert für g definiert.

In[3]:= Exp[g[x_]] ^:= expg[x]

Die Definition ist mit g verknüpft.

In[4]:= ?g

Sie ist nicht mit Exp verknüpft.

In[5]:= ??Exp

Die Definition wird benutzt, um diesen Ausdruck zu evaluieren.

In[6]:= Exp[g[5]]

Out[6]=

In einfachen Fällen werden Sie dieselben Antworten erhalten, ob Sie nun eine Definition für f[g[x]] als Ab-Wert für f oder als Auf-Wert für g aufstellen. Eine der beiden Wahlmöglichkeiten ist jedoch gewöhnlich viel natürlicher und effizienter als die andere.

Eine gute Faustregel ist: Eine Definition für f[g[x]] sollte als ein Auf-Wert für g in Fällen gegeben werden, bei denen die Funktion f gebräuchlicher als g ist. So ist zum Beispiel im Falle von Exp[g[x]] Exp eine eingebaute Mathematica-Funktion, während g wahrscheinlich eine Funktion ist, die von Ihnen stammt. In solchen Fällen werden Sie sich normalerweise die Definitionen für Exp[g[x]] als Angabe von Relationen vorstellen, die von g erfüllt werden. Infolgedessen ist es natürlicher, die Definitionen als Auf-Werte für g und nicht als Ab-Werte für Exp zu behandeln.

Dies ergibt die Definition als einen Auf-Wert für g.

In[7]:= g/: g[x_] + g[y_] := gplus[x, y]

Hier sind die bis jetzt gegebenen Definitionen für g.

In[8]:= ?g

Die Definition für eine Summe von g's wird, wenn möglich, benutzt.

In[9]:= g[5] + g[7]

Out[9]=

Da die vollständige Form der Muster g[x_] + g[y_] gleich Plus[g[x_], g[y_]] ist, könnte eine Definition für dieses Muster als ein Ab-Wert für Plus angegeben werden. Es ist jedoch fast immer besser, die Definition als einen Auf-Wert für g anzugeben.

Im allgemeinen testet Mathematica, wann immer es auf eine bestimmte Funktion trifft, alle Definitionen, die Sie für diese Funktion angegeben haben. Wenn Sie die Definition für g[x_] + g[y_] zu einem Ab-Wert für Plus gemacht hätten, würde Mathematica diese Definition immer dann testen, wenn Plus auftaucht. Die Definition würde so jedesmal getestet werden, wenn Mathematica Ausdrücke addieren würde, und diese sehr häufige Operation in allen Fällen langsamer machen.

Indem Sie jedoch eine Definition für g[x_] + g[y_] als einen Auf-Wert für g aufstellen, verknüpfen Sie die Definition mit g. In diesem Fall testet Mathematica die Definition nur, wenn es ein g innerhalb einer Funktion wie Plus findet. Da g wahrscheinlich weniger häufig als Plus erscheint, ist dies eine sehr viel effizientere Prozedur.

Kürzere Wege zur Definition von Auf-Werten

Eine typische Verwendung von Auf-Werten ist die Anlage einer „Datenbank", die Eigenschaften eines bestimmten Objektes enthält. Mit Auf-Werten können Sie jede von Ihnen gemachte Definition mit dem Objekt, das davon betroffen ist, statt mit der Eigenschaft, die Sie spezifizieren, verknüpfen.

Dadurch wird ein Auf-Wert für quadrat definiert, der dessen Flächeninhalt angibt.

In[10]:= fläche[quadrat] ^= 1

Out[10]=

Dies fügt eine Definition für den Umfang hinzu.

In[11]:= perimeter[quadrat] ^= 4

Out[11]=

Beide Definitionen sind jetzt mit dem Objekt quadrat verknüpft.

In[12]:= ?quadrat

Im allgemeinen können Sie Definitionen für einen Ausdruck mit jedem Symbol verknüpfen, das auf einer genügend hohen Stufe in dem Ausdruck erscheint. Mit einem Ausdruck der Form f[args] können Sie einen Auf-Wert für ein Symbol g definieren, falls entweder g selbst oder ein Objekt mit Kopf g in args erscheint. Erscheint g jedoch in einem Ausdruck auf einer niedrigeren Stufe, so können Sie keine Definitionen mit ihm verknüpfen.

g erscheint als der Kopf eines Argumentes, daher können Sie eine Definition mit ihm verknüpfen.

In[13]:= g/: h[w[x_], g[y_]] := hwg[x, y]

Hier erscheint g zu tief auf der linken Seite, als daß Sie eine Definition mit ihm verknüpfen könnten.

In[14]:= g/: h[w[g[x_]], y_] := hw[x, y]

Out[14]=

Mögliche Positionen für Symbole in Definitionen

Sie können Mathematica-Symbole als „Etiketten" benutzen, um den „Typ" eines Ausdrucks anzugeben (siehe Abschnitt 2.1.2). Zum Beispiel werden komplexe Zahlen intern in der Form Complex[x, y] dargestellt, wobei das Symbol Complex als ein Etikett dient, um anzuzeigen, daß das Objekt eine komplexe Zahl ist.

Auf-Werte bieten einen bequemen Mechanismus zur Spezifizierung, wie Operationen auf Objekten agieren, die mit einem bestimmten Typ als Etikett versehen sind. Sie möchten zum Beispiel vielleicht eine Klasse mathematischer Objekte des Typs quat einführen. Sie können jedes Objekt dieses Typs durch einen Mathematica-Ausdruck der Form quat[daten] darstellen.

In einem typischen Fall möchten Sie vielleicht, daß quat-Objekte spezielle Eigenschaften bezüglich der arithmetischen Operationen wie Addition und Multiplikation haben. Sie können solche Eigenschaften mit Hilfe von Auf-Werten für quat bezüglich Plus und Times definieren.

Dadurch wird ein Auf-Wert für quat bezüglich Plus definiert.

In[15]:= quat[x_] + quat[y_] ^:= quat[x + y]

Mit dem von Ihnen definierten Auf-Wert wird dieser Ausdruck vereinfacht.

In[16]:= quat[a] + quat[b] + quat[c]

Out[16]=

Wenn Sie einen Auf-Wert für quat bezüglich einer Operation wie Plus definieren, machen Sie letztlich nichts anderes, als den Definitionsbereich der Operation Plus so zu erweitern, daß er quat-Objekte einschließt. Sie weisen Mathematica an, daß es spezielle Regeln für die Addition in dem Fall anwenden soll, wenn die zu addierenden Gegenstände quat-Objekte sind.

Bei der Definition von Addition für quat-Objekte könnten Sie natürlich eine spezielle Additionsoperation, sagen wir quatPlus, verwenden, der Sie einen geeigneten Ab-Wert zuweisen. Es ist jedoch gewöhnlich vorteilhafter, die normale Mathematica-Operation Plus zur Darstellung der Addition zu verwenden, dann aber diese Operation zu „überladen", indem Sie ein spezielles Verhalten angeben, wenn quat-Objekte angetroffen werden.

Sie können sich Auf-Werte als eine Methode vorstellen, bestimmte Aspekte der objektorientierten Programmierung zu implementieren. Ein Symbol wie quat repräsentiert einen besonderen Objekttyp. Die verschiedenen Auf-Werte für quat spezifizieren „Methoden", die definieren, wie sich quat-Objekte bei bestimmten Operationen oder beim Empfang bestimmter „Meldungen" verhalten sollen.

Funktionen, die sich an die gefundenen Werte erinnernDefinition von numerischen Werten