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

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

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

Проследим за ходом простейших вычислений с шаблонами. Начнем с локальных правил преобразований:

X = 2; у = 3; h[x2 + у] /. h[2x + у] -> 1/х

Преобразование выражения h[7] в 1/2 произошло потому, что левая часть подстановки, т.е. выражение h[2x-f-y], так же как и правая 1/х, была вычислена прежде, чем выяснение соответствия шаблону. Если в правиле локальной подстановки использовать RuleDelayed, то получится тот же результат:

h[x-2 + y] /. h[2x + y] :> 1/х

Подстановка h[x ] :> 1/х также выполнится, но дахгт результат 1/7.

h[x-2-f у] /. h[x ] :> 1/х Trace {{{{{х,2},2\4}, {у,3}, 4 4- 3,3 -I- 4,7},h[7]},

Lfl / Lr I 1 1 Л 1, 1 1 1,

Итак, резюмируя, можно сказать: в локальных правилах преобразований вида Ihsrhs и Ihs :> rhs происходит вычисление



левой части до установления соответствия шаблону при условии, что Ihs не содержит шаблон .

Иначе обстоит дело в глобальных правилах преобразований. Мы знаем, что функция Set имеет атрибут HoldFirst. Именно поэтому для символов в левой части определения х = ехрг не используются их OwnValues, и эти значения тем самым переопределяются. Однако, несмотря на наличие этого атрибута, в выражениях вида f[args] - ехрг аргументы args вычисляются.

х = 2; у = 3; h[x-2 + y] = z

GlobaVh h[l] = z

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

Clear[x,y,g,h]; h[Literal[x-2 + у]] = z; g[Hold[x-2 + y]] = w;

h[x-2-Hy]

{g[x-2 + y], g[Hold[x-2-Hy]]}

Рассмотрим еще один пример использования функций Hold и Literal. Пусть символу х присвоено значение 2. Как преобразовать выражение х*3 в z3? Это можно сделать следующим образом.

х = 2; Hold[x-3] /. Literal[x] ->z / / ReleaseHold



Упражнения

1. Ответьте только на основе анализа принципов вычисления выражений, будет ли получен список {1,2,3}, если вычислить выражение Apply[Ll8t, 1-t-2-t-3]? Будет ли получен список {а,Ь,с}, если в этом выражении заменить l-f-2--3 на а + Ь + с1 Как из выражения l-f-2-f-3 получить список {1,2,3}, применяя функции Hold, ReleaseHold, Apply?

2. Допустим, что мы хотим определить функцию /, такую, что она любую сумму слагаемых преобразует в список слагаемых. Будет ли наша цель достигнута, если мы дадим определение

ffxJlus] := Apply [List, Hold[x], 2] ReleaseHold?

Как изменить это определение, чтобы все было в порядке?

3. Выражение Information[symb], или ?symb, дает справку о символе аутЬ. Как изменить атрибуты функции Information, чтобы получить спр>авку о каждом символе /, g и т.д. из списка {f,g,...} одновременно?

4. Ассоциируйте с символом h определение h[x .Symbol,у -Symbol] := {х,у}

и снабдите h атрибутом Flat. Предскажите, не вычисляя эаршее, каков будет результат вычисления выражения h[a,b,c,d]? Каков будет результат, если дополнительно снабдить h атрибутом Oneldentity? Посмотрите, используя функцию Trace, как „Математика" вычисляет это выражение в первом и втором случгъях.

5. Вычисление выражения х = N[x] дает результат х. В то же время, определив функцию

f[x.]:=(x = N[x]; Sqrt[x])

и вычисляя, скажем f [3], мы получаем сообщение об ошибке и результат 5grt[3]. Почему? Как изменить определение, чтобы функция / от аргумента типа Integer имела результатом вещественное число?



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