В каком порядке проверяются глобальные определения функций?

Форум пользователей пакета Mathematica

Модератор: Admin

dims12
Сообщения: 37
Зарегистрирован: Чт янв 30, 2003 1:23 am

В каком порядке проверяются глобальные определения функций?

Сообщение dims12 » Вс окт 31, 2010 8:23 pm

Например:

In[111]:= F[x_] := 2 /; x < 3

In[112]:= F[x_] := 10 /; x > 2

In[113]:= F[1]

Out[113]= 2

In[114]:= F[2]

Out[114]= 2

In[115]:= F[3]

Out[115]= 10

Почему в последнем случае выполняется последнее правило? Просто потому, что оно последнее? Или это непредсказуемо?

Как мне взять это под контроль при помощи программирования?

Допустим, я хочу определить функцию так, чтобы до 2 она выдавала 2, после 3 выдавала 10, а между 2и3 оказывалась бы невыполненной?

Вот так не вышло:

F[x_] :=
If[x < 2, 2,
If[x > 3, 10,
Hold[F[x]]]]

Gordon
Сообщения: 300
Зарегистрирован: Вт сен 08, 2009 8:16 pm

Сообщение Gordon » Вс окт 31, 2010 9:43 pm

Почему в последнем случае выполняется последнее правило? Просто потому, что оно последнее? Или это непредсказуемо?

Последовательно сверху вниз подставляется аргумент в список определений функций пока не получит результат.
F[3] := 2 /; 3 < 3 -> False
F[3] := 10 /; 3 > 2 -> True
10
в этом вашем примере есть область пересечения 2-3, поэтому результат F[2.5] зависит от того какое определение функции вы первым ввели.

Допустим, я хочу определить функцию так, чтобы до 2 она выдавала 2, после 3 выдавала 10, а между 2и3 оказывалась бы невыполненной?

Код: Выделить всё

F[x_] := 2 /; x < 2
F[x_] := 10 /; x > 3

F[0] + F[5] + F[2.5]
12 + F[2.5]

dims12
Сообщения: 37
Зарегистрирован: Чт янв 30, 2003 1:23 am

Сообщение dims12 » Пн ноя 01, 2010 12:23 pm

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

Пока что нашёл функцию Defer:


F[x_] :=
If[x < 2, 2,
If[x > 3, 10,
Defer[F[x]]]]

Вроде работает.