Hallo,
wenn man nicht sehr genau weiss was man tut, soll man fuer Faelle, in
denen die rechete Seite
ein Pattern[] enthaelt RuleDealyed[] verwenden, sind keine Pattern[]
drin Rule[]
Leider habe ich keine Ahnung was man sich unter " man sich das
trivialerweise vorstellt" zu verstehen
ist.
(*3*)
{a, b} /. {x_, y_} -> {y, x}
liefert
{b, z}
weil die rechte Seite von Rule[] ausgewertet wird und dabei x durch z
ersetzt wird
aus {x_, y_} -> {y, x} wird also {x_, y_} -> {y, z}
(*4*)
Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
liefert
{b,a}
weil Block[] Wertzuweisungen an lokale Variablen zurueck setzt, also
{x_,y_}->{y,x}
zwar ausgewertet wird aber da x im Block[] keinen Wert mehr hat bleibt
es so wie zuvor
(*5*)Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
liefert
{b, z}
weil hier endlich die "Mathematica does appropriate renamings to avoid
conflicts" zuschlaegt.
In Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}] wird angenommen dass
sich das ausgewertete
x in {a, b} /. {x_, y_} -> {y, x}] *nicht* auf die lokalen Variablen
bezieht denn die heissen
in Wirklickeit ja eh anders (z. B. x$123, y$124) ...
(*6*)
{a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]
liefert
{b, z}
weil im Block[] nix passiert, der Liefert aber {x_, y_} -> {y, x}
zurueck und das Auswerten
der rechten Seite liefert dann {x_, y_} -> {y, z}
Bei
(*7*)
{a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]
gibts wieder
{b,z}
weil es ja die "Mathematica does appropriate renamings to avoid
conflicts" gibt, die
schon im Module[] das x mit z ersetzen.
Gruss
Jens
Robert Nowak wrote:
liebe mma user folgendes simples problem welches die elemente eines
2er vektors vertauschen soll.
es geht hier nicht darum das man das ja mit Reverse[] oder sonstwie
bewerkstelligen kann !!
vielmehr geht es darum zu verstehen warum mma was wie macht ??
in der mma hilfe steht das patterns als lokale symbole behandelt werden:
tutorial/VariablesInPureFunctionsAndRules
"
Mathematica has several \[OpenCurlyDoubleQuote]scoping
constructs\[CloseCurlyDoubleQuote] in which certain names are treated
as local. When you mix these constructs in any way, Mathematica does
appropriate renamings to avoid conflicts.
"
warum funktioniert das nicht wie man sich das trivialerweise vorstellt ?
insbesondere der fall 5 ist da sehr beunruhigend !
lediglich die fälle 2 und 4 scheinen das "intuitiv gewollte" zu
vollbringen.
wer erleuchtet mich ?
soll man defaultmaessig RuleDelayed[] anstelle von Rule[] verwenden
obwohl alle nullachtfünfzehn beispiele Rule[] verwenden ?
In[1]:= x = z;
(* 2 *) {a, b} /. {x_, y_} :> {y, x}
(* 3 *) {a, b} /. {x_, y_} -> {y, x}
(* 4 *) Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 5 *) Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 6 *) {a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]
(* 7 *) {a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]
Out[2]= {b, a}
Out[3]= {b, z}
Out[4]= {b, a}
Out[5]= {b, z}
Out[6]= {b, z}
Out[7]= {b, z}
glücklicherweise relativiert sich das problem bei verwendung von
packages:
wobei Begin[] End[] alleine als klammerung nicht ausreichen ????
In[1]:= x = z;
BeginPackage["c`"];
Begin["Private`"];
(* 2 *) {a, b} /. {x_, y_} :> {y, x}
(* 3 *) {a, b} /. {x_, y_} -> {y, x}
(* 4 *) Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 5 *) Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 6 *) {a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]
(* 7 *) {a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]
End[];
EndPackage[];
Out[4]= {b, a}
Out[5]= {b, a}
Out[6]= {b, a}
Out[7]= {b, a}
Out[8]= {b, a}
Out[9]= {b, a}
beste grüße
Robert Nowak