[Date Index]
[Thread Index]
[Author Index]
Re: Apply a rule to an expression only once
*To*: mathgroup at smc.vnet.net
*Subject*: [mg116349] Re: Apply a rule to an expression only once
*From*: Bob Hanlon <hanlonr at cox.net>
*Date*: Fri, 11 Feb 2011 04:18:37 -0500 (EST)
expr = f a + f b;
rule = f p_ :> f[p];
MapAt[Replace[#, rule] &, expr, 1]
b f + f[a]
MapAt[ReplaceAll[#, rule] &, expr, 1]
b f + f[a]
Bob Hanlon
---- 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.
--
Bob Hanlon
Prev by Date:
**Re: Integrate this how?**
Next by Date:
**Re: Apply a rule to an expression only once**
Previous by thread:
**Re: Apply a rule to an expression only once**
Next by thread:
**Re: Apply a rule to an expression only once**
| |