Структура объектов Maple


Для того чтобы понять идеологию Maple, рассмотрим представление данных. Типичными объектами Maple являются выражения, имеющие структуру дерева. Пусть, например, переменной u присвоено следующее выражение:

 > u:=(a - b)^3+cos(x)+b*(x+2);

u := (a - b)3 + cos(x) + b (x + 2)


При этом u сопоставляется объект, который наглядно можно изобразить так:

[Maple Plot]

Функция nops (number of operands) возвращает количество операндов самой внешней операции, участвующей в выражении, являющимся аргументом этой функции. Значения операндов возвращает функция op . Ее первый аргумент задает номер операнда, а второй - выражение, в котором он участвует. Если в качестве первого аргумента взять 0, то функция op вернет тип операции.

> nops(u); op(0, u), op(1, u), op(2, u),op(3, u);

3

+, (a - b)3, cos(x), b (y + 2)

> nops(op(1, u)); op(0, op(1, u)), op(1, op(1, u)), op(2, op(1, u));

2

^, a - b, 3

> nops(op(2,u));op(0,op(2,u)),op(1,op(2,u));

1

cos, x

 


Рассмотрим некоторые другие часто используемые объекты Maple. Для задания множества достаточно перечислить его элементы через запятую, заключив их в фигурные скобки.

> S:= {1, sin(Pi/2), a^2+b^3, 6, sin(7), b^3+a^2, tau};

S := {1, 6, a^2+b^3, tau, sin(7)}


Обратите внимание, что Maple устранил повторы элементов, преобразовав для этого некоторые из них, и попутно расставил их в "удобном для себя" порядке.

Над множествами можно производить обычные теоретико-множественные операции: объединение ( union ), пересечение ( intersect ), теорекико-множественную разность ( minus )

> A:= S minus {sin(7), 6, sin(5)}; B:= A union {1, 2}; B intersect {3};

A := {1, a^2+b^3, tau}

B := {1, 2, a^2+b^3, tau}

{  }


В отличие от неупорядоченных множеств списки представляют собой упорядоченные наборы. Элементы списка заключаются в квадратные скобки. Приведенные ниже примеры показывают, как управлять элементами списка:

> S:=[a, d, c, a]; a:={1, 2, 3, 1}; S;

S := [{1, 2, 3}, d, c, {1, 2, 3}]

a := {1, 2, 3}

[{1, 2, 3}, d, c, {1, 2, 3}]

> S[2]:= [1+x, beta, beta]: op(0, op(2, S)), op(2, S);

list, [1+x, beta, beta]

 

Обратите внимание, что элементы списка сами могут иметь сложную структуру (в наших примерах структуру списка или множества).

> S:= [op(S), 6,e, 5];

S := [{1, 2, 3}, [1+x, beta, beta], c, {1, 2, 3}, 6...


Посмотрите, как было произведено добавление элементов в список с помощью функции op, которая в этом случае имела лишь один аргумент.

С помощью команд remove и select можно удалять элементы списка или наоборот оставлять в нем лишь элементы, удовлетворяющие определенным условиям. Первый аргумент этих функций должен принимать для каждого из элементов списка одно из значений: true или false. Вторым аргументом служит сам обрабатываемый список. Третий, необязательный параметр по сути является аргументом логической функции, служащей первым параметром remove и select, задавая тем самым область истинности соответствующего предиката. В приводимых ниже примерах мы сначала удаляем из списка S все элементы, которые сами являются списками, а затем оставляем в S лишь элементы, являющиеся именами переменных или множествами.

 

> S:= remove(type, S, list);

S := [{1, 2, 3}, c, {1, 2, 3}, 6, e, 5]

> S:= select(type, S, {name, set});

S := [{1, 2, 3}, c, {1, 2, 3}, e]


Используя список в качестве первого аргумента функции op, можно существенно упростить процедуру извлечения глубоко вложенных операндов из выражений Maple:

> restart:op([3,2,1], (a - b)^3+cos(x)+b*(x+2));

x

 Еще одним классом объектов Maple являются последовательности. Их можно задавать: либо просто перечисляя их элементы через запятую (не заключая всего выражения в скобки), либо используя значок последовательности - $ в сочетании с оператором диапазона (он задается указанием границ диапазона, разделенных двумя точками), либо как возвращаемое значение функции seq.

> G:= 1, 3, 4, 5, 4, c, x;

G := 1, 3, 4, 5, 4, c, x

> T:= $ 4..11;

T := 4, 5, 6, 7, 8, 9, 10, 11

> seq((i/3)^3,i=2..5);

8/27, 1, 64/27, 125/27


Последовательности выражений легко превратить в множества или списки, просто заключив их в соответствующие скобки:

> LG:=[G];

LG := [1, 3, 4, 5, 4, c, x]

> SG:={G};

SG := {1, 3, 4, 5, x, c}

 

Разумеется, система, ориентированная на математику, должна уметь оперировать с матрицами:

> A:=matrix(2,3,[1,x,3,4,a+x^3,5]);

A := matrix([[1, x, 3], [4, a+x^3, 5]])

> B:=matrix([[a,b],[c,d]]);

B := matrix([[a, b], [c, d]])


Последний пример показывает, что задавать количество строк и столбцов матрицы можно и неявно, если при перечислении элементов матрицы указать ее структуру. Можно сделать и наоборот - не задавать элементы матрицы, а указать лишь ее размерность:

> C:=matrix(3,3);

C := array(1.. 3,1.. 3,[])

> C[2,1]:=1;

C2, 1 := 1

> evalm(C);

matrix([[C[1,1], C[1,2], C[1,3]], [1, C[2,2], C[2,3...

 

Maple создал объект соответствующей размерности, элементы которого являются индексированными переменными. Однако эта конструкция была идентифицирована программой как массив ( array ). Дело в том, что массив является более общим (чем список и матрица) понятием Maple. Матрица является частным случаем двумерного, а список (и вектор) - одномерного) массива, нумерация индексов которого начинается с единицы.

В общем случае массивы могут иметь любую размерность, а начальные номера индексов быть любыми целыми неотрицательными числами:

> c:= array(1..2, 1..2, 3..4, [[[1,2], [a,b]], [[x,y], [alpha,beta]]]);

c := array(1.. 2, 1.. 2, 3.. 4,[
(1, 1, 3) = 1

(1, 1, 4) = 2
(1, 2, 3) = a
(1, 2, 4) = b

(2, 1, 3) = x
(2, 1, 4) = y
c := ARRAY([1.. 2, 1.. 2, 3.. 4],[(1, 1, 3) = 1,...
c := ARRAY([1.. 2, 1.. 2, 3.. 4],[(1, 1, 3) = 1,...
c := ARRAY([1.. 2, 1.. 2, 3.. 4],[(1, 1, 3) = 1,...

 

Рассмотренные примеры не исчерпывают всего разнообразия типов объектов Maple. Эти объекты могут быть строками (string), таблицами (table), иметь булевский тип (boolean) и т.д. Кроме того, существует огромное количество типов объектов, доступных только после подгрузки специализированных пакетов.

Отметим, что один и тот же объект может принадлежать одновременно к нескольким типам:

> whattype(7);

integer

> type(7, numeric), type(7, odd), type(7, prime), type(7, complex), type(7, positive), type(7, polynom);

true, true, true, true, true, true

 

Мы видим, что на запрос о типе числа 7 Maple вернул integer. Однако программа подтверждает, что данный объект является в то же время положительным нечетным простым числом, а также может быть интерпретирован как комплексное число или многочлен.


Волгоградский государственный педагогический университет
Кафедра алгебры, геометрии и информатики