MathGroup Archive 2011

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

Search the Archive

Re: Apply a rule to an expression only once

  • To: mathgroup at smc.vnet.net
  • Subject: [mg116334] Re: Apply a rule to an expression only once
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Fri, 11 Feb 2011 04:15:54 -0500 (EST)

One simple way that appears to achieve what you want (or seem so) is to use Replace instead of ReplaceAll. After all, you do not want to "replace all", do you?

So

expr = f a + f b;

rule = f p_ + x_ :> f[p] + x

Replace[expr, rule]

f[a] + b*f

?

Andrzej Kozlowski

On 10 Feb 2011, at 19:22, Guido Walter Pettinari 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.
>
>


  • Prev by Date: Re: Apply a rule to an expression only once
  • 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