Я не знаю ничего подобного "из коробки", но можно добиться аналогичного эффекта, скрывая выражения, в которых не нужны замены, с некоторыми временными символами, затем применяя правила и затем восстанавливая их.выражения назад.Вот один из способов:
ClearAll[ReplaceProtect];
ReplaceProtect /: f_[ReplaceProtect[expr_, ptrn_], args___] :=
Module[{protectRules, ps, n = 0},
protectRules =
Cases[expr, x : ptrn :> (HoldPattern[x] -> ps[n++]), Infinity];
f[expr /. protectRules, args] /.
Replace[protectRules,
Verbatim[Rule][Verbatim[HoldPattern][x_], rhs_] :> (rhs :> x), {1}
]
]
Вот как можно использовать это:
In[42]:= ReplaceProtect[{g[1],Hold[g[1]]},_g]/.g[n_]:>n+1
Out[42]= {g[1],Hold[g[1]]}
In[43]:= ReplaceProtect[{g[1],Hold[g[1]]},_Hold]/.g[n_]:>n+1
Out[43]= {2,Hold[g[1]]}
In[44]:= ReplaceProtect[v[a,b]+a-b,_v]/.{a->x,b->y}
Out[44]= x-y+v[a,b]
Я определил ReplaceProtect
с UpValues
в довольно общем виде, поэтомуиспользуется также с Replace
и другими функциями, которые используют правила.