2011-12-11 14 views
12

Sto lavorando su problemi di giocattoli per aiutarmi ad assimilare l'idea di abbinamento di modelli in Mathematica. Il seguente codice non si comporta come mi aspettavo, e non sono riuscito a capire cosa c'è di sbagliato nella mia comprensione di PatternTest.Un comportamento imprevisto di PatternTest in Mathematica

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

ho previsto questo pezzo di codice per verificare se la lista {2,1,2,5} può essere scritto come due consecutivi (non vuoto) sequenze tale che l'intero otteniamo dalla prima sequenza è maggiore di 3. Poiché {Sequence[2,1],Sequence[2,5]} è uno modo per riscrivere l'elenco tale che detiene FromDigits[{2,1}] > 3, mi aspettavo che il codice restituisca il valore True. Tuttavia, questo non è il caso.

Cosa c'è di sbagliato nella mia interpretazione del codice?

risposta

14

La documentazione per PatternTest (alias ?) dice

In una forma come __?test ogni elemento della sequenza riscontro __ deve cedere True quando viene applicata test.

Così il tuo codice non funzionerà come speravi.

Un buon modo per vedere come funziona un modello è utilizzare ReplaceList. qualcosa di simile al codice è

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

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

Tuttavia, se si utilizza Condition (/;) invece di prova di modello, allora si può ottenere il comportamento che stavate cercando

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

Che è stato veloce reale! +1 –

+0

@Leonid: Il potere della procrastinazione non conosce limiti! – Simon

+0

Penso che la risposta sia stata scritta più velocemente di quanto ho messo insieme un commento, all'incirca nello stesso momento. –

Problemi correlati