Pattern Matching

_ o Blank[]			es un objeto patrón que casa concualquier expresion de Mathematica
_h o  Blank[h]			casa con cualquiere expresión con cabecera h
__ o BlankSequence[] 	es un objeto  patrón que casa con cualquier secuencia de una o más expresiónes Matehematica  
__h o BlankSequencFace[h] 	casa con cualquier secuencia de una o más expresiónes Matehematica  
MatchQ[expr, form]		 regresa verdadero si el patrón form casa con la expresión expr,  y falso en caso contrario 
Cases[list, form]		Regresa los elementos en list  que casan con form

Por ejemplo en la siguiente función

f[x_]:=(x+1)^3

el símbolo _ hace referencia a un patrón y la letra x utiliza como referencia al patrón casado

{f[1],f[a+b+c]}

en el primer caso el patrón casa con 1 y en el segúndo con la expresión a+b+c.

Una expresión que cas con cualquier patrón

MatchQ[expresion[general],_]

MatchQ[F+G[X]-X^2+E,_]

que casa solo con un símbolo

MatchQ[expresion,_Symbol]

Head[expresion]

MatchQ[1,_Symbol]

Head[1]

con un entero

MatchQ[1,_Integer]

con un real

MatchQ[3,_Real]

MatchQ[3.0,_Real]

que regresa el siguente MatchQ

MatchQ[N[E],_Real]

q=E

Head[e]

explique que paso

Una expresión que casa con una lista

MatchQ[{1,3},_List]

Head[{1,3}]

MatchQ[a,_List]

Definición de la función factorial sólo para enteros

Fac[n_Integer]:=Block[{fac},
fac[1]:=1;
fac[x_]:=x fac[x-1];
fac[n]		
]

Fac[10]

Fac[10.0]

Una función que con cualquier número de argumentos, siempre que éste sea mayor que cero

Longitud[x__]:=Length[{x}]

Longitud[1,3,4,5,7]

Longitud[{1,2}]

Longitud[]

Para definir una función que opera sólo sobre una secuancia de argumentos enteros

exp[x_Symbol,p__Integer]:=x^{p}

exp[a,1,3,4,5]

exp[a,1.0,3,4,5]

exp[x,1,1,3,4.0]

probar si una expresión es la suma de dos  o mas elementos

MatchQ[(x-1)(1 + 2 x + 3 x^2),Plus[_,__]]

(x-1)(1 + 2 x + 3 x^2)

ahora probar con

Expand[(x-1)(1 + 2 x + 3 x^2)]

MatchQ[Expand[(x-1)(1 + 2 x + 3 x^2)],Plus[_,__]]

MatchQ[a+b-c+d,Plus[_,__]]

Times[a,-1]

¿Como probar si es la suma de dos o más Símbolos?
¿Como probar si es la suma de dos o más Listas?

Algunos ejemplos de patrones

f[n_]		f con cualquier argumento, referenciado como n
f[n_,m_]	f con dos argumentos, referenciado comos n y m
x^n_	          x a cualquier potencia, con potencia referenciada como n
a_+b_		la suma de dos expresiones argumento
{a1_,a2_}       una lista de dos expresiones
f[n_,n_]	una función con dos argumentos identicos

Con esto se pueden construir patrones con practicamente cualquier estructura

g[{a,b},c]+g[c]/.g[{x_,y_}]->z[x+y]

se reemplaza en la expreisón todas las ocurrencias de g donde su argumento sea una lista de dos elementos

Puede ayudar simplificar algunas operaciónes con listas, por ejemplo imagine una situación de una función que recibe siempre una lista , y la función  debe calcular la suma de los dos elementos.
Una posible solución sería

s[x_]:=x[[1]]+x[[2]];

s[{1,-2}]

una solución más elegante sería

s1[{x1_,x2_}]:=x1+x2;

s1[{1,-2}]

En Mathematica los patrones son una clase de expresiones con una estructura determinada. Un patrón casa con una expresión sólo si está tiene la misa estructura que éste, en tal situación siempre es posible obtener la expresión llenado las ocurrencias de Blank en la expresión. Por ejemplo, el patrón (1+x_)^2 casa con la expresión (1+a)^2 (reemplazar _ por a) o (1+(x-2)^4)^2 reemplazar _ por (x-2)^4. Pero no 1+2a+a^2 . Aún cuando la última expresión es equivalente mátematicamente a (1+a)^2 no tienes la misma estructura del patrón

MatchQ[(1+a)^2,(1+x_)^2]

MatchQ[(1+(x-2)^4)^2,(1+x_)^2]

Expand[(1+(x-2)^4)^2]

MatchQ[Expand[(1+(x-2)^4)^2],(1+x_)^2]

Explique es resultado de la siguiente evaluación

MatchQ[(1-x)^2,(1+x_)^2]

(1+Times[x,-1])^2

Escriba una regla de transformación que convierta la expresión :
g[a+b]+g[c+a]+g[b+d] en la expresión g[b+d]+p[b,a]

g[a+b]+g[c+a]+g[b+d]/.g[a+x_]+g[c+y_]->p[x,y]

Cases

Cases[{e1,e2,..,en}, form]		Regresa una lista de los elementos ei  que casan con form
Cases[{e1,e2,..,en}, form->rhs]	Regresa una lista de valores  de rhs  correspondientes a los ei que casan con form
Cases[{expr, form,level]		Regresa una lista de todas las parte de  expr en los niveles leves  que casan con form
Cases[{expr, form->rhs, level]	Regresa los valores rhs  en los  que casan con form
Cases[{e1,e2,..,en}, form->rhs]	Regresa una lista de valores  de rhs  correspondientes a los ei que casan con form
Cases[{expt, form,level]		Regresa las primeras n  partes de  expr  que casan con form

Obtener los elementos que son enteros de una lista

Cases[{1,1,g[a],2,3,z,g[8],9,g[10],-1},_Integer]

Lo mismo con  Select

Select[{1,1,g[a],2,3,z,g[8],9,g[10],-1},MatchQ[#,_Integer]&]

Los elementos no enteros

Cases[{1,1,g[a],2,3,z,g[8],9,g[10],-1},Except[_Integer]]

Regresar el valor de x en cada ocurrencia de g[x_]

Cases[{1,1,g[a],2,3,z,g[8],9,g[10],g[h[x]],g[{1,2},h],-1,g[]},g[x__]->x]

lo mismo pero con una expresión

Cases[x+g[x]+g[z]+g[-1]+6+ g[{1,2}],g[x_]->x]

de una expresión polinomial obtener solo  exponente de cada termino. Por ejemplo para x+(z-1)^2+y^4+t^3 obtener {z-1,y,-t}

Cases[x+(z-1)^2+y^4+t^3 ,(x_)^y_->x]