Ответ 1
Документация для PatternTest (aka ?
) говорит
В форме, такой как
__?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}, {}}}