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 /  Modularität und die Benennung von Dingen /

Wie Module funktionierenScheinvariablen in der Mathematik

2.6.4 Fortgeschrittenes Thema: Variablen in reinen Funktionen und in Regeln

Für Module und With können Sie eine spezielle Liste mit Symbolen angeben, deren Namen Sie als lokale Namen behandeln wollen. In einigen Situationen möchte man jedoch bestimmte Symbolnamen automatisch als lokal behandeln.

Wenn Sie beispielsweise eine reine Funktion wie Function[{x}, x + a] benutzen, wollen Sie, daß x als „formaler Parameter" behandelt wird, dessen Name lokal ist. Dasselbe gilt für das x in einer Regel wie f[x_] -> x^2 oder in einer Definition wie f[x_] := x^2.

Mathematica verwendet ein einheitliches Schema, um sicherzustellen, daß Namen formaler Parameter, die in Konstrukten, wie zum Beispiel reinen Funktionen und Regeln, erscheinen, lokal bleiben und so niemals mit globalen Namen verwechselt werden. Die Grundidee ist, formale Parameter, wenn nötig, durch Symbole mit Namen der Form x$ zu ersetzen. Es besteht die Übereinkunft, x$ niemals als globalen Namen zu verwenden.

Hier ist eine verschachtelte reine Funktion.

In[1]:= Function[{x}, Function[{y}, x + y]]

Out[1]=

Mathematica benennt den formalen Parameter y in der inneren Funktion um, damit Namenskonflikte mit dem globalen Objekt y vermieden werden.

In[2]:= %[2y]

Out[2]=

Die sich ergebende reine Funktion verhält sich wie erwartet.

In[3]:= %[a]

Out[3]=

Im allgemeinen benennt Mathematica die formalen Parameter in Function[vars, rumpf] um, sobald rumpf durch irgendeine Aktion einer anderen reinen Funktion modifiziert wird.

Der formale Parameter y wurde umbenannt, weil der Rumpf der inneren Funktion verändert wurde.

In[4]:= Function[{x}, Function[{y}, x + y]] [a]

Out[4]=

Da der Rumpf der inneren Funktion sich nicht ändert, wird der formale Parameter auch nicht umbenannt.

In[5]:= Function[{x}, x + Function[{y}, y^2]] [a]

Out[5]=

Mathematica benennt formale Parameter in reinen Funktionen freizügiger um, als es wirklich notwendig wäre. Im Prinzip könnte eine Umbenennung vermieden werden, solange die Namen formaler Parameter in einer bestimmten Funktion nicht im Konflikt mit Teilen von Ausdrücken stehen, die in den Rumpf der reinen Funktion eingesetzt werden. Aus Gründen der Einheitlichkeit benennt Mathematica jedoch auch in solchen Fällen die formalen Parameter um.

In diesem Fall schirmt der formale Parameter x in der inneren Funktion den Rumpf der Funktion ab, daher ist keine Umbenennung nötig.

In[6]:= Function[{x}, Function[{x}, x + y]] [a]

Out[6]=

Hier sind drei verschachtelte Funktionen.

In[7]:= Function[{x}, Function[{y}, Function[{z}, x + y + z]]]

Out[7]=

In diesem Fall werden beide inneren Funktionen umbenannt.

In[8]:= %[a]

Out[8]=

Im Abschnitt 2.2.5 wurde bereits erwähnt, daß reine Funktionen in Mathematica den -Ausdrücken der formalen Logik ähneln. Durch die Umbenennung formaler Parameter können die reinen Funktionen in Mathematica die gesamte Semantik von -Ausdrücken getreu nachbilden.

Bereichskonstrukte in Mathematica

Mathematica hat mehrere „Bereichskonstrukte", in denen bestimmte Namen als lokal gültig behandelt werden. Wenn Sie diese Konstrukte in irgendeiner Weise miteinander vermischen, so führt Mathematica geeignete Umbenennungen durch, um Namenskonflikte zu vermeiden.

Mathematica benennt den formalen Parameter der reinen Funktion um, damit ein Namenskonflikt vermieden wird.

