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 /

Spezifizieren der Typen von Ausdrücken in MusternMuster, die Alternativen enthalten

2.3.5 Setzen von Nebenbedingungen für Muster

Mathematica bietet einen allgemeinen Mechanismus zur Festlegung von Nebenbedingungen für Muster. Sie brauchen nur am Ende eines Musters /; bedingung zu setzen, um anzugeben, daß das Muster nur dann gilt, wenn die festgelegte Bedingung True ist. Sie können den Operator /; als „wann immer" oder „vorausgesetzt, daß" lesen.

Aufstellen von Bedingungen für Muster und Transformationsregeln

Dies gibt eine Definition für fac, die nur anwendbar ist, wenn das Argument n positiv ist.

In[1]:= fac[n_ /; n > 0] := n!

Die Definition für fac wird nur benutzt, wenn das Argument positiv ist.

In[2]:= fac[6] + fac[-4]

Out[2]=

Dies gibt die negativen Elemente der Liste aus.

In[3]:= Cases[{3, -4, 5, -2}, x_ /; x < 0]

Out[3]=

Sie können /; sowohl auf ganze Definitionen und Transformationsregeln als auch auf individuelle Muster anwenden. Im allgemeinen können Sie /; bedingung an das Ende einer beliebigen :=-Definition oder :>-Regel setzen, um Mathematica mitzuteilen, daß die Definition oder Regel nur dann anwendbar ist, wenn die angegebene Bedingung erfüllt wird. Beachten Sie: /;-Bedingungen sollten gewöhnlich nicht an das Ende von =-Definitionen oder ->-Regeln gesetzt werden, da sie dann, wie in Abschnitt 2.4.8 besprochen werden wird, sofort ausgewertet werden würden.

Hier ist eine andere Möglichkeit einer Definition, die nur dann gilt, wenn das Argument n positiv ist.

In[4]:= fac2[n_] := n! /; n > 0

Wieder werden die Fakultäts-Funktionen fac nur für positive Argumente berechnet.

In[5]:= fac2[6] + fac2[-4]

Out[5]=

Mit dem Operator /; lassen sich beliebige mathematische Nebenbedingungen für die Anwendbarkeit von Regeln implementieren. In typischen Fällen geben Sie Muster vor, die strukturell zu einem großen Bereich von Ausdrücken passen, der dann durch mathematische Nebenbedingungen auf eine kleinere Menge reduziert wird.

Diese Regel ist nur anwendbar auf Ausdrücke mit der Struktur v[x_, 1 - x_].

In[6]:= v[x_, 1 - x_] := p[x]

Dieser Ausdruck hat die passende Struktur, also gilt die Regel.

In[7]:= v[a^2, 1 - a^2]

Out[7]=

Dieser Ausdruck, obwohl in korrekter mathematischer Form, hat nicht die passende Struktur, also gilt die Regel nicht.

In[8]:= v[4, -3]

Out[8]=

Diese Regel gilt für einen beliebigen Ausdruck der Form w[x_, y_], mit der zusätzlichen Restriktion y == 1 - x.

In[9]:= w[x_, y_] := p[x] /; y == 1 - x

Die neue Regel gilt für diesen Ausdruck.

In[10]:= w[4, -3]

Out[10]=

Bei der Aufstellung von Mustern und Transformationsregeln hat man oft die Wahl, wo die /;-Bedingungen zu setzen sind. Sie können zum Beispiel eine /;-Bedingung auf der rechten Seite einer Regel in der Form ls :> rs /; bedingung oder auf der linken Seite in der Form ls /; bedingung -> rs stellen. Sie können die Bedingung auch in den Ausdruck ls einfügen. Die einzige Einschränkung besteht darin, daß alle in einer Bedingung verwendeten Muster-Namen in diesem Muster auftreten müssen, dem die Bedingung hinzugefügt wurde. Wenn dies nicht der Fall ist, dann sind möglicherweise einige der Namen, die zur Evaluierung der Bedingung benötigt werden, im Muster-Vergleichsprozeß noch nicht „gebunden". Wenn das geschieht, benutzt Mathematica die globalen Werte für die entsprechenden Variablen statt der Werte, die durch Mustervergleich bestimmt werden.

So wird zum Beispiel die Bedingung in f[x_, y_] /; (x + y < 2) die Werte für x und y benutzen, die durch Vergleich mit f[x_, y_] gefunden werden, aber die Bedingung in f[x_ /; x + y < 2, y_] wird den globalen Wert für y anstelle des durch Vergleich mit dem Muster gefundenen benutzen.

Solange Sie sicherstellen, daß die geeigneten Namen definiert sind, ist es gewöhnlich am effizientesten, die /;-Bedingungen an die kleinstmöglichen Teile des Musters zu heften. Der Grund dafür ist, daß Mathematica Bestandteile des Musters sequentiell vergleicht, und je früher eine /;-Bedingung gefunden wird, die nicht zutrifft, desto früher kann ein Vergleich verworfen werden.

Es ist etwas effizienter, die /;-Bedingung an x_ statt an das ganze Muster zu heften.

