Apply a rule to an expression only once

*To*: mathgroup at smc.vnet.net*Subject*: [mg116299] Apply a rule to an expression only once*From*: Guido Walter Pettinari <coccoinomane at gmail.com>*Date*: Thu, 10 Feb 2011 05:22:37 -0500 (EST)

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.