Mic*_*aya 12 wolfram-mathematica
我正在研究玩具问题,以帮助我理解Mathematica中模式匹配的想法.以下代码的行为与我的预期不符,我无法弄清楚我对PatternTest的理解有什么问题.
MatchQ[{2, 1, 2, 5}, {x__?(FromDigits[{#}] > 3 &), y__}]
Run Code Online (Sandbox Code Playgroud)
我期望这段代码检查列表是否{2,1,2,5}可以写成两个连续(非空)序列,这样我们从第一个序列得到的整数大于3.因为{Sequence[2,1],Sequence[2,5]}是重写列表的一种方法FromDigits[{2,1}] > 3,我希望该代码返回值True.但事实并非如此.
我对代码的解释有什么问题?
Sim*_*mon 14
PatternTest(aka ?)的文档说
在一个形式中,例如
__?test匹配的序列中的每个元素__必须True在应用测试时产生.
因此,您的代码将无法按预期工作.
查看模式如何工作的好方法是使用ReplaceList.接近你代码的东西是
In[1]:= ReplaceList[{3, 4, 2, 1},
{___, x__?(FromDigits[{##}] > 3 &), y___} :> {{x}, {y}}]
Out[1]= {{{4}, {2, 1}}}
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用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}, {}}}
Run Code Online (Sandbox Code Playgroud)