Документация для PatternTest (он же ?
) гласит:
В такой форме, как __?test
каждый элемент в последовательности, совпадающей с __
, должен давать True
при применении теста.
Таким образом, ваш код не будет работать так, как вы ожидали.
Хороший способ увидеть, как работает шаблон, - использовать ReplaceList
.Что-то похожее на ваш код:
In[1]:= ReplaceList[{3, 4, 2, 1},
{___, x__?(FromDigits[{##}] > 3 &), y___} :> {{x}, {y}}]
Out[1]= {{{4}, {2, 1}}}
Однако, если вы используете Условие (/;) вместо шаблонного теста, тогда вы можете получить поведение, которое искали
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}, {}}}