Главная Длительная эволюция [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] Глава 8 ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЙ Мы уже упоминали, что важнейшими понятиями, относящимися к компьютерной алгебре. „Математика", являются вы-ражение и вычисление. Выражения подробно рассматривались в главе 4, наступило время познакомиться с принципами вычисления выражений. Самым существенным обстоятельством, которое здесь следует принять во внимание, является то, что рассматриваемая компьютерная алгебра есть система, вычислительный процесс в которой основан на правилах преобразований. Это означает, что при вычислении выражений последовательно применяются правила преобразований до тех пор, пока выражение не перестанет изменяться. Отсюда следует, что если вычисленное выражение, помещенное в выходную ячейку, вновь ввести во входную, то результат будет совпадать с введенным выражением. Более того, с введенным вычисленным выражением не будет происходить вообще никакого вычисления, в чем можно убедиться с помощью функции Trace: Sin[x-j-l] Trace {{x + l,l + x},Sin[l + x]} Sin[l -f- x] / / Trace {} Такой результат объясняется тем, что каждое выражение „Математики", за исключением чисел и строк, снабжается двумя метками, одна из которых несет информацию о времени вычисления выражений. Если эта метка не пуста, то выражение попросту не вычисляется. Вторая метка несет информацию о наличии „ссылок" на выражение. Например, выражение может быть присвоено в качестве значения какому-то другому выражению, и зто другое выражение является ссылкой. Глобальное выражение Out[n] также является ссылкой. Выражение удаляется из памяти, если на него отсутствуют ссылки. Итак, вычисленное однажды выражение больше не вычисляется, т.е. не изменяется. В этом смысле не вычисляются также числа и строки. Таким образом, процесс вычислений существенно опирается на вычисление символов. 8.1. Значения, ассоциированные с символами Напомним, что с каждым символом могут быть связаны следующие четыре типа правил преобразований. Если символу присвоено некоторое выражение с помощью функции Set, то это выражение является одним из собственных значений (OwnVal-ues) символа. x = f[y,z] OwnValues[x] {Literal[x]:> f[y,z]} Смысл функции Literal будет объяснен позже, а сейчас мы обратимся к другим правилам. Если символ является заголовком выражения, то с ним ассоциируются правила преобразований, которые называются его нижними значениями (Down-Values). g[x ,y„] :=х--у DownValues[g] {Literal[g[x.,y.]]:>x + y} Правила преобразований, которые определяют верхние значения (UpValues) символа, ассоциируются с символом, если он находится на первом уровне некоторого выражения. х/: {х,у ,2-} = {х y,xz} UpValues[x] {Literal[{x,y.,zJ}] :> {xy,xz}} {x,a,b} {ax,bx} Если символ является заголовком заголовка некоторого выражения, то с ним могут быть ассоциированы его дальние значения (Sub Values). h[x-][y ] :=х[у] h[v][a,b] v[a,b] SubValues[h] {Literal[h[x.][y..] :> x[y]} 8.2. Атрибуты Кроме правил преобразований, ассоциированных с символом symb, последний может быть снабжен некоторыми атрибутами, наделяющими функцию с заголовком symb определенными свойствами. С атрибутами Protected и bistable, которыми обладали некоторые встроенные функции, читатель уже знаком. Ниже мы более подробно остановимся на этих и других атрибутах и способе присвоения атрибутов символу. Ранее в гл. 5 нами была определена функция cube соотношением cube[x ] := х"3 Если мы вычислим функцию cube от списка, то получим следующий интересный результат: cube[{a,b,c}] {aЬ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.0012 |