In[9]:= With[{x = a}, Function[{a}, a + x]]

Out[9]=

Hier wurde die lokale Konstante im inneren With umbenannt, um einen Namenskonflikt zu vermeiden.

In[10]:= With[{x = y}, Hold[With[{y = 4}, x + y]]]

Out[10]=

Da es in diesem Fall keinen Namenskonflikt gibt, findet auch keine Umbenennung statt.

In[11]:= With[{x = y}, Hold[With[{z = x + 2}, z + 2]]]

Out[11]=

Zur Konfliktvermeidung wird die lokale Variable y im Modul umbenannt.

In[12]:= With[{x = y}, Hold[Module[{y}, x + y]]]

Out[12]=

Wenn Sie das Modul ausführen, wird die lokale Variable jedoch erneut umbenannt, damit der Name eindeutig wird.

In[13]:= ReleaseHold[%]

Out[13]=

Mathematica behandelt Transformationsregeln als Bereichskonstrukte, in denen die Namen, die Sie Mustern geben, als lokal gültig behandelt werden. Sie können benannte Muster entweder mit x_, x__ usw. oder mit x:patt anlegen.

Das x innerhalb von h paßt zu x_ und wird als lokal für die Regel betrachtet.

In[14]:= With[{x = 5}, g[x_, x] -> h[x]]

Out[14]=

In einer Regel wie f[x_] -> x + y paßt das x, das rechtsseitig erscheint, zum Namen des x_-Musters. Deshalb wird das x als lokale Variable bezüglich der Regel betrachtet und kann nicht durch andere Bereichskonstrukte modifiziert werden.

Andererseits ist das y bezüglich der Regel nicht lokal gültig und kann durch andere Bereichskonstrukte modifiziert werden. Wenn dies geschieht, dann benennt Mathematica die Muster in der Regel um, um der Möglichkeit eines Konfliktes vorzubeugen.

Um einen Konflikt zu vermeiden, benennt Mathematica das x in der Regel um.

In[15]:= With[{w = x}, f[x_] -> w + x]

Out[15]=

Wenn Sie With mit einem Bereichskonstrukt anwenden, wird Mathematica automatisch geeignete Umbenennungen vornehmen. In einigen Fällen möchten Sie jedoch vielleicht Substitutionen in Bereichskonstrukten ohne irgendwelche Umbenennungen vornehmen. Dies ist mit dem Operator /. möglich.

Wenn Sie mit With das y substituieren, so wird zur Konfliktvermeidung x in der reinen Funktion umbenannt.

In[16]:= With[{y = x + a}, Function[{x}, x + y]]

Out[16]=

Wenn Sie /. statt With benutzen, so erfolgt keine Umbenennung.

In[17]:= Function[{x}, x + y] /. y -> a + x

Out[17]=

Wenn Sie eine Regel wie f[x_] -> rs anwenden oder eine Definition wie f[x_] := rs benutzen, muß Mathematica implizit überall im Ausdruck rs für x substituieren. Dies erfolgt mit dem Operator /.. Daher respektiert eine solche Substitution keine Bereichskonstrukte. Wird jedoch der Inhalt eines Bereichskonstruktes durch eine Substitution modifiziert, so werden die anderen Variablen im Bereichskonstrukt umbenannt.

Hier wird eine Funktion zur Erzeugung reiner Funktionen definiert.

In[18]:= mkfun[var_, rumpf_] := Function[{var}, rumpf]

Das x und das x^2 werden explizit in die reine Funktion eingefügt, letztlich durch Einsatz des Operators /..

In[19]:= mkfun[x, x^2]

Out[19]=

Hiermit wird eine Funktion definiert, die ein Paar verschachtelter reiner Funktionen erzeugt.

In[20]:= mkfun2[var_, rumpf_] := Function[{x},
Function[{var}, rumpf + x]]

In diesem Fall wird das x in der äußeren reinen Funktion umbenannt.

In[21]:= mkfun2[x, x^2]

Out[21]=

Wie Module funktionierenScheinvariablen in der Mathematik