2011-01-28 8 views

risposta

12

Mathematica ha un meccanismo che è in grado di determinare la generalità relativa delle regole in casi semplici, ad esempio capisce che ___ (BlankNullSequence) è più generale di __ (BlankSequence). Quindi, quando può, riordina le definizioni globali in base ad esso. È importante rendersi conto però che tale analisi è necessariamente per lo più sintattica. Pertanto, mentre alcuni semplici predicati incorporati come EvenQ possono essere analizzati a volte, come ad esempio EvenQ, utilizzarli con i predicati definiti dall'utente renderanno necessariamente impossibile tale riordino rispetto a regole definite in modo simile, in modo che Mathematica mantenga tali regole nell'ordine sono stati inseriti Questo perché, PatternTest e Condition impongono al pattern-matcher di chiamare il valutatore per determinare il fatto della corrispondenza, e ciò rende impossibile rispondere alla domanda relativa alla generalità delle regole alla definizione - tempo. Anche per le regole puramente sintattiche non è sempre possibile determinare la loro relativa generalità. Quindi, quando ciò non può essere fatto, o Mathematica non può farlo, mantiene le regole nell'ordine in cui sono state inserite.

Si trattava di regole globali, create da Set o SetDelayed o da altri operatori di assegnazione. Per le regole locali, come nel tuo esempio, non vi è alcun riordino di sorta, vengono applicate nell'ordine in cui sono presenti nell'elenco delle regole. Tutte le regole nell'elenco di regole oltre al primo applicato a una determinata (sotto) espressione, vengono ignorate per quella sottoespressione e quel particolare processo di applicazione di regole - l'espressione (secondaria) viene riscritta in base alla prima regola di corrispondenza e quindi il processo di applicazione della regola continua con altre sottoespressioni. Anche se la nuova forma dell'espressione (sotto) riscritta corrisponde ad alcune regole più in basso nell'elenco delle regole, non vengono applicate in questo processo di applicazione delle regole. In altre parole, per un singolo processo di applicazione di regole, per qualsiasi particolare (sotto) espressione, non viene applicata alcuna regola o viene applicata una sola regola. Ma anche qui ci sono alcune sottigliezze. Ad esempio, ReplaceAll (/.) applica le regole dalle espressioni più grandi alle sottoespressioni, mentre Replace con specifiche di livello esplicite lo fa in modo opposto. Questo può materia in casi come questo:

In[1]:= h[f[x, y]] /. {h[x_f] :> a, f[args__] :> b} 

Out[0]= a 

In[2]:= Replace[h[f[x, y]], {h[x_f] :> a, f[args__] :> b}, {0, Infinity}] 

Out[2]= h[b] 

ho citato regola riordino in alcuni posti nel mio libro: here, here e here. In rari casi in cui Mathematica riordina le regole in un modo non soddisfacente, è possibile modificare manualmente l'ordine manipolando direttamente con DownValues (o altri ... valori), ad esempio . Tali casi si verificano a volte, ma piuttosto raramente, e se accadono, assicurati che ci sia una buona ragione per mantenere il design esistente e per il riordino manuale delle regole.

Problemi correlati