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

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

Функция cube ведет себя так, как если бы она обладала атрибутом bistable. Однако ясно, что этот атрибут на самом деле принадлежит функции Power, учахгтвующей в определении функции cube. Чтобы избежать этого эффекта, определим две функции concat и concatlist с помощью встроенной функции Join, не обладающей атрибутом bistable.

concat[x ,y ] := Join[{x}, {у}]

concat[{a,b},{2,3}]

{{a,6},{2,3}}

Если обратить внимание на фигурные скобки аргументов функции Join, то это довольно очевидный результат. Функцию concatlist мы зададим с помощью того же определения, что и функцию concat, но присвоим ей атрибут bistable. Отметим, что присвоение атрибутов функции должно предшествовать ее определению. Оно производится с помощью функции SetAt-tributes. А именно выражение SetAttributes[symb,attr] при его вычислении добавляет атрибуты attr к списку атрибутов символа symb.

SetAttributes[concatlist,Listable] concatlist[x ,y ] := Join[{x},{y}] concatlist[{a, b}, {2,3}]

{{a,2},{6,3}}

Мы видим, что результаты вычислений обеих функций отличаются. Дело обстоит таким образом, что, прежде чем произвести преобразование введенного последнего выражения с помощью ассоциированного с символом concatlist определения, производится группировка в пары элементов списков, стоящих на одинаковых позициях, как это обычно происходит с аргументами функций, обладающих атрибутом bistable:

Power[{a,b},{2,3}] {a\b}



Действие атрибута bistable таково же, как и действие функции Thread.

Thread[concat[{a, Ь}, {2,3}]] {{а,2},{Ь,3}}

Удаление атрибута производится с помощью функции Clear-Attributes.

Clear Attributes[concatlist, bistable]

concatlist[{a,b},{2,3}]

{{a,6},{2,3}}

Теперь результаты вычислений функций concat и concatlist совпадают.

Функции Map, MapAt и Thread позволяют добиваться того же результата, что и присвоение атрибута bistable.

{f[{a,b,c}],Map[f,{a,b,c}]} {f[{a,b,cMf[a]J[b]J[c]}}

{f[{a,{b,c}}],MapAt[f,{a,{b,c},{{l},{2,l},{2,2}}}]} {/[{a,{6,c}}],{/[a],{/[6],/[c]}}}

Всего имеется четырнадцать атрибутов функций, но мы остановимся только на некоторых.

Атрибут Orderless означает, что наделенная им функция безразлична к порядку ее аргументов подобно встроенным функциям Plus и Times.

Set Attributes[f, Orderless] f[y,l,x]

Аналогичного результата можно добиться с помощью функции Sort.



ClearAttributes[f, Orderless] Sort[f[y,l,x]]

f[hx,y]

Атрибут Flat соответствует свойству ассоциативности функций.

Set Attributes[g, Flat]

g[a,g[b,c]]

g[a,b,c]

Этим атрибутом наделены встроенные функции Plus и Times в соответствии с тем, что операции сложения и умножения ассоциативны: (а + Ь)+ с = а+(Ь + с) н {аЬ)с - а{Ьс).

(а Ь) с / / FuUForm

Times[a,b,c]

Попробуем удалить атрибут Flat из списка атрибутов функции Times.

Clear Attributes[Times, Flat] (a b) с FuUForm

Times[Times[a,b],c]

Атрибут Flat действует так, как если бы к результату вычисления не обладающей этим атрибутом функции была бы применена функция Flatten.

h[h[a,b],h[c]]

h[h[a,blh[c]]

h[h[a,b],h[c]] Flatten h[a,b,c]



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