找回密码
 注册
Simdroid-非首页
查看: 180|回复: 3

[基础概念] 关于Mathematica中Function,Pattern,Symbol,Expression概念和本质的探讨

[复制链接]
发表于 2011-4-18 16:58:02 | 显示全部楼层 |阅读模式 来自 LAN
本帖最后由 guocong89 于 2011-4-18 17:43 编辑

随着对Mathematica的运用越来越熟悉时,一旦静下来想想,发现对很多基础的概念的理解有着太多的模棱两可,对基础概念的不确信导致在很多问题上的困惑,因此希望和大家探讨一下对一些基础概念的理解,希望能够加深自己的认识。
首先是Symbol。这个应该是组成Mathematica的基石,是一切物质的组成成分之一。
那么什么是Symbol呢?与Symbol处于相同相同地位的其他概念有哪些呢?
1是什么?分号是什么?

在我的理解里,Mathematica的世界由四大阵营组成,Symbol,Number,String和Operator。
四大阵营属性各不相同,在功能和应用上表现出完全的不对等。
Operator最为特立独行,身为世界的执法官,与其他各阵营完全不兼容,其唯一的作用可以理解为——标识语法和语义。Symbol是最为宽容和灵动的阵营,一生变幻无穷,在三个阵营中自由穿梭,是Mathematica生命力的源泉。
Number和String则是绿叶般得衬托,出生之后就再也不能有任何变化,它们甘愿去充当Symbol(这里有疑问,以下解释)灵动的身躯里坚实的骨架,用自身的陨亡和新生命的诞生换来Symbol轻盈的变化。当然,执法者Operator也在其中扮演者不可替代的角色。
如果世界能够按照上述规则和睦的存在就好了,那只是存在于理想之中,总是有捣蛋鬼会来做些破坏。
请问,
  1. 。是Symbol还是Operator?
复制代码
不要轻易下结论,试试这个例子
  1. 。+。
复制代码
  1. 12 +。
复制代码
  1. 12  。
复制代码
结果表现出了完全的不可理解。这是为什么呢?
另外,我把它们分开写,是因为它们完全无视换行的存在。

评分

1

查看全部评分

 楼主| 发表于 2011-4-18 17:42:27 | 显示全部楼层 来自 LAN
Simdroid开发平台
基于前面的讨论,有一个问题不免会浮现出来:
  1. a=1
复制代码
究竟代表了什么?
a还是a么?a是1么?a现在是什么阵营,Symbol or Number?
  1. a = 1
  2. SymbolName[a]
  3. NumberQ[a]
  4. Set[a, 2]
  5. Attributes[{NumberQ, Set}] // Column
复制代码
这个测试或许可以说明点什么,除非被Hold住,否则a会彻底的变身到其他阵营。

但是问题远没有这么简单,因为还有后面更加复杂的捣蛋鬼没有介绍。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-18 18:34:00 | 显示全部楼层 来自 LAN
本帖最后由 guocong89 于 2011-4-18 20:41 编辑

在Mathematica世界里,来自三大阵营的纯种成员并不常见,这个世界其实是属于混血儿——Expression——的。

虽然Expression可以看作一个更加庞大的阵营,以至于除了执法官以外的其他三大阵营都可以看作它的优秀子民,但是这个阵营内部党争严重,帮派纷争,分成了大大小小的团体,也许就是Pattern吧。

Pattern的存在让Expression有了归属感,它们成为法律rule执行的准绳。有了Pattern,我们就差最后一个主角没有介绍了,Function。
Function其实就是把符合一定Pattern的Expression变换为另外一个Expression的东西,而我们习惯上给他们一个名字,像f,g,Sin,Plot,而这些名字实际上就是Head的返回值。

一切都显得那么自然,没有任何争议,我们对它都是太习惯了,不论有没有用过Mathematica。但是一个真正重要的问题我们却似乎从来没有思考过。
f[x][y] 代表了什么?

代表了什么?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-18 20:56:52 | 显示全部楼层 来自 LAN
本帖最后由 guocong89 于 2011-4-18 21:16 编辑

TBE 前几天的帖子引发了这个问题的讨论和思考。是的,f[x][y] 表示了什么含义?

也许和大多数人一样,我想当然的认为,这定义了一个函数,匹配形如 f[_][_] 的函数定义,它是f的一个DownValue。矛盾由此引发。

没错,它匹配  f[_][_] 的定义,但是它不是f的DownValue。

更为重要的一点是,一个Expression的Head不必要是个Symbol,它可以是任意Expression。也就是说,x+y可以是个函数名,f[x]也可以是个函数名。因此,对于f[x][x][x][x][x]来说,它仅仅是f[x][x][x][x]的一个简单函数而已。这种现象其实并不罕见,
  1. Through@{Sin, Cos}[Pi]
复制代码



但是,问题要是像以上描述的这么简单就好了,但是奇怪的行为还是层出不穷。
  1. Clear["`*"]
  2. f[x_][y_] := a
  3. f[x_] := b
  4. b[y_] := c
  5. f[x][y]
  6. Information[f]
  7. MatchQ[f[x][y], f[x_][y_]]
  8. MatchQ[f[x][y], b[y_]]
复制代码


结果

  1. c
  2. Global`f
  3. f[x_][y_]:=a
  4. f[x_]:=b
  5. True
  6. True
复制代码



请问这个该怎么解释呢?
我只能从优先级角度说,模式替换优先级高于模式匹配,因此f[x]先被替换成b

更进一步
  1. Clear["`*"]
  2. f[x_] := b
  3. f[x_][y_] := a
  4. Attributes[SetDelayed]
  5. Information[b]
  6. Hold[f[x][y]]
  7. f[x][y]
复制代码



结果
  1. {HoldAll, Protected, SequenceHold}
  2. Global`b
  3. b[y_]:=a
  4. Hold[f[x][y]]
  5. a
复制代码



既然SetDelayed具有HoldAll属性,Hold确实可以控制住f[x][y],那么为什么f[x_][y_] := a的定义还是转给了b呢?
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 01:43 , Processed in 0.032391 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表