Mathematica中PatternTest的意外行为

时间:2011-12-11 22:37:48

标签: wolfram-mathematica

我正在研究玩具问题,以帮助我理解Mathematica中模式匹配的想法。以下代码的行为与我的预期不符,我无法弄清楚我对PatternTest的理解有什么问题。

MatchQ[{2, 1, 2, 5}, {x__?(FromDigits[{#}] > 3 &), y__}]

我期望这段代码检查列表{2,1,2,5}是否可以写成两个连续(非空)序列,这样我们从第一个序列得到的整数大于3.自{{1是一种重写列表以便{Sequence[2,1],Sequence[2,5]}成立的方法,我希望该代码返回值FromDigits[{2,1}] > 3。但事实并非如此。

我对代码的解释有什么问题?

1 个答案:

答案 0 :(得分:14)

PatternTest(又名?)的文档说

  

__?test之类的形式,与__匹配的序列中的每个元素   在应用测试时必须产生True

因此,您的代码将无法正常运行。

查看模式如何工作的好方法是使用ReplaceList。 接近你代码的东西是

In[1]:= ReplaceList[{3, 4, 2, 1}, 
          {___, x__?(FromDigits[{##}] > 3 &), y___} :> {{x}, {y}}]

Out[1]= {{{4}, {2, 1}}}

但是,如果您使用Condition (/;)而不是模式测试,那么您可以获得您正在寻找的行为

In[2]:= ReplaceList[{3, 4, 2, 1}, 
          {___, x__, y___} :> {{x}, {y}} /; FromDigits[{x}] > 3]

Out[2]= {{{3, 4}, {2, 1}}, {{3, 4, 2}, {1}}, {{3, 4, 2, 1}, {}}, 
         {{4}, {2, 1}}, {{4, 2}, {1}}, {{4, 2, 1}, {}}, {{2, 1}, {}}}