2011-12-11 21 views
12

Estoy trabajando en problemas de juguetes para ayudarme a asimilar la idea de la coincidencia de patrones en Mathematica. El siguiente código no se comporta como esperaba, y no pude entender qué está mal con mi comprensión de PatternTest.Un comportamiento inesperado de PatternTest en Mathematica

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

I espera que este pedazo de código para comprobar si la lista {2,1,2,5} se puede escribir como dos (no-vacío) secuencias consecutivas de tal manera que el número entero que obtenemos de la primera secuencia es mayor que 3. Desde {Sequence[2,1],Sequence[2,5]} es uno forma de reescribir la lista de modo que FromDigits[{2,1}] > 3 se mantenga, esperaba que el código devolviera el valor True. Sin embargo, este no es el caso.

¿Qué hay de malo en mi interpretación del código?

Respuesta

14

La documentación para PatternTest (aka ?) dice

En una forma tal como __?test cada elemento de la secuencia ajustada por __ debe ceder True cuando se aplica el ensayo.

Por lo tanto, su código no funcionará como esperaba.

Una buena forma de ver cómo funciona un patrón es usar ReplaceList. Algo cerca de su código es

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

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

Sin embargo, si se utiliza Condition (/;) en lugar de la prueba patrón, entonces se puede obtener el comportamiento que estabas buscando

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}, {}}} 
+0

Eso fue muy rápido! +1 –

+0

@Leonid: ¡El poder de la procrastinación no conoce límites! – Simon

+0

Creo que la respuesta se escribió más rápido de lo que hice un comentario, más o menos al mismo tiempo. –

Cuestiones relacionadas