2011-10-05 16 views
5

Voglio abbinare l'espressione chi è la testa differisce da f.Testa di corrispondenza diversa da qualche modello

Questo funziona

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

Ma non questa

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

Perché la seconda soluzione non funziona? Come posso farlo funzionare?

+1

correlate SO domande: http://stackoverflow.com/questions/5286736/ differenza-tra-e-in-matematica, http://stackoverflow.com/questions/5750623/using-position-correctly e http://stackoverflow.com/questions/6510289/testing-for-null-and-not- null-in-mathematica –

risposta

14

Perchè questo non funziona: è necessario utilizzare =!= (UnsameQ), piuttosto che != (Unequal) per confronti strutturali:

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

La ragione può essere visto valutando questo:

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

Gli operatori == (Equal) e != (Unequal) valuteranno se stessi, quando il fatto di uguaglianza (o disuguaglianza) del non è possibile stabilire due lati. Questo ha senso in un ambiente simbolico. Ho considerato questo argomento in maggior dettaglio here, dove sono discussi anche SameQ e UnsameQ.

ci sono anche modi più eleganti per esprimere lo stesso modello, che sarà più efficiente e, come questa:

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

+1 per il 'Eccetto [_f] ' – Simon

Problemi correlati