41 | Más información sobre los patrones |
Existe todo un sublenguaje de patrones en Wolfram Language. Hasta ahora se han visto ya algunos de sus elementos más importantes.
_ (“guion-bajo”) representa cualquier cosa. x_ (“x guion-bajo”) representa cualquier cosa, pero la denomina x. _h representa cualquier cosa que tenga encabezado h. Y, por último, x_h representa cualquier cosa que tenga encabezado h, y le da el nombre x.
Defina una función cuyo argumento sea un entero llamado n:
In[1]:= |
La función se evalúa cuando el argumento es entero:
In[2]:= |
Out[2]= |
En ocasiones, se desea imponer alguna condición a un patrón. Para esto, se usa /; (“diagonal punto y coma”). n_Integer/;n>0 quiere decir cualquier entero mayor que 0.
De una definición que se aplique solo cuando n>0:
In[3]:= |
La definición dada no se aplica a números negativos:
In[4]:= |
Out[4]= |
El /; puede ponerse donde sea, incluso al final de toda la definición.
Defina diferentes casos para la función check:
In[5]:= |
In[6]:= |
He aquí algunos ejemplos de la función check:
In[7]:= |
Out[7]= |
__ (“doble guion-bajo”) representa cualquier secuencia de uno o más argumentos. ___ (“triple guion-bajo”) representa cero o más.
Defina una función que busque negro y blanco (en ese orden) en una lista.
El patrón coincide con negro seguido de blanco, con cualquier elemento anterior a, entre, o después de ellos:
In[8]:= |
In[9]:= |
Out[9]= |
Por defecto, __ y ___ eligen las coincidencias más cortas que funcionen. Puede usarse Longest para que elijan, en vez de eso, las más largas.
Especifique que la secuencia entre negro y blanco sea lo más larga posible:
In[10]:= |
Ahora, m elige todos los elementos hasta el último blanco:
In[11]:= |
Out[11]= |
x|y|z indica las coincidencias con x, y o z. x.. coincide con cualquier número de repeticiones de x.
bwcut corta, en efecto, la secuencia más larga que contenga solo negro y blanco:
In[12]:= |
In[13]:= |
Out[13]= |
El patrón x_ es, de hecho, la abreviatura de x:_, que significa “coincide con cualquier cosa (o sea, _) y al resultado le llama x”. También se puede usar la notación del tipo x: para patrones más complicados.
Forme un patrón denominado m que coincida con una lista de dos parejas:
In[14]:= |
In[15]:= |
Out[15]= |
Denomine a la secuencia de negro y blanco, de modo que pueda usarse en el resultado:
In[16]:= |
In[17]:= |
Out[17]= |
Como último ejemplo, se usarán patrones para implementar el algoritmo clásico de ciencias de la computación para ordenar una lista, que intercambia repetidamente parejas de elementos sucesivos que estén fuera de orden. No es difícil escribir cada paso del algoritmo como una sustitución para el patrón.
Sustituya los primeros elementos que no estén en orden por los que si lo estén:
In[18]:= |
Out[18]= |
Se repite la misma operación 10 veces, al término de las cuales la lista queda completamente ordenada:
In[19]:= |
Out[19]= |
Al comienzo, no se sabe cuántas iteraciones tardará en completar el ordenamiento de una lista dada. Así pues, lo mejor es usar FixedPointList, que es como NestList, salvo que no es necesario especificar el número de pasos y, en vez de eso, sigue hasta que el resultado llega a un punto fijo, donde ya no hay cambio.
In[20]:= |
Out[20]= |
Se transpone el resultado para ver la lista de los elementos que van apareciendo en primer, segundo, etc., lugares, en los pasos sucesivos:
In[21]:= |
Out[21]= |
ListLinePlot grafica cada lista en color diferente, mostrando como procede el ordenamiento:
In[22]:= |
Out[22]= |
He aquí el resultado para ordenar una lista aleatoria de longitud 20:
In[23]:= |
Out[23]= |
patt/;cond | un patrón que coincide sujeto a una condición | |
___ | un patrón para cualquier secuencia de cero o más elementos (“triple guion-bajo”) | |
patt .. | un patrón para una o más repeticiones de patt | |
Longest[patt] | un patrón que elige la secuencia más larga con la que coincide | |
FixedPointList[f,x] | sigue anidando f hasta que el resultado ya no cambie |
41.1Encuentre la lista de los dígitos de aquellos cuadrados de los números hasta 100 que contengan dígitos sucesivos repetidos. »
41.3Defina una función que pruebe si una lista de enteros es igual a la misma, pero en orden inverso. »
No expected output
Many possible solutions of the form _:=_ or _=_
41.4En el artículo de Wikipedia sobre “alliteration”, encuentre la lista de las parejas de palabras sucesivas cuyas letras iniciales sean idénticas. »
41.5Use Grid para mostrar el proceso de ordenamiento dado en esta sección para {4, 5, 1, 3, 2}, donde los pasos sucesivos se presenten en forma vertical. »
41.6Use ArrayPlot para mostrar el proceso de ordenamiento visto en esta sección para una lista de longitud 50, donde los pasos sucesivos aparezcan en forma horizontal. »
41.7Empezando con 1.0, aplicar repetidamente la función del “método de Newton ”, (#+2/# )/2& hasta que el resultado ya no cambie. »
41.8Implemente el algoritmo de Euclides para el máximo común divisor, donde {a, b} se sustituya repetidamente por {b, Mod[a, b]} hasta que b sea 0, y aplicar el algoritmo a 12345, 54321. »
41.9Defina combinadores usando las reglas s[x_][y_][z_]x[z][y[z]], k[x_][y_]x, y luego generar una lista empezando con s[s][k][s[s[s]][s]][s] y aplicando dichas reglas hasta que no haya cambios. »
41.11Comenzando con {1, 0}, elimine repetidamente los primeros 2 elementos y pegue {0, 1} si el primer elemento es 1, y {1, 0, 0} si es 0, en 200 pasos; obtenga la lista de las longitudes de las secuencias así producidas (sistema de etiquetas). »
41.12Comenzando con {0, 0} y por 200 pasos, elimine repetidamente los primeros 2 elementos y pegue {2, 1} si el primer elemento es 0; {0} si el primer elemento es 1, y {0, 2, 1, 2} si es 2; cree una gráfica con los puntos unidos de las longitudes de las secuencias producidas (sistema de etiquetas). »
¿Qué otras funciones que trabajen con patrones hay en Wolfram Language?
Except[patt] coincide con cualquier cosa, excepto patt. PatternSequence[patt] coincide con una secuencia de argumentos en una función. OrderlessPatternSequence[patt] coincide con dichos argumentos sin importar el orden. f[x_:v] define a v como valor por defecto, así que en f[ ], x se toma como v.
¿Cómo pueden verse todas las formas en que un patrón podría coincidir con una expresión dada?
Use ReplaceList. Replace obtiene la primera coincidencia; ReplaceList obtiene la lista de todas ellas.
En algún momento se detendrá. Existe, además, una opción para fijar qué tan lejos debe llegar. FixedPointList[f, x, n] se detiene después de un máximo de n pasos.
- En el caso de un patrón repetitivo patt.., recuerde que debe dejarse un espacio, por ejemplo, cuando se tiene 0 .. para evitar la confusión con números decimales.
- Las funciones pueden tener atributos que afecten el funcionamiento de la coincidencia de patrones. Por ejemplo, Plus tiene los atributos Flat y Orderless. Flat significa que b+c puede extraerse de a+b+c+d. Orderless significa que los elementos pueden reordenarse, de tal modo que a+c puede sacarse. (Flat es como la propiedad matemática de la asociatividad; Orderless es como la conmutatividad).
- El algoritmo que se ha mostrado para efectuar un ordenamiento se conoce usualmente como ordenamiento de burbuja. Para una lista de longitud n, tomará por lo general alrededor de n^2 pasos. La función nativa de Wolfram Language, Sort, es mucho más rápida y toma apenas un poco más de n pasos.