Re: pattern matching: rules that stop other rules?
- To: mathgroup at smc.vnet.net
- Subject: [mg71603] Re: pattern matching: rules that stop other rules?
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 25 Nov 2006 05:36:38 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <ek63v6$913$1@smc.vnet.net>
croddie at princeton.edu wrote:
> Hello. I've been using Mathamatica for quite a while but without ever
> finding out how the language works fundamentally, which I'm trying to
> do now. I'd be grateful for some help in understanding patterns - it
> seems like a powerful idea to me. There is something I can't work out.
>
> Define a function f [x_]:=0 say
> Now If [ p, 1, f [ 2] ] evaluates to itself.
Correct. Why? Because p does not hold any logical value (True of False)
yet. Therefore /If/ cannot determine which branch to compute and
returned unevaluated.
f[x_] := 0
If[p, 1, f[2]]
--> If[p, 1, f[2]]
> So the rule in the
> definition is not applied to f [ 2 ].
Depending on the result of the evaluation of the predicate /p/, one but
not the other argument will be evaluated.
Trace[If[p, 1, f[2]] /. p -> True]
--> {If[p, 1, f[2]] /.\[InvisibleSpace]p -> True, If[True, 1, f[2]], 1}
Trace[If[p, 1, f[2]] /. p -> False]
--> {If[p, 1, f[2]] /.\[InvisibleSpace]p -> False, If[False, 1, f[2]],
f[2], 0}
> Replace If with some other undefined function, say qwerty, and you get
> qwerty [ p, 1, 0] not surprisingly. And If [ p, 1, f [ 2] ] /. f
> [x_]->0 returns If [ p, 1, 0 ].
>
> Is there a rule associated with If that stops a rule (if that's the
> right expression) from being applied inside it? Can users write such
> rules?
Indeed, this is not a rule but the attribute /HoldRest/ that prevents
the evaluation of any argument but the first.
Attributes[If]
--> {HoldRest, Protected}
So the standard behavior of the built-in function /If/ can be summarize
as followed:
First, evaluate the first argument and do nothing with they other argument.
Second, if the result of the evaluation of the first augment cannot be
interpreted as a logical value /True/ or /False/, return the expression
unevaluated.
However, if the first augment evaluates to /True/, only then the
evaluation of the second argument will occurs, and if the evaluation of
the first argument returns /False/, in this case only the third -- and
only the third -- argument will be evaluated.
Note that there exists a form of /If/ with a fourth arguments, argument
that will be evaluated if the result of the evaluation of the first
argument is neither /True/ nor /False/
If[p, 1, 2, f[2]]
--> 0
Trace[If[p, 1, 2, f[2]]]
--> {If[p,1,2,f[2]],f[2],0}
HTH,
Jean-Marc