1I, 0, ,
,
,
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).
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.
=
/; [
,
]==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.
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