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

InhaltAusdrücke finden, die zu einem Muster passen

2.3.1 Einführung

Muster werden in Mathematica benutzt, um Klassen von Ausdrücken zu repräsentieren. Ein einfaches Beispiel eines Musters ist der Ausdruck f[x_]. Dieses Muster repräsentiert die Klasse der Ausdrücke der Form f[irgendetwas].

Die große Stärke der Muster beruht auf der Tatsache, daß man viele Operationen in Mathematica nicht nur mit einfachen Ausdrücken ausführen kann, sondern ebenfalls mit Mustern, die ganze Klassen von Ausdrücken repräsentieren.

Sie können Muster in Transformationsregeln benutzen, um anzugeben, wie Klassen von Ausdrücken transformiert werden sollen.

In[1]:= f[a] + f[b] /. f[x_] -> x^2

Out[1]=

Sie können Muster benutzen, um die Positionen aller Ausdrücke einer Klasse herauszufinden.

In[2]:= Position[{f[a], g[b], f[c]}, f[x_]]

Out[2]=

Das Grundobjekt, das in fast allen Mathematica-Mustern auftritt, ist _ (wird von Mathematica-Programmierern traditionell als „Blank" bezeichnet). Die Grundregel ist einfach: _ steht für einen beliebigen Ausdruck. Auf den meisten Tastaturen erscheint das Unterstrichzeichen _ über dem -Zeichen.

So steht zum Beispiel das Muster f[_] für einen beliebigen Ausdruck der Form f[irgendetwas]. Das Muster f[x_] steht ebenfalls für jeden Ausdruck der Form f[irgendetwas], aber es gibt dem Ausdruck irgendetwas den Namen x. So können Sie sich auf der rechten Seite einer Transformationsregel auf ihn beziehen.

Sie können Blanks an beliebige Stellen eines Ausdrucks setzen. Das Resultat ist ein Muster, das zu allen Ausdrücken paßt, die irgendwie durch „Ausfüllen der Blanks" erzeugt werden können.

Einige Beispiele für Muster

Sie können Muster für Ausdrücke mit jeder Struktur konstruieren.

In[3]:= f[{a, b}] + f[c] /. f[{x_, y_}] -> p[x + y]

Out[3]=

Eine der häufigsten Anwendungen von Mustern ist die „Destrukturierung" von Funktionsargumenten. Wenn Sie eine Definition für f[liste_] angeben, dann müssen Sie Funktionen wie Part benutzen, um Elemente der Liste explizit auszuwählen. Wenn Sie aber zum Beispiel wissen, daß die Liste immer zwei Elemente haben wird, dann ist die alternative Definition f[{x_, y_}] sehr viel vorteilhafter. Dann können Sie sich direkt mit x und y auf die Elemente der Liste beziehen. Außerdem wird Mathematica Ihre Definition so lange nicht benutzen, bis das Argument von f in der verlangten Form einer Liste zweier Ausdrücke vorliegt.

Hier ist eine Möglichkeit, eine Funktion zu definieren, die eine Liste zweier Elemente nimmt und das erste Element in die Potenz des zweiten Elementes erhebt.

In[4]:= g[liste_] := Part[liste, 1] ^ Part[liste, 2]

Hier ist eine wesentlich elegantere Möglichkeit für diese Definition mittels eines Musters.

In[5]:= h[{x_, y_}] := x ^ y

Es ist äußerst wichtig, daß man verstanden hat, daß Mathematica-Muster Klassen von Ausdrücken mit einer gegebenen Struktur repräsentieren. Ein Muster paßt zu einem bestimmten Ausdruck, wenn das Muster und der Ausdruck dieselbe Struktur haben, dies in dem Sinn, daß Sie durch Ausfüllen der Blanks im Muster den Ausdruck erhalten können. Zwei Ausdrücke, die mathematisch gleich sind, aber nicht dieselbe Struktur haben, können nicht durch dasselbe Mathematica-Muster repräsentiert werden,

So kann zum Beispiel das Muster (1 + x_)^2 für Ausdrücke wie (1 + a)^2 oder (1 + b^3)^2, die dieselbe Struktur haben, stehen. Aber trotzdem kann es nicht für den Ausdruck 1 + 2 a + a^2 stehen. Obwohl dieser Ausdruck mathematisch gleich (1 + a)^2 ist, hat er nicht dieselbe Struktur wie das Muster (1 + x_)^2.

Transformationsregeln, die die Struktur von Ausdrücken ändern, aber deren mathematische Gleichheit bewahren, werden erst durch die Tatsache ermöglicht, daß Muster in Mathematica die Struktur von Ausdrücken spezifizieren.

Es ist wichtig, sich zu vergegenwärtigen, daß es für Mathematica im allgemeinen ganz unmöglich wäre, Muster auf mathematische statt auf strukturelle Äquivalenz zu vergleichen. Im Fall von Ausdrücken wie (1 + a)^2 und 1 + 2 a + a^2 kann man die Äquivalenz nur durch die Anwendung von Funktionen wie Expand und Factor bestimmen. Es gibt aber, wie im Abschnitt 2.5.2 beschrieben werden wird, keine allgemeine Möglichkeit, herauszufinden, ob zwei beliebige mathematische Ausdrücke gleich sind.

Ein anderes Beispiel: das Muster x^_ paßt zum Ausdruck x^2. Aber es paßt nicht zum Ausdruck 1, obwohl er als x^0 geschrieben werden kann. Im Abschnitt 2.3.9 wird gezeigt werden, wie ein Muster zu konstruieren ist, das in diesem besonderen Fall paßt. Aber Sie sollten verstehen, daß in allen Fällen der Mustervergleich in Mathematica grundsätzlich strukturell ist.

x^n_ paßt nur zu x^2 und x^3. 1 und x können mathematisch als geschrieben werden, haben aber nicht dieselbe Struktur.

In[6]:= {1, x, x^2, x^3} /. x^n_ -> r[n]

Out[6]=

Ein anderer Punkt, den man sich vergegenwärtigen sollte: Die Struktur, die Mathematica im Mustervergleich benutzt, ist die vollständige Form der Ausdrücke, wie sie durch FullForm ausgedruckt wird. So paßt zum Beispiel ein Objekt wie 1/x, dessen vollständige Form Power[x, -1] ist, zum Muster x_^n_, aber nicht zum Muster x_/y_, dessen vollständige Form Times[x_, Power[y_, -1]] ist. In Abschnitt 2.3.9 wird beschrieben werden, wie Muster zu konstruieren sind, die in all diesen Fällen passen.

Da die Ausdrücke in der Liste explizite Exponenten von b enthalten, können Transformationsregeln angewandt werden.

In[7]:= {a/b, 1/b^2, 2/b^2} /. b^n_ -> d[n]

Out[7]=

Hier ist die vollständige Form der Liste.

In[8]:= FullForm[{a/b, 1/b^2, 2/b^2}]

Out[8]//FullForm=

Obwohl Mathematica beim Vergleich von Mustern mathematische Äquivalenzen wie nicht benutzt, benutzt es doch bestimmte strukturelle Äquivalenzen. So berücksichtigt Mathematica zum Beispiel Eigenschaften wie Kommutativität und Assoziativität beim Mustervergleich.

Bei der Anwendung dieser Transformationsregel nutzt Mathematica die Kommutativität und Assoziativität der Addition.

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

Out[9]=

In der bisherigen Diskussion wurden nur Muster-Objekte wie x_ betrachtet, die für einen beliebigen einzelnen Ausdruck stehen. In den folgenden Unterabschnitten werden jene Konstrukte beschrieben, die Mathematica benutzt, um Klassen von Ausdrücken, die durch Muster dargestellt werden, zu erweitern und einzuschränken.

InhaltAusdrücke finden, die zu einem Muster passen