Программирование, основанное на правилах преобразований
При помощи задания верхних значений можно строить простейшие базы данных (Е. М. Воробьёв [1, с. 146]). В примере на рис. 10.4 мы создаём базу данных о галилеевых спутниках Юпитера. Мы задаём информацию о массе спутника как верхнее значение выражения Mass[satname], где satname — название спутника (Io, Callisto, Europa и Ganymede), а также о размерах спутника и дате открытия — верхние значения выражений Dimension[satname] и OpeningDate[satname], соответственно. Теперь узнать информацию о спутнике satname можно, задав выражение ?satname. В примере In[13] на рис. 10.4. мы выводим данные о спутнике Ганимед, введя ?Ganymede.
Подробней о присвоении верхних значений см. книгу Е. М. Воробьёва [1, с. 145–148].
Есть в Mathematica и понятие нижних значений, которое тесно связанно с хорошо известными нам по предыдущей лекции пользовательскими функциями.
В примере In[1] на рис. 10.5 зададим функцию DoubSqr, возводящую в квадрат заданное выражение и удваивающую полученный результат. Теперь DoubSqr[expr] для любого выражения expr будет заменяться выражением 2 expr2 (пример In[2]). Это правило преобразования и будет составлять одно из так называемых нижних значений заголовка DoubSqr.
С любым заголовком можно ассоциировать любое количество нижних значений (Е. М. Воробьёв [1, с. 142]). Например, если мы хотим, чтобы при значении expr, равном 0, функция DoubSqr давала значение 1, зададим нижнее значение выражению с заголовком DoubSqr и аргументом 0 — пример In[3] на рис. 10.5.
Вывести на экран нижние значения, ассоциированные с заголовком arbhead, можно, применив к нему функцию DownValues. Е. М. Воробьёв [1, с. 143] отмечает, что если заголовок ассоциирован с несколькими нижними значениями, то Mathematica будет применять правила преобразований в том порядке, в котором они даны в DownValues: более частные правила предшествуют более общим. Именно поэтому в нашем примере выражение DoubSqr[0] при вычислении даст результат 1, а не 0 — пример In[4] на рис. 10.5.
Теперь попробуем изменить порядок присваивания нижних значений. Присвоим сначала некоторому выражению CubSqrt[4] значение 1000, а затем зададим пользовательскую функцию CubSqrt[x_], возводящую выражение в аргументе в степень 3/2 — примеры In[5] и In[6] на рис. 10.5. В примере In[7] при помощи функции DownValues ознакомимся со списком нижних значений выражения CubSqrt: в Out[7] мы найдём значения, заданные как в In[6], так и в In[5].
Если одному и тому же выражению последовательно присваивается несколько нижних значений (пример In[8] на рис. 10.5), то окончательно присвоенным оказывается то, которое присваивалось позже остальных (пример In[11]).
Подробней о присвоении нижних значений см. книгу Е. М. Воробьёва [1, с. 142–144].