Как mathematica справляется с неоднозначными определениями?

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

Но затем возникает проблема: что делать, когда заданному выражению соответствует более одного из этих правил преобразования? Я попробовал этот первый пример:

A[x_, 3] := 0;
A[x_, y_] := 1;

A[a, b]
=> 1

A[k, 3]
=> 0

Думаю, я могу объяснить это, сказав, что 3 соответствует 3 «лучше», чем y. Затем мой второй эксперимент:

B[x_, 3] := 0;
B[4, y_] := 1;

B[4, 3]
=> 0

Почему это? Я ожидал увидеть какую-то ошибку.


person Guilherme Bernal    schedule 19.06.2013    source источник


Ответы (1)


Точность определяется просто порядком, в котором были определены функции.

ClearAll[B]
B[x_, 3] := 0;
B[4, y_] := 1;
B[4, 3]
  (* 0 *)
ClearAll[B]
B[4, y_] := 1;
B[x_, 3] := 0;
B[4, 3]
  (* 1 *)

Будьте осторожны, если вы переопределяете функции, все становится запутанным.

ClearAll[B]
B[x_, 3] := 0;
B[4, y_] := 1;
B[4, y_] := 2;
B[x_, 3] := 3;
B[4, 3]

 (* 3 *)

Обратите внимание, что определения изменены правильно, но порядок соответствует исходной последовательности. (отсюда свободное использование ClearAll при работе с такими вещами)

чтобы увидеть порядок использования:

??B
person agentp    schedule 19.06.2013