Re: How to evaluate parts of an expression, but not other parts?

*To*: mathgroup at smc.vnet.net*Subject*: [mg122727] Re: How to evaluate parts of an expression, but not other parts?*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Tue, 8 Nov 2011 07:14:28 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <32289202.13251.1320484280567.JavaMail.root@m06> <j95pg2$m87$1@smc.vnet.net> <201111071050.FAA03696@smc.vnet.net>

It is called the Strzebonski-Trott (or Trott-Strzebonski) trick - after the people who first noticed it (or at least made it public). Villegas just reported it (with proper credit). Andrzej Kozlowski On 7 Nov 2011, at 11:50, andre.robin3 wrote: > EvaluateAt[] is not part of Mathematica. > > So far I kown it was a idea from Villegas (from Wolfram, see his > presentation > "workingwith unevaluated expression". It is not for beginners). > Ted Ersek also has developped a EvaluateAt[]. > > For such a problem I suggest rather to try to use Mathematica > existing functions. (there are so many !) > > > > "David Park" <djmpark at comcast.net> a =E9crit dans le message de news: > j95pg2$m87$1 at smc.vnet.net... >> I'm sure that you will obtain some answers to do this with plain >> Mathematica, but the Presentations package does have routines that allow >> selective manipulation of expressions. >> >> Along with HoldForm your can use EvaluateAt or EvaluateAtPattern to do >> selective evaluations of held expressions. You can also use >> CreateSubexpression, OperateSubexlression and ReleaseSubexpressions to tag >> and group things together to prevent Mathematica from mixing there >> elements >> with other elements outside the subexpressions. Tagged Subexpressions also >> show the tag in a tooltip when the mouse hovers over the Subexpression. We >> also have MapLevelParts that allows an operation to be performed on >> selected >> level parts in an expression (usually a sum, product or list). >> >> So, as a simple example we could do: >> >> <<Presentations` >> >> a = 1; b = 2; c = 3; d = 4; >> HoldForm[a + b] + HoldForm[c + d] >> % // EvaluateAt[{1, 1}] >> % // EvaluateAt[{2, 1}] >> % // ReleaseHold >> >> (a+b)+(c+d) >> >> 3+(c+d) >> >> 3+7 >> >> 10 >> >> Using tagged Subexpressions we could do the following. We can also specify >> that a subexpression should always show parentheses. >> >> a = 1; b = 2; c = 3; d = 4; >> CreateSubexpression[HoldForm[a + b], True, tag1] + >> CreateSubexpression[HoldForm[c + d], True, tag2] >> % // OperateSubexpression[ReleaseHold, tag1] >> % // OperateSubexpression[ReleaseHold, tag2] >> % // ReleaseSubexpressions[All] >> >> (a+b)+(c+d) >> >> (3)+(c+d) >> >> (3)+(7) >> >> 10 >> >> If we want to show the individual values before they are combined in a >> Subexpression we could use nested Subexpressions and the following more >> complicated construction. >> >> Clear[a, b, c, d] >> step1 = Plus @@ >> MapThread[ >> CreateSubexpression[#1, #2] &, {HoldForm /@ {a, b, c, d}, {taga, >> tagb, tagc, tagd}}] >> a = 1; b = 2; c = 3; d = 4; >> step2 = step1 // >> MapLevelParts[CreateSubexpression[#, tagcd] &, {{3, 4}}]; >> step3 = step2 // >> MapLevelParts[CreateSubexpression[#, tagab] &, {{1, 2}}] >> step4 = Fold[OperateSubexpression[ReleaseHold, #2][#1] &, >> step3, {taga, tagb, tagc, tagd}] >> step5 = Fold[ReleaseSubexpressions[#2][#1] &, >> step4, {taga, tagb, tagc, tagd}] >> FixedPoint[ReleaseSubexpressions[All], step5] >> >> (a)+(b)+(c)+(d) >> >> ((a)+(b))+((c)+(d)) >> >> ((1)+(2))+((3)+(4)) >> >> (3)+(7) >> >> 10 >> >> >> David Park >> djmpark at comcast.net >> http://home.comcast.net/~djmpark/ >> >> >> From: Julian Francis [mailto:julian.w.francis at gmail.com] >> >> Dear all, >> >> I'd like to use the TreePlot function to visualise the expression of a >> dynamic programming problem I am working on. >> >> If I have something like: ( (a+b) + (c+d ) >> >> Mathematica helpfully simplifies this to: a + b + c + d >> >> But I'd prefer it to be in the original form. >> >> I can't write Hold[ ( (a+b) + (c+d) )] because I do want a,b,c & d to >> be evaluated. >> >> I want to write something like: >> Hold[ ( (Evaluate[a]+Evaluate[b]) + (Evaluate[c]+Evaluate[d]) ) ] >> >> But this just leaves the Evaluate expressions unevaluated. >> >> Any help greatly appreciated. >> >> Thanks, >> Julian. >> >> > > >

**References**:**Re: How to evaluate parts of an expression, but not other parts?***From:*"andre.robin3" <andre.robin3@wanadoo.fr>