2011-04-06 16 views
5

Buenos días,traza entendimiento *

Al intentar entender secuencia de evaluación del Mathematica 's mediante el uso de estándares Trace y TraceScan comandos y sus buenas representaciones visuales desarrollados en la reciente thread, que se enfrentó a algunas ambigüedades en su comportamiento .

En primer lugar, cuando se evalúo

En [1]: = Traza [a + 1, TraceOriginal-> Real]

consigo

de salida [ 1] = {a + 1, {Plus}, {a}, {1}, a + 1,1 + a, {Plus}, {1}, {a}, 1 + a}

Todas las sublistas corresponden a sub-evaluaciones (como se indica en la Documentación). La última expresión 1+a corresponde probablemente al resultado de la evaluación, aunque no está claramente indicada en la Documentación. Pero, ¿qué significa exactamente las expresiones a+1 y 1+a en el medio de la lista? ¿A cuáles pasos de evaluación de the standard evaluation sequence corresponden?

La segunda rareza es con TraceScan. Considere lo siguiente:

En [1]: = list = {}; TraceScan [AppendTo [list, StyleForm [#, "Input"]] &, (a + 1), _, AppendTo [list, #] &]; lista

Fuera [1] = {a + 1, Plus, Plus, un, a, , 1, 1 + a, Plus, Plus, , 1, un, a, 1 + a, a + 1}

se puede ver que las dos últimas expresiones de la lista son 1+a y a+1. Ambos son resultados de (sub) evaluaciones. Pero la salida real es 1+a y entonces no entiendo por qué a+1 está al final de la cadena de evaluación? ¿Y por qué no hay a+1 en el medio de la cadena de evaluación como en el caso de Trace? ¿Es un error?

P.S. Estos resultados se reproducen con Mathematica 7.0.1 y 5.2.

+0

Creo que esto se debe migrar a: http://math.stackexchange.com/ – RobertPitt

+2

@RobertPitt Esta pregunta no es sobre matemática. Está relacionado solo con las partes internas de * Mathematica *. Como puede ver, utilizo el ejemplo más primitivo posible: evaluación de la expresión 'a + 1' en * Mathematica * cuando' a' no está definido. Estoy tratando de entender qué sucede dentro de * Mathematica * cuando evalúo esto. Parece que no es tan simple como uno podría esperar ... –

+1

@RobertPitt Este es un malentendido común. La etiqueta Mathematica se refiere al programa Mathematica desarrollado por Wolfram Research Inc. No es equivalente a _Mathematics_ o _math_. Ver también http://meta.stackexchange.com/q/81152/158668. –

Respuesta

3

Se llama al argumento fp con TraceScan con dos argumentos. El primero es la expresión original no evaluada. El segundo es el resultado de la evaluación. En su ejemplo, el segundo AppendTo está usando el primer argumento para que vea la expresión no evaluada. Cambia # a #2 y luego verás los resultados que esperas.

También tenga en cuenta que el segundo argumento es no envuelto en HoldForm (documentación no obstante), por lo que en general se debe tener cuidado de usar una función que mantiene sus argumentos para el argumento fp para evitar la generación de evaluaciones espurias.

Comparando traza y TraceScan

El comportamiento de Trace se describe con gran detalle en el Mathematica 8 documentation. Establece que, de forma predeterminada, Trace solo muestra las expresiones después de se evaluaron el encabezado y los argumentos. Por lo tanto, vemos una secuencia como esta:

In[28]:= SetAttributes[f, Orderless] 
     Trace[f[a, 1]] 
Out[29]= {f[a,1],f[1,a]} 

Solo se muestra la expresión de entrada y su resultado. Los controles de opciones TraceOriginal (cita) "si observar las expresiones antes de que se evalúen sus cabezas y argumentos". Cuando esta opción es True entonces la salida se complementa con las expresiones de la cabeza y de argumentos:

In[30]:= Trace[f[a,1], TraceOriginal->True] 
Out[30]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]} 

El primer elemento de la nueva lista es la expresión original antes la cabeza y se evalúan los argumentos. Luego vemos la cabeza y los argumentos que se evalúan. Finalmente, vemos las expresiones de nivel superior nuevamente, después de evaluar el encabezado y los argumentos. Los últimos dos elementos de la lista coinciden con los dos elementos de la salida de rastreo original.

Como dice la documentación vinculada, Trace es muy selectivo sobre las expresiones que devuelve. Por ejemplo, omite cadenas de evaluación triviales por completo. TraceScan es completo y llama a las funciones suministradas para cada evaluación, trivial o no.Se puede ver el conjunto completo de evaluaciones utilizando la siguiente TraceScan expresión:

TraceScan[Print, f[a,1], _, Print[{##}]&] 

La siguiente tabla coincide con la salida producida por Trace con y sin TraceOriginal, junto con la salida de la expresión TraceScan:

Trace Trace TraceScan 
     Original 

     f[a,1] f[a,1] 
       f 
     {f}  {f 
       ,f} 
       a 
     {a}  {a 
       ,a} 
       1 
     {1}  {1 
       ,1} 
       f[1,a] 
       {f[1,a] 
       ,f[1,a]} 
f[a,1] f[a,1] {f[a,1] 
f[1,a] f[1,a] ,f[1,a]} 

Hay una cierta cantidad de especulación en esta tabla acerca de qué entrada coincide con la que, dado que las partes internas de Trace son inaccesibles. Experimentos adicionales pueden proporcionar información que ajusta la alineación. Sin embargo, el punto clave es que toda la información generada por Trace está disponible usando TraceScan - y TraceScan proporciona más.

+0

Todavía hay algo extraño con la salida de 'TraceScan'. Evaluación 'list1 = {}; list2 = {}; TraceScan [AppendTo [list1, #] &, (a + 1), _, AppendTo [list2, # 1] &]; 'da dos listas diferentes:' {a + 1, Plus, a, 1,1 + a , Plus, 1, a} 'y' {Plus, a, 1, Plus, 1, a, 1 + a, a + 1} '... –

+1

@Alexey Las dos listas diferirán en general. Considere 'Plus', que es la segunda expresión que se evaluará (aparece en segundo lugar en' list1'), pero es la primera expresión para la que se completa la evaluación (aparece primero en 'list2'). Del mismo modo, 'a + 1' es la primera expresión que se evaluará, pero la última para la cual se completa la evaluación. Es un negocio difícil hacer coincidir los comienzos y fines de la evaluación. [traceView2] (http://stackoverflow.com/questions/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117) usa una pila para realizar este emparejamiento. – WReach

+0

@WReach Explicación muy clara, ¡gracias! La única pregunta que queda es acerca de la diferencia entre las salidas de 'Trace [a + 1, TraceOriginal-> True]' y 'list = {}; TraceScan [AppendTo [list, #] &, a + 1]; lista'. El primero devuelve una lista que contiene en el medio dos expresiones: 'a + 1' y' 1 + a'. El primero de ellos corresponde aparentemente a un paso intermedio de la secuencia de evaluación * antes * de la aplicación del atributo 'Sin orden', el segundo es el resultado de la aplicación de este atributo. ¿Es correcto? Pero en el caso de 'TraceScan' no puedo encontrar el paso de aplicar este atributo. –

3

La primera parte de la pregunta es fácil. Las expresiones a+1 y 1+a en el medio de la lista son donde se activa el atributo Orderless de Plus y los términos se ordenan en el orden predeterminado. Este es el punto número 8 en el standard evaluation sequence tute.

La "extrañeza" en TraceScan también ocurre en la versión 8. Porque, es un comando raro, aquí está la documentación para TraceScan

TraceScan [f, expr, la forma, fp] se aplica f antes de la evaluación y FP después evaluación de expresiones utilizadas en la evaluación de expr.

Tenga en cuenta que si se aplica a la expresión a + 1 + b se obtiene

In[32]:= TraceScan[Print["f \t",#]&, a+1+b, _, Print["fp\t",#]&] 
During evaluation of In[32]:= f  a+1+b 
During evaluation of In[32]:= f  Plus 
During evaluation of In[32]:= fp Plus 
During evaluation of In[32]:= f  a 
During evaluation of In[32]:= fp a 
During evaluation of In[32]:= f  1 
During evaluation of In[32]:= fp 1 
During evaluation of In[32]:= f  b 
During evaluation of In[32]:= fp b 
During evaluation of In[32]:= f  1+a+b 
During evaluation of In[32]:= fp 1+a+b 
During evaluation of In[32]:= fp a+1+b 
Out[32]= 1+a+b 

A partir de aquí, está claro que lo que está sucediendo. fp se aplica después de la evaluación, por lo que el fp final corresponde en realidad al primer f. No se imprime hasta el final porque las subexpresiones deben evaluarse primero.

+0

Tu explicación del comportamiento 'TraceScan' no es evidente para mí. Necesito un ejemplo más claro para encontrar una lógica en tal comportamiento. En particular, 'Trace [a + 1 + b, TraceOriginal -> True]' da '{a + 1 + b, {Plus}, {a}, {1}, {b}, a + 1 + b, 1 + a + b} '. ¿Quiere decir que el segundo 'a + 1 + b' es el resultado de la evaluación? Pero debería ser solo una expresión intermedia antes de aplicar el atributo 'Orderless'. Y el resultado de la evaluación es '1 + a + b'. –

+0

No estoy seguro de qué otra manera explicarlo (probablemente porque no estoy muy seguro de por qué el 'fp' final tiene la forma no evaluada que tiene). De todos modos, compare con un ejemplo modificado de los documentos 'TraceScan':' TraceScan [Imprimir ["f \ t", #] &, f [1, 2 + 3], _, Imprimir ["fp \ t", #] &] ' – Simon

+0

Gracias por la respuesta de cualquier manera. Ahora entiendo la posición de aplicación del atributo 'Orderless' en la salida' Trace'. El único problema que queda es sobre el comportamiento de 'TraceScan'. –