As Leonid explained in the comment, HoldForm
is not transparent for the pattern matcher as opposed to HoldPattern
:
MatchQ[#, HoldForm[_]] & /@ {a, HoldForm[a]}
MatchQ[#, HoldPattern[_]] & /@ {a, HoldForm[a]}
{False, True}
{True, True}
From the above you see that an expression will match the pattern HoldForm[_]
only if its Head
is HoldForm
. HoldPattern
is specially designed to be transparent for the pattern matcher, and so HoldPattern[_]
is equivalent to _
for the pattern matcher.
Condition
(/;
) is interpreted as a part of rule only if it is placed on level 1 inside it:
FullForm[lhs :> rhs /; test]
RuleDelayed[lhs, Condition[rhs, test]]
{1, 2} /. x_Integer :> f[x] /; OddQ[x]
{f[1], 2}
Mathematica converts such structures to undocumented RuleCondition
for the purposes of pattern matching:
Trace[1 /. x_ :> f[x] /; OddQ[x]]
(*=> {{x_:>x/;test,x_:>x/;test},1/. x_:>x/;test,{RuleCondition[$ConditionHold[$ConditionHold[1]],test],Fail},1} *)
If one wraps Condition
with arbitrary head it is no more a part of the rule:
{1, 2} /. x_Integer :> f[x /; OddQ[x]]
{f[1 /; OddQ[1]], f[2 /; OddQ[2]]}
The role of such head may serve Identity
as Leonid suggests:
{1, 2} /. x_Integer :> Identity[x /; OddQ[x]]
{1 /; OddQ[1], 2 /; OddQ[2]}
HoldPattern
is also suitable but it is not necessary in your case.
HoldForm
? It works fine without it. $\endgroup$rule = datePicked /. {t_, n_, o_, b___} :> Identity[{t, n, v_, b} /; v <= o];
, whereIdentity
serves as an escaping mechanism, so that the condition is not interpreted as a part of the rule during rule application in the above code. The reason your pattern didn't work was not due tov
tov$
renaming, but due to the presence ofHoldForm
in your pattern - theHoldForm
head is not transparent for pattern-matching. As an alternative, you could useHoldPattern
in place ofHoldForm
, but I like the solution withIdentity
better. $\endgroup$Trace
when there are non-trivial calls to evaluator (viaCondition
orPatternTest
). In this case, your entire pattern was wrapped inHoldForm
, and the pattern-matcher was able to determine the fact of (non)match without testing the condition in the pattern. The problem ofCondition
being interpreted as a part of the rule rather than belonging to the answer (r.h.s.) only, is indeed rather subtle. This is a good question. If no one does this first, I will convert my comment into a proper answer $\endgroup$