2010-11-07 3 views
1

Apparemment, ces variables de modèle ne fonctionnent pas comme je le pensais. Voici un exemple simple:Pourquoi cette variable de modèle mathematica n'est-elle pas évaluée?

In[264] := 1 /. x_ -> {x, f[x], ToString[x]} 
Out[264] := {1, f[1], "x"} 

Pourquoi est ce dernier élément "x" au lieu de "1". Ce qui suit fonctionne comme prévu.

In[267]:= y = 2; 
    ToString[y] 
Out[268]= "2" 

grâce,
Rob

Répondre

4

Le côté droit de la règle est en cours d'évaluation avant le remplacement, vous devez donc utiliser RuleDelayed (:>) au lieu de Rule (->):

In[1]:= 1 /. x_ :> {x, f[x], ToString[x]} 

Out[1]= {1, f[1], "1"} 

Rule et RuleDelayed sont analogues à Set (=) et SetDelayed (:=).

HTH!

3

Essayez Trace[1 /. x_ -> {x, f[x], ToString[x]}]. Je n'ai pas accès à mathematica pour le moment, mais je crois que vous verrez que le remplacement, en particulier ToString[x], est évalué avant le motif est appliqué, donc effectivement vous faites 1 /. x_ -> {x, f[x], "x"}.

+3

À droite, vous voulez utiliser 'RuleDelayed', c'est-à-dire':> 'au lieu de' -> '(' Rule'). –

+0

@Michael: Vous devriez poster cela comme une réponse séparée, donc je peux le convertir et l'OP peut l'accepter! – Cascabel

+0

Merci, c'était ça. RuleDelayed au lieu de Rule. –