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

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

Если этот пример показался читателю экзотическим, то следующий описывает довольно обычную ситуацию в символьных алгебраических вычислениях. Определим две функции h{x) и hh{x) следующим образом:

h[x-] = Factor[l -Ь хЗ] 1 + х

hh[x ] := Factor[l -1- х2] {h[Iy],hh[Iy]}

{1-у2,(1-у)(1-Ьу)}

функция h{x) тождественно равна Ц-з;, поэтому h{iy) = 1 + + {уУ = 1 - У, в то время как при вычислении значения hh{iy) выполняется разложение на множители многочлена 1 - у.

{DownValues[h], DownValues[hh]}

{{LiterаЩх.]] :> 1 + х},{Literal[hh[x.]] :> Factor[l + x]}}

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

Unprotect [Power] {Power}

х-2 = Ъ b

Р rotect[Power]

{Power}

f[x-2] 63



Тот факт, что многие встроенные функции снабжены атрибутом Protected имеет свои веские причины. Дело в том, что вычисление выражений включает просмотр „Математикой" большого числа правил преобразований, ассоциированных с их заголовками. Поскольку такие встроенные функции, как Power, Plus, Times и т.д., весьма часто встречаются в вычислениях, то каждое новое правило, ассоциированное с ними, может существенно замедлить работу „Математики". По этой же причине желательно снова запротектировать такие функции, если пользователь все же сочтет необходимым однажды распротек-тировать их.

Имеется другой механизм определения правил преобразований для выражений с протектированными заголовками, а именно механизм верхних значений (UpValues). Функции Up-Set и UpSetDelayed, входные формы которых есть " = и * :=, позволяют ассоциировать правила преобразований с элементами, находящимися на первом уровне выражений, имеющих любые, в том числе и протектированные, заголовки.

у"р" = с

Globally у/ :у-р = с

Globalp

р/ .y-p=zC

Итак, новое правило преобразования, согласно которому выражение j/P заменяется на с, ассоциировано с символами у и р, составляя их верхние значения. С учетом правил преобразования, связанных с верхними значениями, имеем следующий результат вычисления:



Попробуем воспользоваться функцией UpSet, чтобы определить правило = d:

Set: write: Tag Integer in is Protected d

Оказывается, правило можно ассоциировать с символами и нельзя ассоциировать с числами и строками. Однако можно указать „Математике", чтобы она ассоциировала новое правило только с символом х:

х/ : х-3 = d d

f[x-3] d3

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

Ivanov / : age[Ivanov] = 30; Ivanov / : sex[Ivanov] = male; Ivanov / : occupation[Ivanov] = engineer;

Ivanchuk / : ageflvanchuk] = 33;

Ivanchuk / : sex[Ivanchuk] = female;

Ivanchuk / : occupation[Ivanchuk] = accountant;

Выше введены сведения о двух работниках: Иванове и Иван-чуке. Теперь можно получить сведения о возрасте, поле и служебном положении каждого из них, сделав хотя бы такой запрос:



[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