In[11]:= Cases[{z[1, 1], z[-1, 1], z[-2, 2]}, z[x_ /; x < 0, y_]]

Out[11]=

In einem Fall wie diesem müssen Sie Klammern um den /;-Teil setzen.

In[12]:= {1 + a, 2 + a, -3 + a} /. (x_ /; x < 0) + a -> p[x]

Out[12]=

Es ist allgemein üblich, /; für die Aufstellung von Mustern und Transformationsregeln zu verwenden, die nur für Ausdrücke mit bestimmten Eigenschaften gelten. Es gibt eine Reihe von Funktionen in Mathematica zum Testen der Eigenschaften von Ausdrücken. Nach Übereinkunft haben diese Funktionen Namen, die mit einem Q enden und so anzeigen, daß sie „eine Frage (Question) stellen".

Einige Funktionen zum Testen mathematischer Eigenschaften von Ausdrücken

Die Regel gilt für alle Elemente der Liste, die Zahlen sind.

In[13]:= {2.3, 4, 7/8, a, b} /. (x_ /; NumberQ[x]) -> x^2

Out[13]=

Diese Definition gilt nur für Vektoren ganzer Zahlen.

In[14]:= mi[liste_] := liste^2 /; VectorQ[liste, IntegerQ]

Die Definition wird nun nur im ersten Fall verwendet.

In[15]:= {mi[{2, 3}], mi[{2.1, 2.2}], mi[{a, b}]}

Out[15]=

Ein wichtiges Merkmal aller Mathematica-Funktionen zum Testen von Eigenschaften, deren Namen auf Q enden: Sie geben immer False zurück, wenn sie nicht bestimmen können, ob der Ausdruck eine bestimmte Eigenschaft hat.

4561 ist eine ganze Zahl, also wird True zurückgegeben.

In[16]:= IntegerQ[4561]

Out[16]=

Dies gibt False zurück, da unbekannt ist, ob x eine ganze Zahl ist.

In[17]:= IntegerQ[x]

Out[17]=

In einigen Fällen können Sie die Ergebnisse, die Eigenschafts-Testfunktionen geben sollen, explizit angeben. So wird Mathematica zum Beispiel mit einer Definition wie x /: IntegerQ[x] = True (siehe Abschnitt 2.4.10) annehmen, daß x eine ganze Zahl ist. Sie erhalten deshalb True statt False, wenn Sie explizit nach IntegerQ[x] fragen. Mathematica gibt jedoch nicht automatisch Aussagen weiter. So kann es zum Beispiel nicht feststellen, daß IntegerQ[x^2] True ist. Um das zu ermöglichen, müssen Sie ein geeignetes Mathematica-Paket laden.

Einige Funktionen zum Testen struktureller Eigenschaften von Ausdrücken

Mit == bleibt die Gleichung in symbolischer Form; === ergibt False, falls die Ausdrücke nicht offensichtlich gleich sind.

In[18]:= {x == y, x === y}

Out[18]=

Der Ausdruck n ist kein Element der Liste {x, x^n}.

In[19]:= MemberQ[{x, x^n}, n]

Out[19]=

Der Ausdruck {x, x^n} ist jedoch nicht vollständig unabhängig von n.

In[20]:= FreeQ[{x, x^n}, n]

Out[20]=

Sie können mit FreeQ eine „Linearitäts"-Regel für h definieren.

In[21]:= h[a_ b_, x_] := a h[b, x] /; FreeQ[a, x]

Terme, in denen x nicht vorkommt, werden aus jedem  h herausgezogen.

In[22]:= h[a b x, x] + h[2 (1+x) x^2, x]

Out[22]=

Eine andere Möglichkeit für Nebenbedingungen in Mustern

Mit der Konstruktion muster /; bedingung können Sie eine Bedingung unter Einbeziehung von Muster-Namen evaluieren, um festzustellen, ob eine Übereinstimmung vorliegt. Die Konstruktion muster ? test wendet stattdessen eine Funktion test auf den ganzen Ausdruck an, der zu Muster paßt, um festzustellen, ob eine Übereinstimmung vorliegt. Der Gebrauch von ? anstelle von /; führt manchmal zu prägnanteren Definitionen.

Bei dieser Definition werden zu testende Gegenstücke für x_ mit der Funktion NumberQ geprüft.

In[23]:= p[x_?NumberQ] := x^2

Die Definition ist nur dann anwendbar, wenn p ein numerisches Argument hat.

In[24]:= p[4.5] + p[3/2] + p[u]

Out[24]=

Hier ist eine kompliziertere Definition. Vergessen Sie nicht die Klammern um die reine Funktion.

In[25]:= q[{x_Integer, y_Integer} ?
(Function[v, v.v > 4])] := qp[x + y]

Die Definition gilt nur in bestimmten Fällen.

In[26]:= {q[{3, 4}], q[{1, 1}], q[{-5, -7}]}

Out[26]=

Spezifizieren der Typen von Ausdrücken in MusternMuster, die Alternativen enthalten