如何知道哪个 Maple 命令自动映射到列表条目?

How to know which Maple command automatically maps on list entries or not?

在 Mathematica 中,几乎所有命令都会自动串接(或映射)列表。

在 Maple 中,如何确定哪个命令自动作用于列表或集合的条目?

例如:

y+p*x=2*sqrt(x*y);
r:=[solve(%,y)];

这给出了两个条目的列表(解决方案)

#r := [-p*x+(2*(1+sqrt(1-p)))*x, -p*x+(2*(1-sqrt(1-p)))*x]

现在我发现 collect 自动映射到每个列表条目

collect(r,x);
   #   [(-p+2+2*sqrt(1-p))*x, (-p+2-2*sqrt(1-p))*x]

但是另一个命令没有(我刚选了这个)

 MmaTranslator[Mma][LeafCount](r);
        #37

对于上述需要显式迭代列表或集合的条目。

 map(MmaTranslator[Mma][LeafCount],r)
             #[17, 19]

在 Maple 中有没有一种方法可以找到哪个命令自动遍历列表或集合的条目而不是反复试验?

枫叶2018.1

我不知道文档中有什么地方准确说明了哪些命令会自动映射到列表中。

但是这样的命令集合并不多。绝大多数命令不会自动映射到列表上。在列表上自动映射的大多数与表达式的简化或相关操作有关。自动映射到列表的命令集合至少包含这些:

collect, combine, expand,
evala, evalc, evalf,
factor, normal, radnormal, rationalize, simplify

这些命令的列表自动映射主要是为了提供比使用 map 命令显式包装更短的语法。

也有保留结构的命令(除非明确 通过选项告诉外部列表结构是要改变的东西)因此通常对列表完成与映射到列表相同的事情:

convert, eval, evalindets, subs, subsindets

现代 Maple 有另一种更短的语法,可以将命令映射到列表(或集合,或矢量等)上。它称为 "elementwise" 操作,其语法包括在命令后附加 ~(波浪号)。

例如,

discont~( [ csc(x), sec(x) ], x );

     [{Pi _Z1~}, {Pi _Z2~ + 1/2 Pi}]

就您的其他示例而言,请注意 LeafCount 为被视为单个 表达式 的第一个参数计算值(度量)。但是项目列表仍然是单个 表达式 。因此,毫无疑问(没有 ~)它作为一个整体作用于列表,而不是自动映射到它上面。它将封闭列表计为附加 "leaf".

MmaTranslator:-Mma:-LeafCount( L0 );

                   8

L0 := [ sin(x), 1/2*x*cos(x) ]:

MmaTranslator:-Mma:-LeafCount~( L0 );

                 [2, 5]

map( MmaTranslator:-Mma:-LeafCount, L0 );

                 [2, 5]

对于与您的原始示例类似的示例,应用 collect(自动映射)和使用 collect~ 逐元素应用没有区别。在这里,前两个结果相同,因为附加参数 x 恰好是一个标量。例如,

r := [p*x+(2*(x^2+p^2))*x, p*x+(2*(x^2-p^2))*x]:

collect(r, x);

         3       2            3        2
     [2 x  + (2 p  + p) x, 2 x  + (-2 p  + p) x]

collect~(r, x);

         3       2            3        2
     [2 x  + (2 p  + p) x, 2 x  + (-2 p  + p) x]

map(collect, r, x);

         3       2            3        2
     [2 x  + (2 p  + p) x, 2 x  + (-2 p  + p) x]

我应该提一下,如果第二个参数是一个列表,比如 [x,p] 而不是一个标量,比如 x.

,上面的例子会有不同的表现
s := [a*b+(2*(a^2*b+b^2))*a, a*b+(2*(a^2*b-b^2))*a]:

collect(s, [a,b]);

           3       2              3        2
     [2 b a  + (2 b  + b) a, 2 b a  + (-2 b  + b) a]

map(collect, s, [a,b]);

           3       2              3        2
     [2 b a  + (2 b  + b) a, 2 b a  + (-2 b  + b) a]

collect~(s, [a,b]);

           3       2               2       3
     [2 b a  + (2 b  + b) a, -2 a b  + (2 a  + a) b]

zip(collect, s, [a,b]);

           3       2               2       3
     [2 b a  + (2 b  + b) a, -2 a b  + (2 a  + a) b]

在上面,当第二个参数也是一个列表时,elementiwise collect~ 示例的行为类似于 zip。也就是说,第一个参数中的第一项收集到第二个参数中的第一项,并且第一个参数中的第二项收集到第二个参数中的第二项。

按元素运算符语法的另一个特点是它不会将命令映射到标量表达式的操作数(即不是列表、集合、向量等) .这与 map 形成鲜明对比,后者可用于将操作映射到表达式的操作数。

这里有两个示例,其中 map 将命令应用于标量表达式的操作数,而使用 elementwise ~ 则仅将命令应用于标量表达式本身。在第一个示例中,操作数是项之和的加数。在第二个示例中,操作数是未计算的函数调用的参数。

T := x^2 * sin(x) + y^2 * cos(x):

F( T );

             2           2
          F(x  sin(x) + y  cos(x))

F~( T );

             2           2
          F(x  sin(x) + y  cos(x))

map( F, T );

            2              2
         F(x  sin(x)) + F(y  cos(x))

G( arctan(a, b) );

               G(arctan(a, b))

G~( arctan(a, b) );

               G(arctan(a, b))

map( G, arctan(a, b) );

              arctan(G(a), G(b))

因此,如果您不想无意中将命令映射到标量表达式的操作数(加数、被乘数等),那么您可以使用元素 ~ 语法,而无需先测试是否第一个表达式是标量或列表(等)。

同样,如果有一个附加参数,那么它是否是列表的标量会有所不同。

F( T, a );

              F(sin(x) + cos(x), a)

F~( T, a );

              F(sin(x) + cos(x), a)

map( F, T, a );

            F(sin(x), a) + F(cos(x), a)

F( T, [a,b] );

             F(sin(x) + cos(x), [a, b])

map( F, T, [a,b] );

        F(sin(x), [a, b]) + F(cos(x), [a, b])

F~( T, [a,b] );

    [F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]

zip( F, T, [a,b] );

    [F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]