restart;
y1 := (1/a)-(b/a^2)+x*a*b-x/b:
y2 := a*b+a*x+b*sqrt(x):
K := (ee,x) -> `if`(ee::`+`,select(depends,ee,x),ee):
K( y1, x );
x
x a b - -
b
K( y2, x );
(1/2)
a x + b x
#
# Leave alone an expression which is not a sum of terms.
#
K( sin(x+4)*x^3, x );
3
sin(x + 4) x
#
# Don't select subterms in which `x` is a just dummy name.
#
K( x^3 + sin(x) + Int(sqrt(x), x=a..b), x );
3
x + sin(x)
[отредактировано]
y1 := (1/a)-(b/a^2)+x*a*b-x/b;
1 b x
y1 := - - -- + x a b - -
a 2 b
a
op(3,y1);
x a b
depends(op(3,y1), x);
true
Команда select
отображает свой первый аргумент на все операнды своего второго аргумента.
select( s->depends(s,x), y1 );
x
x a b - -
b
Более краткий синтаксис,где select
отображает свой первый аргумент depends
на операнды своего второго аргумента и передает свой третий аргумент в качестве дополнительных параметров (селектору).
select( depends, y1, x );
x
x a b - -
b
Теперь создайте процедуру, чтобы сделать это.Используйте условный тест, чтобы он возвращал сам первый аргумент всякий раз, когда это не сумма терминов.
K1 := proc(ee, x)
if type(ee,`+`) then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K1( y1, x);
x
x a b - -
b
Использование более краткого синтаксиса для этой проверки типов.
K2 := proc(ee, x)
if ee::`+` then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K2( y1, x);
x
x a b - -
b
Использование более краткого синтаксиса для этого if..then..end if.Это так называемая операторная форма if
.Слово if
находится внутри кавычек, чтобы отличить его от ключевого слова языка в if ... then ... end if.
K3 := proc(ee, x)
`if`( ee::`+` , select( depends, ee, x ), x );
end proc:
K3( y1, x);
x
x a b - -
b
Поскольку тело процедуры K3 имеет толькоодно утверждение, то мы можем сделать его более кратким, используя так называемую форму оператора.
K4 := (ee, x) -> `if`( ee::`+` , select( depends, ee, x ), x ):
K4( y1, x);
x
x a b - -
b