Процедура составляет лишь ядро, обеспечивающее генерацию последовательностей КФ, которое, в свою очередь может быть расширено другими интересными функциями по исследованию динамики историй таких конечных конфигураций в зависимости от начальной КФ, глобальной функции перехода и т.д. В качестве весьма полезного упражнения читателю рекомендуется разобраться в организации процедуры HS_1, использующей ряд полезных приемов. Процедура использует две наши нестандартные процедуры belong и `convert/set1` из Библиотеки [103], с которыми можно ознакомиться в демоверсии дибо в самой библиотеке, доступными по адресам, указанным в [41,108,109].
convert/set1 := proc(expr::anything) local a k j L, , , , ω ψ, ; assign(ω = (a → `if`(type(a, 'equation'), rhs(a), a)), ψ = (a → `if`(type(a, 'numeric'), ,a Evalf(a)))); if type(expr, 'Vector') then map(ω, {op(op 2,( expr))}) elif type(expr, 'Matrix') then {seq([seq(expr[j k, ], k = 1 .. op 1,( expr)[2])], j = 1 .. op 1,( expr )[1])} elif type(expr, 'Array') then {seq [( seq(expr[j k, ], k = 1 .. rhs(op 2,( expr )[2]))], j = 1 .. rhs(op 2,( expr)[1]))} elif type(expr, {'list', 'set'}) then {op(expr)} elif ttable(expr) then {op(came(convert(eval(expr ), 'string')[7 .. -2]))} elif type(expr, 'vector') then {seq(expr k[ ], k = 1 .. rhs(op 2,( eval(expr ))))} elif type(expr, 'array') then {seq( [seq(expr[j k, ], k = 1 .. rhs(op 2,( eval(expr))[2]))], j = 1 .. rhs(op 2,( eval(expr))[1]))} elif type(expr, 'range'('realnum')) then {op([ assign(L = [seq(k, k = ψ(lhs(expr)) .. ψ(rhs(expr)))]), `if`(belong(ψ(rhs(expr)), L), L, [op(L), ψ(rhs(expr))])])} elif type(eval(expr), {'symbol', 'string'}) then {op [( assign(' 'a = cat "",( expr)), seq(convert(k, whattype(expr)), k = a)])} elif type(expr, 'procedure') then try convert(convert(expr CompSeq, ), 'set') catch "" {: seq(op(k, eval(expr)), k = 1 .. 8)} end try elif type(expr `module` , ) then convert(parmod(expr ), 'set') else {expr} end if end proc > V:= Vector([a, b, c, d, e, f, h]): V1:=Vector[row]([a, b, c, d, e, f, h]): V, V1: > convert(V, 'set1'), convert(V1, 'set1'); ⇒ {f, a, b, c, d, e, h}, {f, a, b, c, d, e, h} |
Если не определено противного, то Maple выводит результаты вычисления выражений в нотации и формате, стандартных для Output-параграфа. Однако по целому ряду причин, особенно при необходимости последующего использования результатов вычислений в среде других ПС (системы программирования C, C++, Fortran и др.) либо при подготовке материала к публикации принятыми издательскими системами (например, TeXпроцессором для математических изданий), требуется переформатирование полученных в среде пакета результатов либо изменения нотации представления самих числовых значений. Для этих целей язык располагает рядом специальных форматирующих функций, рассматриваемых в настоящем разделе. Ниже предполагается, что говоря о B-выражении (как основном аргументе P-функции вывода), будем иметь в виду, что вызов P(B) вычисляет, при необходимости, B-выражение и форматирует именно результат этого вычисления, а не само выражение, за исключением случаев, когда B-выражение само является результатом вычисления либо невычисляемо.
Основной функцией вывода и форматирования результатов вычисления выражений является print-функция, имеющая следующий простой формат кодирования:
print(<Выражение_1>, <Выражение_2>, ..., <Выражение_n>)
где в качестве “Выражения_j” может выступать произвольное Maple-выражение. Функция вычисляет все передаваемые ей фактические выражения в качестве элементов последовательности-аргумента, выводит на печать их значения в требуемом формате и в случае успешного завершения возвращает NULL-значение. По вызову функции print() выводится пустая строка. Элементы выводимой последовательности значений разделяются запятой. Управление форматом вывода осуществляет prettyplot-параметр interface-процедуры, рассмотренной выше. В зависимости от значения параметра prettyprint определяется следующий формат вывода результатов вычисления последовательности выражений, определенной в качестве ее аргумента (табл. 13).
Таблица 13
prettyprint= | Формат вывода Maple-выражений: |
0 | линейный входной Maple-формат (аналогично lprint) |
1 | двумерный символьно-ориентированный Maple-формат |
2 | двумерный выходной Maple-формат |
3 | двумерный выходной Maple-формат редактирования |
Во всех случаях в качестве разделителя выводимых по print-функции значений принимается символ запятой (,). По установке prettyprint = 1 производится вывод в двумерном символьно-ориентированном Maple-формате. По установке prettyprint = 2 формат вывода соответствует формату Output-параграфа, а по установке prettyprint = 3 (по умолчанию) поддерживается также режим редактирования результата. В случае вывода больших выражений для удобства используются %-метки, обозначающие отдельные кратные подвыражения выходного выражения. Режим формирования %-меток задается установками {labeling, labelwidth}-параметров процедуры interface. При выводе содержимого массивов, таблиц, процедур и операторов в print-функции следует указывать только их идентификаторы без индексирования.
Действие lprint-функции, имеющей тот же формат кодирования, что и print-функция, аналогично действию второй, как если бы для нее была определена установка prettyprint = 0 для процедуры interface. Следующий фрагмент иллюстрирует вышесказанное:
> interface(prettyprint = 0): print(sqrt(Art^2 + Kr^2), (S + A)/(V + G), Art/Kr); (Art^2+Kr^2)^(1/2), (S+A)/(V+G), Art/Kr > interface(prettyprint = 1): print(sqrt(Art^2 + Kr^2), (S + A)/(V + G), Art/Kr); 2 2 1/2 S + A Art (Art + Kr ) , --------, ----- V + G Kr > interface(prettyprint = 2): print(sqrt(Art^2 + Kr^2), (S + A)/(V + G), Art/Kr); Art2 + Kr2, S + A , Art V + G Kr > interface(prettyprint = 3): print(sqrt(Art^2 + Kr^2), (S + A)/(V + G), Art/Kr); Art2 + Kr2, S + A , ArtV + G Kr > x:= sqrt(a + Pi*b): y:= exp(x)*h - (S + A)/(V + G): z:= (a + b*gamma)/(c + d*I)^(Art + Kr): > W:= array(1..2, 1..2, [[Art, V], [G, Kr]]): interface(prettyprint = 2): print(W, z), lprint(W, z); ArtG KrV , (c + ad I + )b(Artγ + Kr)W, (a+b*gamma)/((c+I*d)^(Art+Kr)) > interface(prettyprint = 2); print(x, y, zx), lprint(x, y, z); a + π b, e( a + π b ) h − S + A , zxV + G (a+Pi*b)^(1/2), exp((a+Pi*b)^(1/2))*h-(S+A)/(V+G), (a+b*gamma)/((c+I*d)^(Art+Kr)) > L:= [17, Art, Kr, 10, Sv, 39, Arn, 44, Agn, 59, Avz, 64]: print(L, L, L); lprint(L, L, L); %1, %1, %1 %1 := [17, Art, Kr, 10, Sv, 39, Arn, 44, Agn, 59, Avz, 64] [17, Art, Kr, 10, Sv, 39, Arn, 44, Agn, 59, Avz, 64], [17, Art, Kr, 10, Sv, 39, Arn, 44, Agn, 59, Avz, 64], [17, Art, Kr, 10, Sv, 39, Arn, 44, Agn, 59, Avz, 64] > print(sqrt), lprint(sqrt); proc(x::algebraic, f::identical(symbolic)) ... end proc sqrt |
В отличие от print, функция lprint не выводит текстов Maple-процедур; однако она, как и первая, позволяет выводить выражения в корректном входном Maple-формате, что в общем случае позволяет использовать их в Input-параграфах. Элементы выводимой по lprint-функции строки разделяются запятыми. При установке prettyprint = 0 Maple-язык выводит все выражения, используя lprint-функцию. При этом, lprint-функция подобно print-функции возвращает NULL-значение, что не позволяет ссылаться на результат ее вызова по {%|%%|%%%}-оператору. Вместе с тем, в отличие от lprint-функции по функции print длинные выражения выводятся в терминах %-меток, как это иллюстрирует предпоследний пример предыдущего фрагмента.
Наконец, наиболее развитым средством форматирования результатов вычисления выражений Maple является группа (printf-группа) из четырех функций, реализованных на Сязыке и имеющих следующие форматы кодирования их вызова:
(1) printf(<Формат>, <ПВ>) (2) fprintf(<Файл>, <Формат>, <ПВ>)
(3) sprintf(<Формат>, <ПВ>) (4) nprintf(<Формат>, <ПВ>)
Все четыре средства – printf-процедура и три iolib-функции fprintf, sprintf и nprintf – выводят заданную последовательность Maple-выражений (ПВ) в формате, определяемом специальной форматирующей строкой (Формат), соответственно на: (1) стандартное устройство вывода (как правило на экран; printf), (2) в файл (fprintf), заданный своим спецификатором, и (3) в строчную структуру (sprintf, nprintf) в качестве возвращаемого результата. Форматирующая строка состоит из %-спецификаторов, разделенных пробелами, запятыми и т.д., и имеющих структуру следующего формата: