Re: Rule and Module not working together

• To: mathgroup at smc.vnet.net
• Subject: [mg77879] Re: Rule and Module not working together
• From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
• Date: Tue, 19 Jun 2007 06:31:30 -0400 (EDT)
• Organization: The Open University, Milton Keynes, UK
• References: <f55q32\$k02\$1@smc.vnet.net>

```Steven Siew wrote:
> On Mathematica 5.2, I tried to write a function which applies the rule
> Log[A_] + Log[B_] -> Log[A * B] but somehow it does not work as I
> expected.
>
> Instead of Log[f] + Log[g] becoming Log[f * g], I get the result of
> Log[666 * f] even though I have marked both A and B as private
> variables.
>
> Can anyone help? I'm sure I made a big mistake somewhere in my
> understanding of Mathematica.
>
>
>
> In[1]:= AppendTo[\$Echo,"stdout"]
> Out[1]= {stdout}
>
> In[2]:= (* Write your mathematica code below *)
>
> In[3]:= If[Length[Names["Global`*"]] > 0, Remove["Global`*"]]
>
> In[4]:= Off[General::spell, General::spell1]
>
> In[5]:= myfunc[x_] := Module[{s, A, B},
>    s = {Log[A_] + Log[B_] -> Log[A*B]}; Return[x /. s]]
>
> In[6]:= ? myfunc
> Global`myfunc
>
> myfunc[x_] := Module[{s, A, B}, s = {Log[A_] + Log[B_] -> Log[A*B]};
>      Return[x /. s]]
>
> In[7]:= B = 666;
>
> In[8]:= myfunc[Log[f] + Log[g]]
>
> Out[8]= Log[666 f]
>
> In[9]:= myfunc[Log[4] + Log[5]]
>
> Out[9]= Log[2664]
>
> In[10]:= (* End of mathematica code *)
>
> In[11]:= Quit[];
>
>

Steven,

A transformation rule, defined either by -> or :>, must be applied
thanks to the replacement operators /. (ReplaceAll) or //.
(ReplaceRepeated). You do not need a Module construct to localize a and
b for the rule takes care of that.

myFun[x_] := x //. Log[a_] + Log[b_] :> Log[a*b] //.
Log[a_] - Log[b_] :> Log[a/b]

Below, you can compare several incremental versions of myFun and see by
their returned results in what way they differ.

(* First we try with ReplaceAll /. *)
In[1]:=
myFun[x_] := x /. Log[a_] + Log[b_] :> Log[a*b]
myFun[Log[2] + Log[3]]

Out[2]=
Log[6]

(* OK, but the above failed with more than two logs *)
In[3]:=
myFun[Log[2] + Log[3] + Log[4]]

Out[3]=
Log[4] + Log[6]

(* ReplaceRepeated //. will correct that *)
In[4]:=
myFun[x_] := x //. Log[a_] + Log[b_] :> Log[a*b]
myFun[Log[2] + Log[3] + Log[4]]

Out[5]=
Log[24]

(* Good, but that does not work difference of logs *)
In[6]:=
myFun[Log[2] - Log[3] + Log[4]]

Out[6]=
-Log[3] + Log[8]

(* Adding an extra rule correct that *)
In[7]:=
myFun[x_] := x //. Log[a_] + Log[b_] :> Log[a*b] //.
Log[a_] - Log[b_] :> Log[a/b]
myFun[Log[2] - Log[3] + Log[4]]

Out[8]=
8
Log[-]
3

Regards,
Jean-Marc

```

• Prev by Date: Re: is there a better way to iterate this?
• Next by Date: Re: Re: more gripe about the new documentation center (DC) in Mathematica
• Previous by thread: Re: Rule and Module not working together
• Next by thread: Strange timing of many assignments