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

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

В примере к аргументу Pi сначала применяется функция N, затем Sqrt, а потом Cos. Посмотреть, как изменяется результат после применения очередной функции из композиции, можно, обратившись к ComposeList.

ComposeList[{N, Sqrt, Cos}, Pi] {Pi, 3.14159,1.77245,-0.200294}

Заметьте, что у функции ComposeList порядок функций изменен по сравнению с Composition.

При работе с алгеброй функций, когда функции естественно рассматривать как операторы, важную роль играет тождественный оператор Identity.

Identity [х]

Если / есть заголовок некоторой функции, то с помощью 1п-verseFunction можно формально определить обратную функцию.

f[ - InverseFunction[f]

/(-1)

Формальность определения заключается в том, что, хотя композиции / и /(~) являются тождественными функциями:

{Composition[fF,f][x], Composition[f,Jff][y]}

с заголовком /(~) не связываются автоматически никакие правила фактического вычисления обратной функции.

f [х ] := х-2

ff[y]



Таким образом, рассматриваемая алгебра функций скорее является алгеброй заголовков функций. Заголовки функций можно складывать, перемножать и умножать на вещественные числа, т.е. можно вводить объекты вида f + д, fg и 2/ и т.п.

{(f+g)[x], (fg)[x], (2f)[x]} Ш + Ф1 U9)H {2f][x]}

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

{Through[(f-Hg)[x]], Through[(f g)[x]], Through[(2 f)[x]]} {f[x] + g[xl f[x]g[xl 2[x]f[x]}

В последнем выражении число 2 рассматривается как заголовок функции, а не как множитель. Выход из этого положения заключается в том, чтобы вместо чисел использовать чистые функции 2&, 3& и т.д., которые трактуются как функции, принимающие постоянные значения.

Through[(2&f)[x]]

5.4. Подмножества конечного множества

Программирование строго в функциональном стиле приводит к выражениям, получающимся нанизыванием применений заголовков функций к исходным аргументам. Такие выражения иногда называют „однострочниками". В качестве примера однострочника приведем программу, которая по заданному конечному множеству символов дает список всех подмножеств



данного множества. Из всех подходов к решению задачи выберем алгебраический. Пусть задано множество

l={a,b,c,d};

тогда все его подмножества можно отождествить со слагаемыми суммы, получающейся при раскрытии скобок произведения {l + a){l + b){l + c){l + d).

Expand[(l + а){1 + Ъ) (1 -Ь с) (1 -t- d)]

l + a + b-\-ab + c + ac + bc + abc + d-{-ad + bd abd + cd + acd + bed -f- abed

Естественно, единицу следует сопоставить с пустым подмножеством. Приведем последовательные этапы программирования этого метода и его окончательную форму.

И = 1 +1

{l + a,l-\-b,l + c,l + d}

12 = Times@@ll

{l + a){l + b){l + c){l + d)

13 = Expand [12];

14 = List@@l3

{l,a,b,ab,ac, be, abc, d, ad, bd, abd, cd, acd, bed, abc}

15 = {#}&/@l4

m,{a}Abh{ab},{ac},{bc}Abc},{d},{ad},{bd}, {abd}, {cd}, {acd}, {bed}, {abc}}

16 = 15 /. {Times Sequence, {1} {}}

{{}Aa}Ab},{a,b},{a,c},{b,c},{a,b,c},{d},{a,d}, {b,d},{a,b,d},{c,d},{a,c,d},{b,c,d},{a,b,c}}

Выражение 16 дает ответ. Поставленный вместо Times заголовок Sequence превращает произведение в последовательность



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