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 /  Muster /

Muster, die Alternativen enthaltenFunktionen mit einer variablen Anzahl von Argumenten

2.3.7 Flache und ungeordnete Funktionen

Obwohl Mathematica Muster auf rein strukturelle Art vergleicht, ist der verwendete Begriff der strukturellen Äquivalenz recht anspruchsvoll. Insbesondere werden solche Eigenschaften wie Kommutativität und Assoziativität in Funktionen wie Plus und Times berücksichtigt.

Deshalb betrachtet Mathematica die Ausdrücke x + y und y + x in Bezug auf Mustervergleich als äquivalent. Folglich paßt ein Muster wie g[x_ + y_, x_] nicht nur zu g[a + b, a], sondern auch zu g[a + b, b].

Dieser Ausdruck hat exakt dieselbe Form wie das Muster.

In[1]:= g[a + b, a] /. g[x_ + y_, x_] -> p[x, y]

Out[1]=

In diesem Fall muß der Ausdruck in die Form g[b + a, b] gebracht werden, damit er dieselbe Struktur wie das Muster hat.

In[2]:= g[a + b, b] /. g[x_ + y_, x_] -> p[x, y]

Out[2]=

Wann immer Mathematica in einem Muster auf eine ungeordnete oder kommutative Funktion wie Plus oder Times stößt, testet es beim Versuch, ein passendes Gegenstück zu finden, alle möglichen Anordnungen der Argumente. Manchmal gibt es mehrere Anordnungen, die passen. In solchen Fällen verwendet Mathematica nur die erste Anordnung, die es findet. h[x_ + y_, x_ + z_] könnte zum Beispiel zu h[a + b, a + b] passen mit xa, yb, zb oder mit xb, ya, za. Mathematica versucht den Fall xa, yb, zb zuerst und benutzt deshalb dieses Gegenstück.

Dies kann entweder zu x a oder zu x b passen. Mathematica probiert x a zuerst und benutzt deshalb dieses Gegenstück.

In[3]:= h[a + b, a + b] /. h[x_ + y_, x_ + z_] -> p[x, y, z]

Out[3]=

ReplaceList zeigt beide möglichen Gegenstücke.

In[4]:= ReplaceList[h[a + b, a + b],
h[x_ + y_, x_ + z_] -> p[x, y, z]]

Out[4]=

Mit Mathematica können Sie Funktionen verschiedene Attribute zuweisen, die angeben, wie diese Funktionen bei der Evaluierung und beim Mustervergleich behandelt werden sollen (siehe Abschnitt 2.5.3). Funktionen können zum Beispiel das Attribut Orderless zugewiesen bekommen, das angibt, daß sie als kommutativ oder symmetrisch behandelt werden sollen, und das erlaubt, daß ihre Argumente für den Mustervergleich umgeordnet werden dürfen.

Einige Attribute, die Funktionen zugewiesen werden können

Plus hat, neben anderen, die Attribute Orderless und Flat.

In[5]:= Attributes[Plus]

Out[5]=

Dies definiert q als ungeordnete oder kommutative Funktion.

In[6]:= SetAttributes[q, Orderless]

Die Argumente von q werden automatisch geordnet.

In[7]:= q[b, a, c]

Out[7]=

Mathematica ordnet die Argumente der q-Funktionen um, um ein passendes Gegenstück zu finden.

In[8]:= f[q[a, b], q[b, c]] /.
f[q[x_, y_], q[x_, z_]] -> p[x, y, z]

Out[8]=

Funktionen wie Plus und Times haben außer der Eigenschaft, ungeordnet zu sein, noch die Eigenschaft flach oder assoziativ zu sein. Das heißt, daß ihre Argumente beliebig „geklammert" werden können, so daß zum Beispiel x + (y + z) äquivalent zu x + y + z ist usw.

Mathematica berücksichtigt Flachheit beim Muster-Vergleich. Folglich kann ein Muster wie g[x_ + y_] mit x a und mit y (b + c) zu g[a + b + c] passen.

