Для того чтобы понять идеологию Maple, рассмотрим представление данных. Типичными объектами Maple являются выражения, имеющие структуру дерева. Пусть, например, переменной u присвоено следующее выражение:
> u:=(a - b)^3+cos(x)+b*(x+2);
u := (a - b)3 + cos(x) + b (x + 2)
При этом u сопоставляется объект,
который наглядно можно изобразить так:
Функция 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};
Обратите внимание, что Maple устранил
повторы элементов, преобразовав для этого
некоторые из них, и попутно расставил их в
"удобном для себя" порядке.
Над множествами можно производить
обычные теоретико-множественные операции:
объединение ( union ), пересечение ( intersect
), теорекико-множественную разность ( minus
)
> A:= S minus {sin(7), 6, sin(5)}; B:= A union {1, 2}; B intersect {3};
{ }
В отличие от неупорядоченных множеств
списки представляют собой упорядоченные
наборы. Элементы списка заключаются в
квадратные скобки. Приведенные ниже
примеры показывают, как управлять
элементами списка:
> 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);
Обратите внимание, что элементы списка
сами могут иметь сложную структуру (в наших
примерах структуру списка или множества).
> S:= [op(S), 6,e, 5];
Посмотрите, как было произведено
добавление элементов в список с помощью
функции 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);
Последовательности выражений легко
превратить в множества или списки, просто
заключив их в соответствующие скобки:
> 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]);
> 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);
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
Рассмотренные примеры не исчерпывают
всего разнообразия типов объектов 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. Однако программа подтверждает, что данный объект является в то же время положительным нечетным простым числом, а также может быть интерпретирован как комплексное число или многочлен.
Волгоградский
государственный педагогический
университет
Кафедра алгебры, геометрии и информатики