2011-10-05 125 views
5

我想匹配头部不同于f的表情。匹配头不同于某种模式

这工作

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

但不是这个

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

为什么第二种方案无法正常工作?我怎样才能使它工作?

+1

相关SO问题:http://stackoverflow.com/questions/5286736/差异之间和在数学,http://stackoverflow.com/questions/5750623/using-position-correctly和http://stackoverflow.com/questions/6510289/testing-for-null-and-not- null-in-mathematica –

回答

14

为什么这不起作用:

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

原因可以通过评估此可以看出:

In[22]:= Head[t[3]]!=f 
Out[22]= t!=f 
必须进行结构比较使用 =!=UnsameQ),而不是 !=Unequal

运营商==Equal)和!=Unequal)确实评估自己,当事实的平等(或不平等)的双方无法建立。这在符号环境中很有意义。我更详细地考虑了该主题here,其中还讨论了SameQUnsameQ

也有更优雅的方式来表达同样的模式,这将是更有效的为好,像这样的:

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

+1除'[_f]' – Simon