2008-09-25 8 views
10

¿Alguien sabe si hay una función incorporada en Mathematica para obtener las reglas lhs de downvalue (sin ninguna retención)? Yo sé cómo escribir el código para hacerlo, pero parece bastante básico para un sistema incorporado enMathematica Downvalue Lhs

Por ejemplo:

a[1]=2; 
a[2]=3; 

BuiltInIDoNotKnowOf[a] vuelve {1,2}

Respuesta

9

Esto parece funcionar; no está seguro de lo útil que es, sin embargo:

a[1] = 2 
a[2] = 3 
a[3] = 5 
a[6] = 8 
Part[DownValues[a], All, 1, 1, 1] 
+0

Sí, traté de hacer algo similar con notación [[]], pero apagó la bodega y obtuve el rhs. Pero, esto funciona genial! –

+0

Parece que DownValues ​​[a] [[All, 1, 1, 1]] también funciona, al menos en este ejemplo simple. –

22

Esto es como keys() en Perl y Python y otros lenguajes que se han acumulado en el apoyo a los hash (también conocidos como diccionarios). Como lo ilustra su ejemplo, Mathematica admite hashes sin ninguna sintaxis especial. Solo di a[1] = 2 y tienes un hash. [1] Para conseguir las llaves de un hash, Recomiendo añadir esto a su init.m o la biblioteca de utilidades personales:

keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *) 

(O la siguiente versión pura función supuestamente es ligeramente más rápido:

keys = DownValues[#][[All,1,1,1]]&;  (* Keys of a hash/dictionary. *) 

)

De cualquier manera, keys[a] devuelve ahora lo que quiere. (Usted puede obtener los valores del hash con a /@ keys[a].) Si desea permitir a los hashes Arity más altos, como a[1,2]=5; a[3,4]=6 entonces usted puede utilizar esto:

SetAttributes[removeHead, {HoldAll}]; 
removeHead[h_[args___]] := {args} 
keys[f_] := removeHead @@@ DownValues[f][[All,1]] 

que devuelve {{1,2}, {3,4}}. (En ese caso, puede obtener los valores hash con a @@@ keys[a].)

Tenga en cuenta que DownValues ordena las claves por defecto, lo que probablemente no es una buena idea, ya que en el mejor de los casos lleva más tiempo. Si desea que las claves estén ordenadas, puede hacer [email protected][f]. Así que me gustaría realmente recomiendo esta versión:

keys = DownValues[#,Sort->False][[All,1,1,1]]&; 

Curiosamente, no hay mención de la opción Sort en el DownValues documention. Me enteré por una publicación anterior de Daniel Lichtblau de Wolfram Research. (Me confirmó que todavía funciona en la versión actual (7.0) de Mathematica.)


Notas al pie:

[1] Lo que es realmente útil es que se puede mezclar y combinar eso con las definiciones de funciones. Al igual que:

fib[0] = 1; 
fib[1] = 1; 
fib[n_] := fib[n-1] + fib[n-2] 

A continuación, puede añadir memoization cambiando la última línea de

fib[n_] := fib[n] = fib[n-1] + fib[n-2] 

que dice para almacenar en caché la respuesta para todas las llamadas posteriores.