33 | Expresiones y su estructura |
Se ha visto ya una gran diversidad del material contenido en Wolfram Language: listas, gr
áficos, funciones puras y muchas cosas m
ás. Se est
á ahora en posici
ón de comenzar a tratar con una cuesti
ón fundamental en Wolfram Language: el hecho de que cada una de esas cosas
—y, de hecho, todo aquello con lo que trata el lenguaje
— est
á construida siempre en la misma forma b
ásica. Todo ello es lo que se llama una
expresión simbólica.
Las expresiones simbólicas son una manera muy general de representar una estructura, potencialmente con un significado asociado a esa estructura. f[x,y] es un ejemplo sencillo de expresión simbólica. Por sí misma, esta expresión simbólica no tiene asociado ningún significado en particular de modo que, al escribirla, Wolfram Language la regresará tal cual, sin cambios.
f[x, y] es una expresión simbólica sin ningún significado particular asociado:
{x,y,z} es otra expresi
ón simb
ólica. Aunque internamente es
List[x,y,z], se visualiza como
{x,y,z}.
La expresi
ón simb
ólica
List[x, y, z] se visualiza como
{x, y, z}:
Frecuentemente, las expresiones simbólicas están anidadas:
FullForm muestra la forma interna de cualquier expresi
ón simb
ólica.
Out[4]//FullForm= |
| |
Graphics[Circle[{0,0}]] es otra expresi
ón simb
ólica, que se muestra en pantalla como la imagen de un c
írculo.
FullForm muestra su estructura interna.
Esta expresión simbólica se visualiza como un círculo:
FullForm muestra la estructura subyacente de esa expresi
ón simb
ólica:
Out[6]//FullForm= |
| |
A menudo sucede que las expresiones simbólicas no solo se muestran en pantalla de una manera especial, sino que, además, se evalúan y producen resultados.
Una expresi
ón simb
ólica que se eval
úa para producir un resultado:
Los elementos de la lista se evalúan, pero la lista misma sigue siendo simbólica:
He aquí la estructura de la lista como expresión simbólica:
Out[9]//FullForm= |
| |
Esto es una expresión simbólica que, además, se evalúa:
Lo anterior podría escribirse de este modo:
¿Cu
áles son los elementos constitutivos m
ás elementales en las expresiones simb
ólicas? Se les llama
átomos (por analog
ía con los elementos constitutivos b
ásicos de los materiales f
ísicos). Los principales tipos de
átomos son los n
úmeros, las cadenas de caracteres y los
símbolos.
Por ejemplo,
x,
y,
f,
Plus,
Graphics y
Table, son s
ímbolos. Todo s
ímbolo tiene un nombre
único. En ocasiones, tambi
én lleva asociado un significado. A veces, tambi
én estar
á asociado con una evaluaci
ón. Y tambi
én puede ser parte de la definici
ón de una estructura que usar
án otras funciones. Pero no es necesario que sea nada de eso; simplemente debe tener un nombre.
Una caracter
ística crucial de Wolfram Language es que puede manejar s
ímbolos puramente como tales, como s
ímbolos (
“simb
ólicamente
”), sin que se tengan que evaluar, para producir n
úmeros, por ejemplo.
En Wolfram Language, x puede simplemente ser x, sin que tenga que evaluarse como alguna otra cosa:
x no se evalúa, pero la suma se hace de todos modos, según las leyes del álgebra, en este caso:
Dados símbolos tales como x, y y f, se puede construir una infinidad de expresiones con ellos. Así, f[x], y f[y], y f[x,y]. Y también f[f[x]] o f[x,f[x,y]], o, para el caso, x[x][y,f[x]] o lo que sea.
En general, toda expresi
ón corresponde a un
árbol, cuyas
“hojas
” últimas son
átomos. Una expresi
ón puede mostrarse en forma de
árbol usando
TreeForm.
Una expresión exhibida en forma de árbol:
Out[14]//TreeForm= |
| |
Aquí se tiene una expresión sobre gráficos mostrada en forma de árbol:
Out[15]//TreeForm= |
| |
A fin de cuentas, las expresiones tienen una estructura muy uniforme, as
í que las operaciones en Wolfram Language operan sobre ellas tambi
én de manera muy uniforme.
Por ejemplo, cualquier expresi
ón tiene partes, como las de una lista, que se pueden extraer mediante el uso de
[[...]].
Esto es equivalente a {x, y, z}[[2]], y extrae el segundo elemento de una lista:
La extracción de partes funciona de igual forma en la siguiente expresión:
Esto extrae el círculo del gráfico:
Y, de igual modo, se extraen a continuación las coordenadas de su centro:
Esto llega exactamente al mismo resultado:
En
f[x,y], a
f se le llama
encabezado de la expresi
ón.
x y
y se llaman
argumentos. La funci
ón
Head extrae el encabezado de una expresi
ón.
El encabezado de una lista es
List:
Toda parte de una expresión tiene un encabezado, incluyendo sus átomos.
El encabezado de un entero es
Integer:
El encabezado de un n
úmero real aproximado es
Real:
El encabezado de una cadena de caracteres es
String:
Hasta los s
ímbolos tienen un encabezado, a saber:
Symbol.
Mediante el uso de los patrones se pueden buscar coincidencias de expresiones con encabezados dados.
_Integer representa cualquier entero,
_String cualquier cadena de caracteres y as
í sucesivamente.
_Integer es un patr
ón que coincide
únicamente con objetos que tengan el encabezado
Integer:
Los patrones denominados pueden también tener encabezados especificados:
Al usar Wolfram Language, la mayor parte de los encabezados que se ven son s
ímbolos. Sin embargo, hay casos importantes donde aparecen encabezados m
ás complicados. Uno de estos casos es el de las funciones puras, donde al aplicar una funci
ón pura dicha funci
ón pura aparece como encabezado.
He aqu
í la forma completa de una funci
ón pura (
# es
Slot[1]):
Out[28]//FullForm= |
| |
Al aplicar la función pura, esta aparece como encabezado:
A medida que uno se vuelve m
ás sofisticado en la programaci
ón en Wolfram Language, se van encontrando cada vez m
ás casos de encabezados complicados. De hecho, muchas de las funciones que se han revisado hasta ahora tienen
formas de operador, donde aparecen como encabezados; y, el usarlas de esta forma, lleva a estilos de programaci
ón muy poderosos y elegantes.
Select aparece aqu
í como encabezado:
Tanto
Cases como
Select aparecen como encabezados en este ejemplo:
Todas las operaciones estructurales b
ásicas para listas que se han visto trabajan exactamente igual en el caso de expresiones arbitrarias.
Length no pone atenci
ón en cu
ál sea el encabezado de una expresi
ón; simplemente cuenta los argumentos:
/@ tampoco pone atenci
ón en cu
ál sea el encabezado de una expresi
ón; simplemente aplica una funci
ón a sus argumentos:
Dado que hay muchas funciones que generan listas, resulta conveniente construir estructuras en forma de listas, aun si al final hay que sustituir las listas por otras funciones.
@@ sustituye el encabezado de la lista por
f:
Esto da
Plus[1, 1, 1, 1], lo que entonces se eval
úa:
Esto convierte una lista en una regla:
Aquí se ve una alternativa más sencilla, sin hacer explícita la función pura:
Una situaci
ón insospechadamente com
ún se da cuando se tiene una lista de listas, donde se quiere sustituir las listas interiores por alguna funci
ón. Eso puede efectuarse con
@@ y
/@. Sin embargo,
@@@ es una forma directa y m
ás conveniente para ese prop
ósito.
Sustituya las listas interiores por f:
Convierta en reglas las listas interiores:
He aqu
í un ejemplo de c
ómo se puede utilizar
@@@ para construir un grafo a partir de una lista de parejas.
Esto genera una lista de parejas de caracteres:
Convierta lo anterior en una lista de reglas:
Forme un
gráfico de transiciones que muestre c
ómo cada letra es la sucesiva de cada otra:
FullForm[expr] | | muestra la forma interna completa |
TreeForm[expr] | | muestra la estructura de árbol |
Head[expr] | | extrae el encabezado de una expresión |
_encabezado | | busca la coincidencia de una expresión con un encabezado particular |
f@@lista | | sustituye el encabezado de lista con f |
f@@@{lista1,lista2, ...} | | sustituye los encabezados de lista1, lista2, ... con f |
33.1Encuentre el encabezado de la salida de un
ListPlot.
»
33.2Use
@@ para calcular el resultado de multiplicar todos los enteros hasta el 100.
»
33.3Use
@@@ y
Tuples para generar
{f[a, a], f[a, b], f[b, a], f[b, b]}.
»
33.4Haga una lista con las formas de
árbol de 4 aplicaciones sucesivas de
#^#& comenzando con
x.
»
33.5Encuentre los casos, sin repeticiones, para los que
i^2/(j^2+1) es un entero, donde i y j toman valores hasta el 20.
»
33.6Cree un grafo que conecte parejas sucesivas de n
úmeros en
Table[Mod[n^2+n, 100], {n, 100}].
»
33.7Genere un grafo que muestre qu
é palabra sigue a cu
ál en las 200 primeras palabras del art
ículo en Wikipedia sobre
“computers
”.
»
33.8Encuentre una forma m
ás simple para
f@@#&/@{{1, 2}, {7, 2}, {5, 4}}.
»
¿C
ómo se interpretan
@@ y
@@@?
f@@expr es
Apply[f, expr].
f@@@expr es
Apply[f, expr, {1}]. Por lo general, se leen como
“doble arroba
” y
“triple arroba
”.
¿Son
árboles todas las expresiones en Wolfram Language?
En un nivel estructural, s
í. Sin embargo, cuando se tienen variables con valores asignados (ver la
Sección 38), se comportan m
ás bien como grafos dirigidos. Y, por supuesto, se puede usar
Graph para representar cualquier grafo como una expresi
ón en Wolfram Language.
- El concepto básico de los lenguajes simbólicos procede directamente de los trabajos sobre lógica matemática, que se remontan a los años 1930 y anteriores pero, aparte de Wolfram Language, son muy raros los que lo han implementado en la práctica.
- Las expresiones en Wolfram Language se parecen un poco a las de XML (y se pueden convertir de unas a otras). Pero, a diferencia de las expresiones en XML, las de Wolfram Language pueden evaluarse, de tal modo que cambien su estructura automáticamente.
- Cosas como Select[f], que se han establecido para aplicarse a expresiones, se llaman formas de operador, por analogía con los operadores en matemáticas. El usar Select[f][expr] en vez de Select[expr, f] se llama generalmente currificación, por el especialista en lógica Haskell Curry.
- Los símbolos como x pueden usarse para representar variables algebraicas o “incógnitas”. Esto es de importancia central para hacer cosas muy diversas en matemáticas con Wolfram Language.
- LeafCount da el número total de átomos en las hojas de un árbol de expresión. ByteCount da el número de bytes necesarios para almacenar dicha expresión.