Главная Длительная эволюция [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.001 |