Selectie op vorm criteria

Tot nog toe was de selectie volledig gebaseerd op positie binnen een lijst of uitdrukking. Dikwijls wil men echter delen van uitdrukkingen zoeken die voldoen aan bepaalde criteria.

Stel dat men enkel geinteresseerd is in de termen die x bevatten in de volgende uitdrukking.

> Expr1 := a*x + b*x^2 + c*x*y + d*y^3 + e;

[Maple Math]

> select(has,Expr1,x);

[Maple Math]

De functie 'has' met argument x wordt als criterium gebruikt.

> has(a*x,x);

[Maple Math]

> has(d*y^3,x);

[Maple Math]

De functie 'depends' werkt analoog:

> depends(a*x + b,x);

[Maple Math]

> depends(Int(f(x),x=a..b),x);

[Maple Math]

Het volgende voorbeeld illustreert het verschil tussen 'depends' en 'has' en toont aan dat 'depends' erg nuttig kan zijn.

> Expr2 := a*x + Int(f(x),x=-y..y) + g(x) + c;

[Maple Math]

> select(has,Expr2,x);

[Maple Math]

> select(depends,Expr2,x);

[Maple Math]

Dit zijn slechts enkele specifieke toepassingen van een meer algemeen concept: pattern matching.

> Expr1 := 'Expr1': Expr2 := 'Expr2':

Een uitdrukking kan gezien worden als een pattern, bv.

> Expr := a*x + b;

[Maple Math]

Dit kan gezien worden als 'term + term'.

> patmatch(Expr,A::nonunit(algebraic) + B::nonunit(algebraic),'Matched');
Matched;

[Maple Math]

[Maple Math]

Het pattern 'A::nonunit(algebraic) + B::nonunit(algebraic)' geeft precies dit weer. De variabelen A en B zullen de eerste en tweede term bevatten. De functie 'nonunit' geeft aan dat geen van beide termen leeg mag zijn, worden deze weggelaten in het pattern, dan bekomt men niet het gewenste resultaat.

> patmatch(Expr,A::algebraic + B::algebraic,'Matched'); Matched;

[Maple Math]

[Maple Math]

Uiteraard kan een uitdrukking met meerdere patterns overeenstemmen. De uitdrukking in het voorbeeld kan ook gezien worden als 'factor*factor + term'.

> patmatch(
Expr,
A::nonunit(algebraic)*B::nonunit(algebraic) +
C::nonunit(algebraic),
'Matched');
Matched;

[Maple Math]

[Maple Math]

Beschouw nu het volgende, meer ingewikkelde voorbeeld:

> Expr2 := 12*a*b*x^3 + 13*c*x^2 - 3*d*x + 7*e + 21*f*x*y +
2*g*x^2*y^2 + h*x*y^2 + i*x^3*y^3 + 11*j*y^2;

[Maple Math]

Stel dat men enkel geinteresseerd is in de termen in x tot en met tweede graad. Deze kunnen geselecteerd worden met behulp van 'select' en 'patmatch'.

> select(
t -> patmatch(
t,
conditional(A::freeof(x)*x^N::integer,N <= 2)),
Expr2) +
select(t -> patmatch(t,A::freeof(x)),Expr2);

[Maple Math]

Het eerste 'select' statement geeft alle termen die x bevatten met graad kleiner dan of gelijk aan twee, het tweede geeft de term die x niet bevat. De som levert de gewenste polynoom. In plaats van een eenvoudig pattern werd in het eerste 'patmatch' statement een 'conditional' gebruikt. Dit laat toe bijkomende voorwaarden te specificeren waaraan de patterns moeten voldoen, in dit geval dat de exponent N kleiner dan of gelijk aan 2 moet zijn.

Er werd tweemaal gebruik gemaakt van een lambda functie 't -> patmatch(t,...)' omdat patmatch voor elk van de termen afzonderlijk geevalueerd moet worden. Het argument van 'patmatch' moet dus een variabele zijn.

> select(
t -> patmatch(
t,
conditional(
A::freeof({x,y})*x^M::integer*y^N::integer,
M + N <= 2)),
Expr2) +
select(
t -> patmatch(
t,
conditional(
A::freeof({x,y})*x^M::integer,
M <= 2)),
Expr2) +
select(
t -> patmatch(
t,
conditional(
A::freeof({x,y})*y^M::integer,
M <= 2)),
Expr2) +
select(t -> patmatch(t,A::freeof({x,y})),Expr2);

[Maple Math]

Uiteraard is het in dit geval veel eenvoudiger gebruik te maken van een Taylor expansie in meerdere veranderlijken.

> readlib(mtaylor):

> mtaylor(Expr2,[x = 0,y = 0],3);

[Maple Math]