Это не сложно построить.(Больше мыслей по этому поводу, ниже ...)
restart;
W := (ee,nm::name) -> [op(map(`[]`@op,indets(ee,':-specfunc'(nm))))]:
А теперь, чтобы проверить это,
a1 := sin(1+a/b):
a2 := log(1+ a*b):
a3 := abs(a^2+b):
W( a1, sin );
[[ a]]
[[1 + -]]
[[ b]]
W( a2, ln );
[[a b + 1]]
W( a3, abs );
[[ 2 ]]
[[a + b]]
Теперь немного более длинный пример,
foo := cos(1+a/b)/abs(a^2+b)
+log(1+ a*b)*cos(s-v)
+sin(c+d/r);
/ a\
cos|1 + -|
\ b/ / d\
foo := ---------- + ln(a b + 1) cos(s - v) + sin|c + -|
| 2 | \ r/
|a + b|
W( foo, sin );
[[ d]]
[[c + -]]
[[ r]]
W( foo, cos );
[[ a] ]
[[1 + -], [s - v]]
[[ b] ]
W( foo, abs );
[[ 2 ]]
[[a + b]]
W( foo, ln );
[[a b + 1]]
Не имея другого контекста, по которому я могу судить, я лично предпочитаю, чтобы вышеперечисленные элементы возвращались в списки, чтобы иметь возможность обрабатывать их позже легче.
Но это выглядит еще проще, если не учитывать инкапсулирующие списки.
Y := (ee,nm::name) -> op(map(op,indets(ee,':-specfunc'(nm)))):
Y( foo, cos );
a
1 + -, s - v
b
Теперь несколько мнений.Причина, по которой не существует выделенной команды для выполнения точно , заключается в том, что в аналогичном ключе очень много задач.Язык программирования, который полон сотен различных команд для выполнения слишком похожих задач, может быть неудобным (или даже хуже) для использования.
Для эффективного использования Maple это помогает очень хорошо выучить основные строительные блоки.К ним относятся, по крайней мере, такие вещи, как,
op, map, map[n], zip, select, remove, selectremove,
table, indices, entries, type, indets, subsindets,
normal, radnormal, simplify, evalc, evala, rationalize