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

[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]

f{x)g{x)-ir f{x)g{x). „Математика" имеет развитую систему средств, позволяющих создавать весьма изощренные правила преобразований. На них основана самостоятельная парадигма программирования, с которой можно познакомиться в этой главе.

6.1. Глобальные и локальные правила преобразований

Выражение х = а, трактуемое в традиционных языках программирования как присвоение значения а символу i, можно рассматривать как простейшее правило преобразования, согласно которому всюду, т.е. во всех выражениях „Математики", в которые входит символ I, его следует заменить на а. В этом смысле рассматриваемое правило глобально. Его локальный аналог есть подстановка х -> а, которая осуществляется в отдельных формулах после применения к ним функции ReplaceAlI, имеющей вид /. во входном формате.

Знак = является инфиксной формой функции двух аргументов Set. Выражение Set[expri,expr2] вычисляется следующим образом. Аргумент eipri вовсе не вычисляется, выражение ехргг вычисляется, и это вычисленное значение присваивается выражению ехргь Подобный порядок вычисления имеет свои основания. Например, он позволяет избежать следующего противоречия. Пусть сначала символу х присвоено значение 1, т.е. вычислено выражение х= 1, а затем возникла необходимость присвоить символу I новое значение 2, вычислив Set[x,2]. Если бы первый аргумент функции Set вычислялся, то возникла бы ситуация, когда числу 1 присваивалось бы значение 2. Подчеркнем, что вычисленное выражение ехргг в принципе может быть присвоено в качестве значения любому выражению expri, а не только символу.

а[х2] = Е-х



После этого всюду вместо а[х] будет подставляться Е. Попробуем, однако, определить следующее правило преобразования:

х2=г b

Set:: write: Tag Power in is Protected b

Мы получили сообщение, что заголовок Power в выражении х" обладает атрибутом Protected. Это означает, что с выражениями 1, х, Sqrt[x] и любыми выражениями Power[expri,A;] с заголовком Power нельзя без специальной процедуры, описываемой ниже, связать какое-либо правило преобразования с помощью функции Set. Пример подсказывает также, что „Математика" ассоциирует преобразования с заголовком выражения expri в Set[expri,expr2]. Это обстоятельство позволяет определять новые функции, вычисляя выражения вида

f [х ] = хЗ хЗ

в которых символ х сопровождается подчеркиванием , являющимся входной формой выражения В1апк[]. После этого f[expr] для любого ехрг будет заменяться на ехрг, и это правило преобразования будет прочно связано с заголовком /, составляя одно из так называемых нижних значений этого заголовка.

DownValues[f]

{Literal[f[x:] :> х}

С любым заголовком можно ассоциировать сколько угодно нижних значений, или, что то же самое, правил преобразований. Например, из определенной выше функции f{x) = х можно сконструировать разрывную функцию, переопределив ее значение в точке 0:



f [0] = 1 1

DownValues[f]

{Literal[f[0]] :> l,Literal[f[x.]] :> x}

Отметим, что „Математика" будет применять правила преобразований, связанные с символом f, в том порядке, в котором они даны в Down Values. Всегда более частные правила предшествуют более общим. Таким образом, при вычислении выражения f[0] будет получен результат 1, а не 0.

Помимо функции Set для определения правил преобразований используется функция SetDelayed, или отложенное присвоение, входной формой которой является expri := ехргг-Вычисление выражения SetDelayed[expri,ехргг] заключается в том, что ни expri, ни ехргг не вычисляются, но соответствующее правило заносится в список нижних значений заголовка выражения expri. Еслп в дальнейшем возникнет необходимость вычислить выражение expri, то оно будет заменяться на вычисленное именно в тот момент значение выражения ехрг2. Разницу между немедленным и отложенным присвоением можно понять, обратившись к следующим примерам:

X = Random[] 0.0489537

у := Random[ ]

{Sin[x],Sin[x],Sin[y],Sin[y]}

{0.0489341,0.0489341,0.758444,0.311081}

В примере Sin[x} вычислялся для фиксированного значения х, равного 0.0489537, а Sm[y] - для у, являющихся значениями функции Random в момент вычисления функции Sin.

Map[ArcSin[#]&,%] {0.0489537,0.0489537,0.860922,0.31633}



[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.0011