next up previous contents
Nächste Seite: 6.4 Packages und Context Aufwärts: 6 Objektorientierte Methoden Vorherige Seite: 6.2 Objekte   Inhalt

Unterabschnitte


6.3 Operator Overloading

Beispiel

Lineare Operatoren bilden selbst einen Vektorraum :

1I, 0, $A+B \mapsto C$, $\lambda A \mapsto (\lambda A)$, $A + 0 = A$, $(A+ B) \vert x\rangle = A \vert x\rangle + B \vert x\rangle$

In[1]:= Op[ b_, i_] + Op[b_, j_] := Op[b, i+j]
Out[1]= SetDelayed::write: Tag Plus in Op[b_, i_] + Op[b_, j_] is Protected.
$Failed

Dieser Fehler tritt auf, da die Definition des Operators beim Head (Plus) gespeichert wird, ,,+`` jedoch ein geschütztes Symbol ist.

Lösung: In[2]:= Unprotect[Plus]
Out[2]= { Plus }

In[3]:= Op[b_, i_] + Op[b_, j_ ] := Op[b, i+j]
Out[3]=

In[4]:= Protect[Plus]
Out[4]= { Plus }

Diese Lösung ist zwar korrekt aber langsam, da bei jedem ,,+`` in der Datenbank nachgesehen werden muß, wie der Operator zu interpretieren ist. In[5]:= ??Plus
Out[5]= x + y + z represents a sum of terms.
Attributes[Plus] = {Flat, Listable, OneIdentity, Orderless, Protected}
Op[b_, i_] + Op[b_, j_] := Op[b, i + j]
Default[Plus] := 0

Implementierbare Lösung : UpValues (im Gegensatz zu DownValues, ,,:=`` )

DownValue: In[6]:= Dimension [Op [b_, _]] := Length [b]
Out[6]=

In[7]:= ?Dimension
Out[7]= Global`Dimension
Dimension[Op[b_, _]] := Length[b]

UpValue: In[8]:= Clear[Dimension]
Out[8]=

In[9]:= Dimension[Op[b_,_]]^:= Length [b]
Out[9]=

In[10]:= ?Dimension
Out[10]= Global`Dimension

In[11]:= ?Op
Out[11]= Global`Op
Dimension[Op[b_, _]] ^:= Length[b]

Die Definition ist mit Op assoziiert (und nicht mit Dimension).

Beispiel

In[12]:= Op[b_, i_] + Op[b_, j_] ^:= Op [b, i+j ]
Out[12]=

In[13]:= Lambda Op [b_, i_] ^:= Op[b, Lambda i]
Out[13]=

In[14]:= EigenValues[op:Op[b_, i_]] ^:= Eigenvalues[ToMatrix[op]]
Out[14]=

Nachteil: UpValues[] geht nur einen Level tief.

$e^{A+B}$ = $e^A \cdot e^B$ /; [$A$,$B$]==0 In[15]:= Exp[ Op[]+Op[] ]^:= Exp[Op[]] Exp[Op[]] /; Inner[Times,A,B,Plus]==0
Out[15]= SetDelayed::write: Tag Times in Exp[2 Op[]] is Protected.

Evaluation

Reihenfolge von Up/DownValues In[16]:= Clear[f]; Clear[g]; Clear[h]
Out[16]=

In[17]:= g[ f[x_] ] ^:= gfup[x]
Out[17]=
UpValue von f

In[18]:= g[ f[x_] ] := gfdown[x]
Out[18]=
DownValue von g

In[19]:= f[ g[x_] ] := fg[x]
Out[19]=
DownValue von f

In[20]:= f[g[f[1]]]
Out[20]= f[gfup[1]]

In[21]:= f[g[h[1]]]
Out[21]= fg[h[1]]

In[22]:= g[f[1]]
Out[22]= gfup[1]

In[23]:= g[f[g[1]]]
Out[23]= g[fg[1]]

Der DownValue von g wurde somit nie verwendet.

Sinnvolle Kombination:

In[24]:= g[f[x_]] ^:= gfup[x]
Out[24]=
UpValue von f für Spezialfälle

In[25]:= g[h_[x_]] := gdown[h, x]
Out[25]=
DownValue von g für den allgemeinen Fall


next up previous contents
Nächste Seite: 6.4 Packages und Context Aufwärts: 6 Objektorientierte Methoden Vorherige Seite: 6.2 Objekte   Inhalt
Werner Scholz 2000-06-21