Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [ 62 ] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

Globalf f = b

При вычислении выражения f = g было использовано правило преобразования, ассоциированное с символом д, но не с /. Что было бы, если бы функция Set не имела атрибута HoldFirstl

Было бы ошибкой думать, что первый аргумент у функции, имеющей атрибут HoldFirst, вообще никогда не вычисляется. Он не вычисляется на первых этапах стандартного процесса вычислений, а именно на этапах, предшествующих применению правил преобразований, ассоциированных с заголовками. Если же при применении правил преобразований рассматриваемый первый аргумент стал аргументом функции с заголовком, не имеющим атрибутов Hold*, или не попал под действие таких атрибутов, то он вычислится. Таким образом, рассматриваемые атрибуты позволяют передавать невычисленные аргументы в выражения с другими заголовками.

Set Attributes[f, HoldFirst]

f[x , у-Integer] := (x = Delete[x,y])

x={a,b,c}; f[x,2]

{a,c}

Другая задача, решаемая с помощью атрибутов Hold* - сделать более гибким применение шаблонов.

Set Attributes[g, HoldFirst]

g[a + 2,b] /. g[x- + y-,z ] :> (x + z)y

2{a + b)



Кроме функций Set, имеющей атрибут HoldFirst, и SetDe-layed с атрибутом HoldAll большинство функций процедурного программирования и графических функций имеют атрибуты Hold*.

Attributes /@ {If, Do, For, While, Plot, Show}

{{HoldAll,Protected}, {HoldAll,Protected}, {HoldAll, Protected}, {HoldAll,Protected}, {HoldAll, Protected}, {Protected}}

Это позволяет таким функциям вычислять все или некоторые свои аргументы нестандартно. Так, функция Do вычисляет свой первый аргумент несколько рад, функция If в зависимости от значения первого аргумента вычисляет либо второй, либо третий аргумент, функция Plot вычисляет свой первый аргумент несколько раз в некоторой последовательности точек и т.п.

Преодолеть воздействие атрибутов Hold* на вычисление какого-то подвыражения ек можно, если задать его в виде Evaluate[ej{]. Например, функция Plot на раннем этапе своего вычисления опознает, является ли ее первый аргумент списком. Если является, то Plot делает необходимые приготовления для вычерчивания графиков сразу нескольких функций одновременно. Поэтому если первый аргумент является значением функции Table, то применение Evaluate необходимо, так как в противном случае графики не будут вычерчены. Функция Evaluate в некоторых случаях ускоряет вычисления. Так, вычисление выражения ParametricPlot[{x[t],y[t]} /. n,{t,0,Pi}], где п есть совокупность интерполяционных функций, хотя и возможно, но будет значительно ускорено и выполнено с большей точностью, если первый аргумент будет введен в виде Evaluate[{x[t],y[t]} /. п].

В заключение этого параграфа отметим, что функциями, связанными с Hold, являются HeldPart и ReplaceHeldPart. Они позволяют выполнить следующие действия. Напомним,



что после извлечения функцией Part соответствующего заданной спецификации подвыражения, последнее вычисляется, даже если в исходном выражении оно находилось под действием атрибутов Hold* и не вычислялось.

{g[l + l,y], Part[g[l4-l,y],l]} {ff[l + l,y], 2}

Вычисления извлеченной части можно избежать, если вместо функции Part применить функцию HeldPart.

HeldPart[g[l + l,y],l] Hold[l +1]

Мы видим, что HeldPart делает извлеченное подвыражение аргументом функции Hold.

При замене подвыражений, находящихся в области действия одного из атрибутов Hold*, иногда возникает необходимость заменить часть таких подвыражений на новые без вычисления последних. Это осуществляется при помощи функций Replace-HeldPart и Hold.

{ReplaceHeldPart[g[x -- у, v], Hold[a +1], {1,1}], ReplacePart [g[x + у, v], Hold [a +1], {1,1}]}

{g[a + l + y,v], g[Hold[a + l] + y,v]}

Рассматриваемая функция, по сравнению с функцией ReplacePart, дополнительно освобождает подставляемое выражение от заголовка Hold.

8.5. Вычисление правил преобразований

Преобразования в соответствии с шаблонами и использование шаблонов в локальных и глобальных правилах преобразований являются одной из самых сильных сторон „Математики" как



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [ 62 ] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0013