Mathematica如何处理模糊定义?

4

我一直在阅读有关符号语言的工作原理的内容,更加专注于Mathematica。据我所知,求值就是将一系列转换规则应用于输入,直到找不到匹配的转换规则,并将其结果称为“输出”。

但问题来了:当多个转换规则与给定表达式匹配时该怎么办?我先尝试了这个例子:

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

A[a, b]
=> 1

A[k, 3]
=> 0

我相信我可以这样解释:3y更好,因为3匹配了3。然后是我的第二个实验:

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

B[4, 3]
=> 0

为什么会这样?我本来期望会看到某种错误提示。
1个回答

4
优先级仅由定义函数的顺序确定。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接