В отличие от вышерассмотренных функции subs и процедуры asubs, результатом подстановки на основе algsubs-процедуры является вычисление, поэтому не требуется последующего применения eval-функции для обеспечения полного вычисления результата подстановки. Данное свойство функции позволяет успешно использовать ее для обеспечения символьно-численных вычислений, включающих как символьные преобразования, так и численные вычисления. Рассмотренные функциональные средства Subsгруппы играют весьма важную роль во многих задачах символьной обработки алгебраических выражений в среде Maple
В отличие от рассмотренных средств Subs-группы, обеспечивающих, в первую очередь, символьную обработку выражений на основе синтаксически-алгебраических подстановок, applyop-процедура, имеющая следующий простой формат кодирования: applyop(F, <Операнды>, W {, <F-аргументы>})
обеспечивает выборочное применение F-функции к указанным вторым фактическим аргументом applyop-процедуры операндам W-выражения с возможностью передачи ей фактических F-аргументов, определяемых необязательным четвертым аргументом. При указании в качестве второго фактического аргумента целочисленного р-выражения имеет место соотношение: applyop(F, p, W) = subsop(p=F(op(p,W)), W), которое сохраняет силу и в случае списка целочисленных выражений в качестве второго фактического аргумента applyop-поцедуры, позволяя производить выборочную F-обработку подвыражений W-выражения. В случае указания в качестве второго фактического аргумента applyop-процедуры множества целочисленных выражений F-обработке одновременно подвергаются соответствующие элементам множества операнды W-выражения. Необязательный четвертый аргумент applyop-процедуры позволяет передавать F-функции дополнительные фактические аргументы в порядке их кодирования. Данная функция позволяет выборочно обрабытывать операнды выражений.
С детализирующими замечаниями по всем представленным выше средствам подстановок можно ознакомиться в наших книгах [9-14]. Следующий сводный фрагмент иллюстрирует примеры применения рассмотренных средств обеспечения подстановок различных типов:
> subs({ab=d, ac=h, cd=g}, [ac, ab+cd, d*ab, h+cd]); ⇒ [h, d + g, d2, h + g] > [subs(x=0, exp(x) + cos(x)), eval(subs(x=0, exp(x) + cos(x)))]; ⇒ [eo + cos(0), 2] > subsop(1=GS, 3=Art, 4=99, z^2 + 64*x + 59*y + 99); ⇒ GS + 64 x + Art + 99 > subsop(1=G, 2=NULL, 3=[a, b, c, d, e, g], [x, y, z]); ⇒ [G, [a, b, c, d, e, g]] > subsop(0=G, 1=g(x, y), 2=exp(x), 3=s(t), H(x, y, z)); ⇒ G(g(x,y), ex, s(t)) > subsop(0=G, [2, 0]=W, [3, 1]=t, H(x, g(x, y, z), x)); ⇒ G(x, W(x, y, z), t) > subs(y^2 + 64*y + 59 = G(x), sin(y^2 + 64*y + 59) - 10); ⇒ sin(G(x)) - 10 > asubs(x^3+y+17 = W-17*x, (x^3+x^2+3*x+17+y-64*y^2)^2 + 10*x + 99, 'always'); 2 (W − 14 x + x2 − 64 y2) + 10 x + 99 > [asubs(x^3+x=0, exp(x^3+x)), eval(asubs(x^3+x=0, exp(x^3 + x)))]; ⇒ [1, 1] > [subs(x^3=h+x^2, x^5+x^2), algsubs(x^3=h+x^2, x^5+x^2)]; ⇒ [x5 + x2, x4 + (h + 1) x2] > [subs(a+b=c, 10+a+b+3*c), algsubs(a+b=c, 10+a+b+3*c)]; ⇒ [10 + a + b + 3 c, 10 + 4 c] > [subs(a*x*y = b, 10*a*x*y^2 + 3*b*x*y), algsubs(a*x*y = b, 10*a*x*y^2 + 3*b*x*y)]; [10 a x y2 + 3 b x y, 10 y b + 3 b x y] > [subs(a*b/c=d, 3*a^2*b^2/c + sqrt(a*b*d/c)), algsubs(a*b/c=d, 3*a^2*b^2 + sqrt(a*b*d/c))]; 3 ac2 b2 + a b dc , 3 a2 b2 + d2 > subs(x^3=Pi, exp(10 – Pi + x^3 + x^5 - x^6)), algsubs(x^3=Pi, exp(10–Pi + x^3+x^5-x^6)); (10 + x5 − x6) (π x2 + 10 − π2) e , e > [algsubs(x^2 + 3*x = 64, (x + 2)^2 + 59), algsubs(x^2 + 3*x = 64, expand((x + 2)^2 + 59))]; [(x + 2)2 + 59, x + 127] > algsubs(x*y^2=G, x^2*y^4 + x^3*y^2 + y^4*x), algsubs(x*y^2=G, x^2*y^4 + x^3*y^6, x); G x2 + y2 G + G2, G3 + G2 > algsubs(x^2 + 10*y=S, 3*x^2 + 17*y), algsubs(x^2 + 10*y=S, 3*x^2 + 17*y, 'exact'); -13 y + 3 S, 3 x2 + 17 y > G:= s^3 + 2*s^2*h - 3*s^2/h + 3*s*h^2 - 6*s + 3*s/h^2 + h^3 - 3*h + 3/h - 9/h^3: > algsubs(s^2=1, G), algsubs(s^2=1, G, [h, s]), algsubs(1/h=h, G, [s, h]), algsubs(s*h=1, G); (3 h4 − 5 h2 + 3) s + −h4 − 93 + h6, h3 + 3 s h2 − − h 5 s + 3 2s − 93,2 h h h h 3 s2 − 4 s + 3 2s − 93 + + 3h h3 s3 − s2 h − 6 s + 6 s h2 − 8 h3, s3 −h h h (a + b − 3) x a y b (a + b) SV := + −> SV:=(a + b - 3)*x/(a + b) + a*y/(a + b) - b*(a + b)/z; ⇒ a + b a + b z > simplify([algsubs(a + b = 1/h^2, SV), algsubs(a + b = 1/h^2, SV, [a, b], 'exact')]); − −x z h2 + 3 x z h4 + z hy h2 4 z b − y h2 z + b, − −x z h2 + 3 x z hz h42 − y a h4 z + b > restart: applyop(G, {[1, 2], [3, 2]}, x^y + x + y^h, z); ⇒ xG(y, z) + x + yG(h, z) > applyop(G, 3, x + y + z, t, h) = subsop(3 = G(op(3, x + y + z), t, h), x + y + z); > applyop(evalf, {[1, 2], [3, 2]}, x^sin(59) + R + y^ln(17), 2); ⇒ x0.64 + R + y2.8 > n, h:= 1, 2: applyop(Art, [n + 1, h^n], H(x) + G(x, y), t); ⇒ H(x) + G(x, Art(y, t)) |
С учетом сказанного особых пояснений примеры фрагмента не требуют. Вместе с тем, наряду с рассмотренными функциями поддержки подстановок в целом ряде случаев эффективно использовать две ранее рассмотренные функции numboccur(V,h) и has(V,h), возвращающие число вхождений и сам факт вхождения {true|false} h-подвыражения в V-выражение соответственно. В качестве примера ниже приводится PSubs-процедура, существенно использующая первую из указанных функций Maple-языка. Слелующий фрагмент представляет исходный текст процедуры PSubs и примеры ее применения.
PSubs := proc() local k h L, , , W; `if`(nargs = 0, RETURN( ), assign(W = args[nargs], L = 63)); for k to nargs − 1 do L := L, `if` type(( args[ ]k , 'equation'), args[ ]k , `if`( type(args[ ]k , 'set'('equation')) or type(args[ ]k , 'list'('equation')), op(args[k]), RETURN("Substitution rules are incorrect"))) end do; `if`(nops [( L]) − 1 = nargs RETURN(WARNING(, "Substitution rules %1 are not applicable to absent expression"[args])),, NULL); for k from 2 to nops([L]) do h := numboccur W,( lhs(L k[ ])); `if`(h = 0, print(cat(`Rule (`, convert(L k[ ], 'symbol'), `) is inactive`)), [print( cat(`Rule (`, convert(L k[ ], 'symbol'), `) was applied `, convert(h, 'symbol'), ` times`)), assign('W' = subs(L k[ ], W))]) end do; W end proc > PSubs(x=a, {y=b, z=c}, [t=h, k=v], (Kr(x^2+y^2+z^2))/(t+k + sqrt(x*y-t*k))-Art(x+z+t+k)); Ryle (x = a) was applied 3 times Ryle (y = b) was applied 2 times Ryle (z = c) was applied 2 times Ryle (t = h) was applied 3 times Ryle (k = v) was applied 3 times Kr(a2 + b2 + c2) − Art(a + + + c h v) h + + v a b − h v> PSubs(h=a*b*c, Kr(x+y+z)*Art(x+z)+VSV(y+z)); ⇒ Kr(x + y + z) Art(x + z) + VSV(y + z) Ryle (h = a b c) is no active |
В качестве первого аргумента PSubs-процедуры выступает последовательность, элементами которой могут быть отдельные уравнения (правила подстановок) либо их множества/списки. Вторым аргументом процедуры выступает собственно само обрабатываемое выражение. Процедура возвращает результат последовательного применения заданных первым фактическим аргументом правил в выражение, заданное ее вторым фактическим аргументом. Одновременно выводится информация по применению каждого из правил подстановки. Читателю рекомендуется разобраться в организации процедуры. С целью лучшего усвоения принципов и особенностей выполнения вышерассмотренных средств, имеющих важные приложения, читателю рекомендуется провести с ними определенную наработку. В частности, в качестве весьма полезного упражнения читателю рекомендуется в терминах алгебраических правил подстановок запрограммировать в среде Maple-языка хорошо известные абстрактные модели вычислителей, например, машину Тьюринга (последовательная модель вычислений) и классические однородные структуры (параллельная модель вычислений) [1-3,36,40,92-96,98,100-102].
Учитывая важность различного рода подстановок при работе с символьными и строчными выражениями – одними из основных составляющих символьных вычислений и обработки – нами был определен целый ряд средств данного типа, ориентированных на различные случаи приложений [41,103,108,109]. В частности, процедура Sub_st(E, S, R {, `insensitive`}) возвращает результат подстановки правых частей уравнений, определенных первым фактическим аргументом Е, в строку или символ, указанный вторым аргументом S, вместо всех вхождений в нее левых частей уравнений Е. При этом, обработке подвергаются и пересекающиеся вхождения левых частей уравнений подстановок. Более того, тип возвращаемого результата соответствует типу второго аргумента S.
Sub_st := proc(E::list(equation ), S::{string, symbol}, R::evaln) local k h G v, , , , ω, p; assign(p = {args}, ω = ((s v, ) → `if`(member(insensitive v, ), Case(s, 'lower'), s))); `if`(nops(E) = 0, WARNING "Substitutions system <%1> is absent",( E), assign( G = cat("", S), R = true, v = array(1 .. nops(E), [0 $ (k = 1 .. nops(E))]))); `if`(Search2(ω(S p, ), {seq(ω(lhs(E k[ ]), p), k = 1 .. nops(E))}) = [ ], RETURN assign(( ' 'R = false), ,S WARNING("Substitutions system %1 is not applicable to <%2>", E S, )), NULL); for k to nops(E) do `if`(ω(lhs(E k[ ]), p) = ω(rhs(E k[ ]), p), [assign(' 'R = G), RETURN(S, WARNING("Substitution <%1> generates an infinite process" [ ], E k ))] , assign(' [ ]'v k = 0)); while search(ω(G p, ), ω(lhs(E k[ ]), p)) do assign('h' = searchtext(ω(lhs(E[k]), p), ω(G, p)), 'v[k]' = v[k] + 1); G := cat(G[1 .. h − 1], rhs( [ ])E k , G[h + length lhs( [ ])( E k ) .. length(G)]) end do end do; convert(G, whattype(S)), evalm(v) end proc > S:="ARANS95IANGIANRANS95RAEIAN99RACREAIANRANSIANR99ANSRANS": Sv:=["RANS"="Art", "IAN"=" ", "95"="S", "99"="Kr"]: Sub_st(Sv, S, Z); "AArtS G ArtSRAE KrRACREA Art RKrANSArt", [4, 5, 2, 2] > S:="ARANS95IANGIANRANS95RAEIAN99RACREAIANRANSIANR99ANSRANS": Sv:=["RANS"="Art", "IAN"=" ", "95"="S", "99"="Kr"]: Sub_st(Sv, S, Z), Z; "AArtS G ArtSRAE KrRACREA Art RKrANSArt", [4, 5, 2, 2], true |
Результат обработки строки или символа S посредством системы подстановок Е есть только первый элемент возвращаемой 2-элементной последовательности, тогда как в качестве ее второго элемента выступает целочисленный вектор, определяющий количество выполненных применений к S соответствующих подстановок из Е. Если же левые части подстановок из Е не принадлежат S, или по меньшей мере одна подстановка инициирует бесконечный процесс, то процедура выводит соответствующее информационное предупреждение.