2011-10-05 9 views
5

Quiero hacer coincidir expresión cuya cabeza difiere de f.Cabezal coincidente diferente de algún patrón

Esto funciona

[In] !MatchQ[t[3], x_ /; Head[x] == f] 
[Out] True 

Pero no esta

[In] MatchQ[t[3], x_ /; Head[x] != f] 
[Out] False 

¿Por qué la segunda solución no funciona? ¿Cómo puedo hacer que funcione?

+1

relacionados SO preguntas: http://stackoverflow.com/questions/5286736/ diferencia-entre-y-en-matemáticas, http://stackoverflow.com/questions/5750623/using-position-correctly y http://stackoverflow.com/questions/6510289/testing-for-null-and-not- null-in-mathematica –

Respuesta

14

¿Por qué esto no funciona: debe utilizar =!= (UnsameQ), en lugar de != (Unequal) para las comparaciones estructurales:

In[18]:= MatchQ[t[3],x_/;Head[x]=!=f] 
Out[18]= True 

La razón se puede ver mediante la evaluación de esta:

In[22]:= Head[t[3]]!=f 
Out[22]= t!=f 

Los operadores == (Equal) y != (Unequal) se evalúan a sí mismos, cuando el hecho de la igualdad (o desigualdad) del dos lados no pueden ser establecidos. Esto tiene sentido en un entorno simbólico. Consideré este tema con más detalle en here, donde también se tratan SameQ y UnsameQ.

también hay formas más elegantes para expresar el mismo patrón, que será más eficiente, así, como este:

MatchQ[t[3],Except[_f]] 
+1

+1 para el 'Excepto [_f]' – Simon

Cuestiones relacionadas