Re: Apply a rule to an expression only once

*To*: mathgroup at smc.vnet.net*Subject*: [mg116330] Re: Apply a rule to an expression only once*From*: DrMajorBob <btreat1 at austin.rr.com>*Date*: Fri, 11 Feb 2011 04:15:11 -0500 (EST)

expr = f a + f b; rule = f p_ :> f[p]; first = First@Cases[expr, First@rule] where = First@Position[expr, first] ReplacePart[expr, where -> (first /. rule)] a f {1} b f + f[a] Bobby On Thu, 10 Feb 2011 04:22:37 -0600, Guido Walter Pettinari <coccoinomane at gmail.com> wrote: > Hello group! > > Does anybody know how to apply a rule to an expression only once? > In other words, is it possible to tell ReplaceAll to stop after the > first application of a rule? > > Simple example: > > expr = f a + f b; > rule = f p_ :> f [p]; > ReplaceAll [ expr, rule ] > > The output, as expected, is: > f [a] + f [b] > > However, what I want is something like: > > ReplaceAll [ expr, rule, OnlyFirst -> True ] > > that gives the output > > f [a] + f b. > > My simple example can be solved by using ReplacePart, but alas it is > not the kind of solution I am looking for. > > Thank you for your consideration! > > Best regards, > > Guido W. Pettinari > > P.S. I found a temporary solution by using a pattern test at the time > of rule definition, i.e. > > rule = f p_ /; matchFirst[] :> f [p], > > with > > matchFirst [] := Module [ { }, > If [ TrueQ@$alreadyMatched, False, $alreadyMatched = True; True] > ], > > but this does not satisfy me since (i) I do not want to alter the rule > definition, and (ii) I have to update the global variable > $alreadyMatched every time I want to use the trick. > > -- DrMajorBob at yahoo.com