• 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 inMuPAD und sehen uns an, was als Wert des Symbols aberechnet 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 Eva-luationstiefe, etwa nur Tiefe 1. In MuPAD kann man diese Tiefe mit dem Kommando levelvariieren.

level(a,i)$i=1..6;

b+ 1, c+ 4,7,7,7,7

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

b:=7*d+3: a;

7d+ 4 level(a,i)$i=1..3;

b+ 1,7d+ 4,7d+ 4

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

Die bisher verwendeten Bezeichner auf den rechten Seiten waren im Symbolmodus. Werden Be-zeichner im Wertmodus verwendet, so m¨ussen wir unterscheiden, ob wir das Symbol oder dessen Wert meinen.

awurde der Wert 3 des Bezeichnersu zugewie-sen,bdagegen das Symbolu, dessen aktueller Wert 3 ist. An dieser Stelle ist bei einer erneu-ten Auswertung der Unterschied noch nicht zu erkennen.

u:=3: a:=u: b:=hold(u):

[a, b]

[3,3]

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

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

u:=5: [a, b];

[3,5]

level(a,i)$i=1..5;

3,3,3,3,3 level(b,i)$i=1..5;

u,5,5,5,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 Auswertungundfr¨uher Nichtauswertungsprechen.

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

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 subst(x=a,f(x)) 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 – Tabelle 4: Substitutions- und Zuweisungsoperatoren der verschiedenen CAS

Bei diesem Evaluierungsverfahren 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.

MuPADbricht nach Erreichen einer durch die SystemvariableMAXLEVELvorgegebenen Tiefe mit einer Fehlermeldung ab. Das Auswerteverhalten kann ¨uber eine weitere Variable LEVEL gesteu-ert werden, die angibt, wie viele Auswgesteu-erterunden im aktuellen Kontext ausgef¨uhrt werden. Die Standardwerte sindLEVEL=MAXLEVEL= 100.

Innerhalb von Funktionsdefinitionen wird aber LEVEL = 1 gesetzt und damit rekursi-ve Auswertung standardm¨aßig unterbunden.

Das ist eine plausible Setzung, da lokale Varia-blen in Funktionen generell nur als Wertcon-tainer verwendet werden (sollten) und nicht als Symbole. Diese Standardsetzung vermei-det zugleich nicht terminierende Auswertepro-zesse in Funktionsk¨orpern.

uhu:=proc()

begin print(LEVEL) end proc;

uhu();

1

Dasselbe Prinzip – Auswertung nur eine Ebene tief – k¨onnte man sich auch als globales Auswer-tungsschema vorstellen, wenn es gleichzeitig eine Funktionevalgibt, mit welcher eine mehrfache Auswertung ausgef¨uhrt werden kann. Dieses Verhalten k¨onnte man in MuPAD durch die glo-bale Setzung LEVEL:=1 herbeif¨uhren. In den CAS Maxima und Axiomwird es standardm¨aßig verwendet. Das Auswertungsverhalten unterscheidet sich damit von dem der anderen CAS.

Das Auswertungsverhalten der anderen CAS kann inMaxima(in erster N¨aherung) mit der Eva-luierungsfunktioneverreicht werden. Allerdings lassen sich mitevinMaximakomplexere Effekte erzielen.

Zuweisung Maxima MuPAD

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 5: Unterschiedliches Auswertungsverhalten vonMaximaundMuPAD