wolfram-mathematica - tutorial - wolfram mathematica online
Mathematica Downvalue Lhs (2)
Esto parece funcionar; no estoy 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]
¿Alguien sabe si hay una función incorporada en Mathematica para obtener las reglas lhs de downvalue (sin ninguna retención)? Sé cómo escribir el código para hacerlo, pero parece lo suficientemente básico para un built-in
Por ejemplo:
a[1]=2;
a[2]=3;
BuiltInIDoNotKnowOf[a]
devuelve {1,2}
Esto es como keys()
en Perl y Python y otros lenguajes que se han incorporado para soportar hash (aka diccionarios). Como lo ilustra su ejemplo, Mathematica admite hashes sin ninguna sintaxis especial. Solo di a[1] = 2
y tienes un hash. [1] Para obtener las claves de un hash, recomiendo agregar esto a tu init.m o a tu biblioteca de utilidades personales:
keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *)
(O la siguiente versión de función pura es supuestamente ligeramente más rápida:
keys = DownValues[#][[All,1,1,1]]&; (* Keys of a hash/dictionary. *)
)
De cualquier manera, las keys[a]
ahora devuelven lo que desea. (Puede obtener los valores del hash con las a /@ keys[a]
.) Si desea permitir hashes de aridad más altos, como a[1,2]=5; a[3,4]=6
a[1,2]=5; a[3,4]=6
entonces puedes usar 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 las a @@@ keys[a]
).
Tenga en cuenta que DownValues
por defecto las claves, lo que probablemente no sea una buena idea, ya que en el mejor de los casos toma más tiempo. Si desea ordenar las claves, puede hacer las Sort@keys[f]
. Entonces realmente recomendaría esta versión:
keys = DownValues[#,Sort->False][[All,1,1,1]]&;
Curiosamente, no se menciona la opción Sort
en la documentación de DownValues
. Me enteré por una publicación anterior de Daniel Lichtblau de Wolfram Research. (Confirmé que todavía funciona en la versión actual (7.0) de Mathematica).
Notas al pie:
[1] Lo realmente útil es que puedes mezclarlo y combinarlo con las definiciones de funciones. Me gusta:
fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]
A continuación, puede agregar memoria cambiando la última línea a
fib[n_] := fib[n] = fib[n-1] + fib[n-2]
que dice que almacenar en caché la respuesta para todas las llamadas posteriores.