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

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

MatchQ[{a, b, 2}, { ..Symbol}] False

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

MatchQ[Sin[x] + Cos[y] -Ь z, .?(MemberQ[#, Sin[x]]&)] True

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

MatchQ[a,ab]

True

MatchQ[y~2-i- l,a .x 2 -- b .x -l-c .] False

MatchQ[y2 + l,a .x 2 + b .x -i- c .a .x "2 -- c .] True

В двух вышеприведенных примерах нам встретились шаблоны вида а .х "2, в которых вслед за символом стояла точка. Это пример шаблонов со значениями по умолчанию. В рассматриваемом шаблоне сомножитель а может отсутствовать, а на его месте по умолчанию будет поставлен множитель 1. Вот почему выражение у"2 + 1 отвечало шаблону а..х-"2 + с... Шаблон с также сопровождался точкой, и его значение по



умолчанию равно 0. Итак, в шаблоне х + у . значение по умолчанию шаблона, сопровождаемого точкой, равно О, в шаблонах х у . и х у . значение по умолчанию равно 1. Пользователь может по своему желанию присвоить шаблонам значения по умолчанию. Для этого он может воспользоваться конструкцией: х : V, означающей, что если соответствующий шаблон или часть шаблона отсутствуют, то они заменяются на выражение V.

f[x ,y :5] :=х--у {f[a,b], f[a]} {a + b, 5 + а}

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

f[x-2]-bf[y(l/2)]/.f[a: .-.Integer] :> g[a] f[Sqrt[y]] + g[x]

В заключение отметим, что шаблоны доставляют еще один инструмент работы со списками, а именно имеется возможность выделять элементы списков не только по их позициям или по свойствам, которыми они обладают (функции Part или Select), но и по соответствию их шаблонам. Функция Cases выбирает, а функция DeleteCases удаляет из списка элементы, отвечакзщие шаблону pattern.

{Cases[{x у,х-Ь y,x>},a.b.], DeleteCases[{x у,х-Ьу,х"у},а Ь ]}



6.3. Шаблоны в глобальных правилах преобразований

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

Допустим, что нужно определить функцию h{x) вещественной переменной х, равную О при i < О и равную х при х > 0. В определении этой функции участвуют два предиката, поэтому в определении вида h[x ] := ехрг приходится использовать два выражения ехрг в зависимости от выполнения того или иного условия. Это ограничение действия определения достигается с помощью функции /;, являющейся инфиксной входной формой функции Condition:

h[x ]:=0/;x<0 h[x ] := х/;х>=0

Для того чтобы убедиться в успешном решении задачи, построим график функции h{x) (рис. 6.1):

Plot[h[x],{x.-l,l}];

-0.5



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