• Keine Ergebnisse gefunden

Die Tatsache, dass der Wert von Bezeichnern symbolischer Natur sein kann, in den Bezeichner eingehen, die ihrerseits einen Wert besitzen k¨onnen, f¨uhrt zu einer weiteren Besonderheit von CAS.

Betrachten wir diese Zuweisungen in Mathe-matica und sehen uns an, was als Wert des Symbolsaberechnet wird.

a=b+1; b=c+3; c=3; a 7

Es ist also die gesamte Evaluationskette durchlaufen worden: In den Wertb+ 1 von ageht das Symbolbein, das seinerseits als Wert den Ausdruckc+ 3 hat, in den das Symbolceingeht, welches den Wert 3 besitzt.

Denkbar w¨are auch eine eingeschr¨ankte Evalua-tionstiefe, etwa nur Tiefe 1 wie inMaxima. In Mathematica kann man das Evaluationsge-schehen mit dem KommandoTraceverfolgen.

Trace[a]

{a,1 +b,{b,3 +c,{c,3},3 + 3,6},1 + 6,7}

Andern wir den Wert eines Symbols in dieser¨ Evaluationskette, so kann sich auch der Wert vonabei erneuter Evaluation ¨andern.

b=2*d; a

2d Trace[a]

{a,1 +b,{b,2d},1 + 2d}

Wertzuweisungen an eine Variable k¨onnen als Seiteneffekt Einfluss auf das Auswerteverhal-ten anderer Variablen haben.

Bei dieser Art der rekursiven Auswertung kann es eintreten, dass ein zu evaluierendes Symbol nach endlich vielen Evaluationsschritten selbst wieder in dem entstehenden Ausdruck auftritt und damit der Evaluationsprozess nicht terminiert. Die CAS, welche diesen Ansatz verwenden, haben deshalb verschiedene Z¨ahler, mit denen verfolgt wird, wieviele rekursive Auswerterunden schon ausgef¨uhrt wurden.

Mathematica verwendet dazu die Systemvariablen $RecursionLimit und $IterationLimit.

Die rekursive Auswertung von Symbolen wird nach Erreichen der vorgegebenen Tiefe abgebrochen und der nicht weiter ausgewertete symbolische Ausdruck in eineHold-Anweisung eingeschlossen, um ihn auch zuk¨unftig vor (automatischer) Auswertung zu sch¨utzen.

Innerhalb von Funktionsdefinitionen wird meist nur eine Ebene tief ausgewertet und damit rekursi-ve Auswertung standardm¨aßig unterbunden. Das ist eine plausible Setzung, da lokale Variablen in Funktionen generell nur als Wertcontainer verwendet werden (sollten) und nicht als Symbole. Diese Standardsetzung vermeidet zugleich nicht terminierende Auswerteprozesse in Funktionsk¨orpern.

Dasselbe Prinzip – Auswertung nur eine Ebene tief – wird von Maxima, Axiomund Sage als globales Auswertungsschema verwendet, wobei es inMaximazus¨atzlich eine Funktioneval gibt, mit welcher eine mehrfache Auswertung ausgef¨uhrt werden kann. Das Auswertungsverhalten dieser drei CAS unterscheidet sich damit von dem der anderen CAS6.

Zuweisung Maxima Mathematica

a:=b+1 b+1 b+1

b:=c+1 c+1 c+1

c:=d+1 d+1 d+1

a b+1 d+3

a:=b+1 c+2 d+3

Tabelle 4: Unterschiedliches Auswertungsverhalten vonMaximaundMathematica

6Das Auswertungsverhalten der anderen CAS kann in Maxima ur den Ausdruck expr durch den Zusatz expr,infeval;erreicht werden.

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 57

Werden auf der rechten Seite einer Zuweisung Bezeichner im Wertmodus verwendet, so ist zu unterscheiden, ob das Symbol oder dessen Wert gemeint ist.

In diesem Maple-Beispiel wurde a der Wert 3 des Bezeichners uzugewiesen,bdagegen das Symbolu, dessen aktueller Wert 3 ist. An die-ser Stelle ist bei einer erneuten Auswertung der Unterschied noch nicht zu erkennen.

