Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 80 из 135)

Таблицы имеют специальные правила вычисления (подобно процедурам) такие, что если имя T было присвоено таблице, то type(T, 'symbol') = true и type(eval(T), 'table') = true. Вызов op(T) либо op(1, T) возвращает фактическую структуру таблицы Т и op(op(T)) либо op(2, eval(T)) возвращает компоненты таблицы в составе функции индексации (если существует) и списка уравнений для значений таблицы, как это иллюстрирут следующий весьма простой фрагмент:

> T:=table([x=a, y=b, z=c]): type(T, 'symbol'), type(eval(T), 'table'), whattype(T), whattype(eval(T)); ⇒ true, true, symbol, table

> op(T), op(1, T); ⇒ table([z = c, y = b, x = a]), table([z = c, y = b, x = a])

> op(op(T)), op(2, eval(T)); ⇒ [z = c, y = b, x = a], [z = c, y = b, x = a]

Функция indices(T) возвращает входы таблицы Т, тогда как функция entries(T) – ее выходы. В то же время формат возврата не всегда удобен для его последующего использования. Поэтому второй пример нижеследующего фрагмента приводит более приемлемый формат, в котором между обоими возвращаемыми списками имеет место взаимно-однозначное соответствие:

> indices = indices(T), entries = entries(T); ⇒ indices = ([z], [y], [x]), entries = ([c], [b], [a]) > indices = map(op, [indices(T)]), entries = map(op, [entries(T)]); indices = [z, y, x], entries = [c, b, a]

Табличная структура – одна из наиболее используемых пакетом. Она используется не только для вычислений, но и для хранения процедур при организации, например, пакетных модулей. Следующий несложный фрагмент иллюстрирует организацию пакетного модуля на основе табличной структуры:

ST := table([Sr = ( ) → `+`nargs(args) ,

Dis = ( ) →

])

> with(ST), 6*ST[Sr](64, 59, 39, 44, 10, 17), 6*ST[Dis](64, 59, 39, 44, 10, 17);

[Dis Sr, ], 233, 14249

> UpLib("C:\Program Files\Maple 8\Llib\UserLib", [ST]); Warning, Library update has been done!

> restart; ST:- Sr(64, 59, 39, 44, 10, 17), ST:- Dis(64, 59, 39, 44, 10, 17); Error, `ST` does not evaluate to a module

> ParProc(ST);

Error, (in ParProc) <ST> is not a procedure and not a module

> with(ST), 6*ST[Sr](64, 59, 39, 44, 10, 17), 6*ST[Dis](64, 59, 39, 44, 10, 17);

[Dis Sr, ], 233, 14249

> type(ST, 'package'), whattype(ST), whattype(eval(ST)), M_Type(ST);

true, symbol, table, Tab

В приведенном фрагменте в табличную ST-структуру погружаются две простые процедуры. Вызов with(ST) для которой возвращает список находящихся в ней процедур, тогда как индексированные вызовы этих процедур на кортежах фактических аргументов возвращают искомые результаты – их среднюю и дисперсию. После чего процедура UpLib [41] сохраняет ST-таблицу в библиотеке пользователя UserLib, которая логически сцеплена с главной библиотекой Maple. После выполнения restart-предложения делается попытка обратиться к сохраненной таблице аналогично модуля, что вызывает соответствующую ошибочную ситуацию. Ошибку вызывает и процедура ParProc(ST) [103], тестирующая параметры процедур, программных и пакетных модулей. Тогда как индексированный вызов дает корректные результаты. Наконец, сохраненная ST-таблица распознается как пакет

(пакетный модуль в нашей терминологии {табличной организации}) и таблица, а также процедурой M_Type(ST) [103,109] как пакет табличной организации. Следует отметить, например, что Maple 8 содержит 34 пакета табличной организации, Maple 9 – 23, а вот уже Maple 10 только 16. Статистика говорит о снижении количества пакетов табличной организации с ростом номера релиза Maple. Между тем, они все еще играют весьма существенную роль, о чем говорит следующий пример:

> map(M_Type, [Slode, context, plots, simplex, student, tensor, DEtools, diffalg, LREtools,

PDEtools, algcurves, orthopoly, combstruct, difforms, inttrans, networks]); # Maple 10

[Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab, Tab]

Обсуждение причин такого явление не входит в задачи данной книги. Заинтересованный же читатель может обратиться к нашим книгам [41,42,45,46,103]. Для работы с выражениями типов {list, table, set} Maple-язык располагает целым рядом средств, основные из которых были представлены либо упомянуты в настоящем разделе. Ряд достаточно полезных средств для обработки такого типа выражений представляет и наша Библиотека [103], демо-версию которой и саму Библиотеку можно загрузить с адресов [108,109].

