我一直在阅读有关符号语言如何运作的内容,更多地关注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
这是为什么?我希望看到某种错误。
答案 0 :(得分:4)
precidnece只是按照函数的定义顺序。
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