u:=3: a:=u: b:=’u’: [a, b]

[3,3]

Nach dieser ¨Anderung jedoch erkennen wir, dass sich ¨Anderungen des Werts von u auf b auswirken, aufadagegen nicht.

u:=5: [a, b];

[3,5]

Geht ein Bezeichner im Wertmodus in einen Ausdruck ein, so ist also zu unterscheiden, ob der Wert oder das Symbol gemeint ist. Im ersten Fall wird der Bezeichner ausgewertet, im zweiten Fall wird der Bezeichnernicht ausgewertet.

Mathematicakennt hierf¨ur sogar zwei Zuwei-sungsoperatoren,=f¨ur eine Zuweisungmit Aus-wertung der rechten Seite und:= f¨ur eine Zu-weisungohne Auswertung der rechten Seite.

Das gerade betrachtete Beispiel l¨asst sich damit inMathematicaauf diese Weise anschreiben.

u=3; a=u; b:=u; {a, b}

{3,3}

u=5; {a, b}

{3,5}

Oft spricht man in diesem Zusammenhang vonfr¨uher Auswertung undsp¨ater Auswertung. Diese Terminologie ist allerdings irref¨uhrend, denn beide Ergebnisse werden nat¨urlich bei einem sp¨ateren Aufruf, wenn sie als Teil in einen auszuwertenden Ausdruck eingehen, auch selbst ausgewertet.

Korrekt m¨usste man also vonfr¨uher Auswertung undfr¨uher Nichtauswertung sprechen.

Generell gibt es zwei verschiedene Mechanismen, einen Bezeichner im Wertmodus vor der Auswer-tung zu bewahren. Dies geschieht entweder wie in Maple, Maxima oder MuPAD (und LISP) durch eine spezielleHold-Funktion oder wie inAxiomoderReducedurch zwei verschiedene Zu-weisungsoperatoren, wovon einer die in die rechte Seite eingehenden Bezeichner auswertet, der andere nicht. Mathematica verf¨ugt sogar ¨uber beide Mechanismen. Diese Besonderheiten sind in einer klassischen Programmiersprache, in der sich Namensraum und Wertebereich nicht ¨ uber-lappen, unbekannt.

Die mit einem solchen Verhalten verbundene Konfusion l¨asst sich vermeiden, wenn Bezeich-ner im Wertmodus konsequent nur als Wertcontainer verwendet werden. Dazu muss von Anfang an geplant werden, welche Bezeichner im Symbolmodus und welche als Wertcontai-ner verwendet werden sollen. BezeichWertcontai-nern, die nicht explizit als WertcontaiWertcontai-ner vorgesehen sind, darf dann im gesamten G¨ultigkeitsbereich (global) kein Wert zugewiesen werden.

Muss einem solchen Bezeichner im Symbolmodus in einemlokalen Kontext ein Wert zugewiesen werden, so kann dies unter Verwendung des Substitutionsoperators erfolgen. Diese Wertzu-weisung ist nur in dem entsprechenden Ausdruck wirksam, ein Moduswechsel des Bezeichners erfolgt nicht. Es ist zu beachten, dass in einigen CAS dabei keine vollst¨andige Evaluation oder gar Simplifikation des Ergebnisses ausgef¨uhrt wird.

System Substitutions-operator

Zuweisung mit Auswertung

Zuweisung ohne Auswertung

Hold-Operator

Axiom subst(f(x),x=a) x:=a x==a –

Maxima ev(f(x),x=a) x:a – ’x

Maple subs(x=a,f(x)) x:=a – ’x’

Mathematica f(x) /. x7→a x=a x:=a Hold[x]

MuPAD subs(f(x),x=a) x:=a – hold(x)

Reduce subst(x=a,f(x)) x:=a let x=a –

Sage f(x).subs(x=a) x=a – ’x’

Tabelle 5: Substitutions- und Zuweisungsoperatoren der verschiedenen CAS