Так, глава 6 [103] представляет средства, расширяющие возможности Maple-языка при работе с объектами типов {list, set, table}. Списочные структуры играют чрезвычайно важную роль, определяя упорядоченные последовательности элементов. Начиная с Maple 6, появилась возможность существенного расширения операций со списочными структурами. В качестве примера, имеющего интересные практические приложения, мы рассматриваем определение алгебры на множестве всех списков, имеющих одну и ту же длину. Алгебраические операции над списками обеспечивают соответствующие процедуры. Ряд процедур главы поддерживает полезные виды обработки типа: специальное преобразование списков в множества, и наоборот, операции с разреженными списками, динамические присваивания значений элементам списка или множества, оценка входов таблицы по ее выходу, представление специального типа таблиц, специальные виды исчерпывающих подстановок в списки или множества, целый ряд важных видов сортировки вложенных списков, и много других. Данные инструментальные средства оказались достаточно полезными при работе с объектами вышеупомянутых типов в среде Maple.

5.3. Алгебраические правила подстановок для символьных вычислений

Для решения задач символьной обработки, имеющих дело с формальными системами подстановок, Maple-язык располагает средствами обеспечения работы с алгебраическими правилами подстановок. Данные средства представляют основной аппарат при исследованиях формальных систем обработки слов в конечных алфавитах и абстрактных моделей вычислений. Основным понятием здесь является правило подстановки, определяемое группой функций subs, subsop и процедур algsubs, asubs.

По первой уже рассматриваемой функции subs({x = a|<УР>}, V) производится подстановка a-выражения вместо каждого вхождения х-выражения в V-выражение или одновременная подстановка правых частей уравнений (УР), заданных списком/множеством, вместо всех вхождений в V-выражение соответствующих им левых частей уравнений. При этом, по subs-функции делаются подстановки лишь для вхождений левых частей уравнений (правил подстановки) в качестве операндов V-выражения. Такого типа подстановки носят своего рода синтаксический характер, глубоко не затрагивая структуры V-выражения. Результатом подстановки не является вычисление и при необходимости выполнения полного вычисления результата подстановки требуется применение eval-функции, как показано на фрагменте, представленном несколько ниже.

Для возможности обеспечения выборочных подстановок служит специальная subsop(n1 = V1, n2=V2, ...., np=Vp, W)-функция, по которой производится замена на правые Vj-части уравнений операндов W-выражения, определяемых их nj-номерами. При этом, в качестве левых nj-частей допустимо использование списков целочисленных выражений, определяя подоперанды W-выражения в порядке понижения их уровней вложенности. Целочисленные значения должны находиться в диапазоне [-nops(), nops(W)], а нуль-значение допустимо только для функций, индексированных выражений и рядов. В случае nj отрицательного номер полагается равным nops(W) + nj + 1.

По процедуре asubs(∑ = V, W {, x|, x, always|, always}) производится подстановка в Wвыражение аналогично случаю subs-функции, однако она носит скорее алгебраический, чем синтаксический характер, допуская в качестве левой ∑-части уравнения (правила подстановки) использование сумм операндов полиномиального типа, замещающих соответствующие им суммы в исходном W-выражении. При этом, замена сумм производится только в том случае, если левая ∑-часть правила подстановки и соответствующее ей подвыражение W-выражения являются развернутыми полиномами по ведущей х-переменной. Необязательная always-опция позволяет представлять каждое заменяемое П-подвыражение W-выражения в виде П-∑+V. Аналогично рассмотренному выше случаю subs-функции результатом подстановки на основе asubs-процедуры не является вычисление и при необходимости выполнения полного вычисления результата подстановки требуется применение eval-функции, как это проиллюстрировано в нижеследующем фрагменте.

Наконец, по процедуре algsubs(a=b, V {, x|, x, <Опция>}) производится алгебраическая подстановка b-подвыражения вместо каждого вхождения a-подвыражения в V-выражение. В данном отношении algsubs-процедура является обобщением вышерассмотренной subsфункции, осуществляющей синтаксического характера подстановки. Расширенные возможности первой функции относительно второй хорошо иллюстрируют примеры нижеследующего фрагмента. Более того, в отличие от subs-функции, процедура algsubs выполняет подстановку в V-выражение рекурсивно, не делая подстановок внутри индексированных подвыражений. Между тем, она также перед подстановкой не производит раскрытия степеней и произведений, что требует в ряде случаев предварительного применения к V-выражению expand-функции.

В случае выполнения подстановок в W-выражение от нескольких ведущих переменных возможно появление неопределенностей, связанных с неоднозначностью толкования правила применения подстановки. Для устранения подобных ситуаций при проведении подстановок в W-выражение используются необязательные третий и четвертый аргументы algsubs-процедуры. Прежде всего, третий х-аргумент функции, кодируемый в виде списка, устанавливает порядок ведущих переменных, определяющий сам режим подстановки. При отсутствии данного аргумента порядок переменных устанавливается на основе правила подстановки, заданного первым фактическим аргументом функции. Совместно с третьим аргументом может использоваться и опция, допускающая два значения: remainder (по умолчанию) и exact, определяющие режим выполнения подстановки в обрабатываемое W-выражение. В частности, при отсутствии четвертого аргумента в результате подстановки в рациональное W-выражение вычисляется обобщенный остаток. Тогда как по exact-опции в случае, если в правиле подстановки a=b левая ее a-часть является суммой термов, то подстановка производится только тогда, когда a-часть является точным делителем замещаемого ею подвыражения в W-выражении.