Das Argument von g wird a + (b + c) geschrieben und paßt so zum Muster.

In[9]:= g[a + b + c] /. g[x_ + y_] -> p[x, y]

Out[9]=

Falls keine anderen Nebenbedingungen existieren, wird Mathematica x_ dem ersten Element der Summe als Gegenstück zuordnen.

In[10]:= g[a + b + c + d] /. g[x_ + y_] -> p[x, y]

Out[10]=

Dies zeigt alle möglichen Gegenstücke.

In[11]:= ReplaceList[g[a + b + c], g[x_ + y_] -> p[x, y]]

Out[11]=

Hier wird x_ gezwungen, das passende Gegenstück zu b + d zu sein.

In[12]:= g[a + b + c + d, b + d] /. g[x_ + y_, x_] -> p[x, y]

Out[12]=

Mathematica kann gewöhnlich eine Transformationsregel auf eine Funktion nur dann anwenden, wenn das Muster in dieser Regel alle Argumente der Funktion abdeckt. Wenn Sie jedoch eine flache Funktion haben, ist es manchmal möglich, Transformationsregeln anzuwenden, selbst wenn nicht alle Argumente überdeckt werden.

Diese Regel gilt, auch wenn sie nicht alle Terme der Summe abdeckt.

In[13]:= a + b + c /. a + c -> p

Out[13]=

Dies vereinigt zwei der Terme der Summe.

In[14]:= u[a] + u[b] + v[c] + v[d] /. u[x_] + u[y_] -> u[x + y]

Out[14]=

Funktionen wie Plus und Times sind sowohl flach als auch ungeordnet. Jedoch gibt es einige Funktionen wie beispielsweise Dot, die zwar flach sind, aber nicht ungeordnet.

Sowohl x_ als auch y_ passen zu jeder Folge von Termen im Skalarprodukt.

In[15]:= a . b . c . d . a . b /. x_ . y_ . x_ -> p[x, y]

Out[15]=

Dies weist der Funktion r das Attribut Flat zu.

In[16]:= SetAttributes[r, Flat]

Mathematica schreibt den Ausdruck in der Form r[r[a, b], r[a, b]], damit er zum Muster paßt.

In[17]:= r[a, b, a, b] /. r[x_, x_] -> rp[x]

Out[17]=

Mathematica schreibt diesen Ausdruck in der Form r[a, r[r[b], r[b]], c], damit er zum Muster paßt.

In[18]:= r[a, b, b, c] /. r[x_, x_] -> rp[x]

Out[18]=

In einer gewöhnlichen Funktion, die nicht flach ist, ist ein Muster wie x_ Gegenstück eines einzelnen Argumentes der Funktion. Aber in einer flachen Funktion f[a, b, c, ... ] kann x_ Gegenstück solcher Objekte wie f[b, c] sein, die einer Folge von Argumenten entsprechen. Im Fall, daß x_ Gegenstück eines einzelnen Argumentes in einer flachen Funktion ist, taucht jedoch die Frage auf, ob das Objekt, zu dem es paßt, das Argument a selbst oder f[a] ist. Mathematica wählt den ersten dieser Fälle, wenn die Funktion das Attribut OneIdentity trägt und sonst den zweiten.

Dies fügt der Funktion r das Attribut OneIdentity zu.

In[19]:= SetAttributes[r, OneIdentity]

Jetzt paßt x_ zu einzelnen Argumenten, ohne sie mit r einzuhüllen.

In[20]:= r[a, b, b, c] /. r[x_, x_] -> rp[x]

Out[20]=

Die Funktionen Plus, Times und Dot haben alle das Attribut OneIdentity, was die Tatsache widerspiegelt, daß Plus[x] äquivalent zu x ist usw. Jedoch ist es zur Darstellung mathematischer Objekte oft günstig, sich mit flachen Funktionen zu befassen, die nicht das Attribut OneIdentity haben.

Muster, die Alternativen enthaltenFunktionen mit einer variablen Anzahl von Argumenten