公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+3 投票
1.5k 浏览

MMA同时定义多个f的话,MMA调用时,选取f的规则是什么?

Clear[f, g]
f[x_] := g[1][x]
f[x_Integer] := g[2][x]
f[x_?(Divisible[#, 7] && Divisible[#, 5] &)] := g[3][x]
f[140]

明明f[x_?(Divisible[#, 7] && Divisible[#, 5] &)] := g[3][x] 的约束条件最多,为什么f[140]返回的是g[2][140]而不是g[3][140]...这个优先级如何判定的,怎样获取他们的优先级指数...

分类:函数 | 用户: mma-2-2-2 (1.3k 分)

2 个回答

+2 投票
 
已采纳

Mma 内部有一个规则分析器,当键入的规则相对来说简单时,Mma 就会对规则进行分析,并按照自己的算法对规则进行排序,越特殊的规则排在越前面。当然当规则特别复杂时,Mma 就区分不了哪些规则更为特殊,基本上就是按照用户自己键入的顺序存储。不过大多数情况下,Mma 的排序都是正确的。如果 Mma 对规则的排序不正确的话,也是可以手动调整的。

你原始定义的规则顺序:

方法有二:

1. 改变函数定义时规则的定义顺序:

2 . 直接对定义的规则调整一下顺序:

PS: 建议在定义函数的时候就尽可能的按照规则优先级来定义,避免后面调整时的麻烦。

用户: amita (481 分)
采纳于 用户:mma-2-2-2
+1 投票
Amita的回答正解。我只是做些资料性补充。

楼主的问题,在Stephen Wolfram 的 An Elementary Introduction to the Wolfram Language 一书 第40章Q&A部分有说明(http://www.wolfram.com/language/elementary-introduction/40-defining-your-own-functions.html   )   。大意是越具体的定义越优先,如Mahtematica无法判断,则越先定义的规则越优先。
用户: jackyjjp (31 分)
...