MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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.
>>
>>
>
>
>




  • Prev by Date: Re: How to evaluate parts of an expression, but not other parts?
  • Next by Date: Re: nVidia Optumus prevents using CUDA?
  • Previous by thread: Re: How to evaluate parts of an expression, but not other parts?
  • Next by thread: Re: How to evaluate parts of an expression, but not other parts?