此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

2.6.4 高级专题:纯函数和规则中的变量

ModuleWith 可以给出作为局部处理的符号名序列. 但有时需要直接将某些变量 名进行局部处理. 例如,在使用 Function[{x}, x + a] 等纯函数时, x 是一个形式参数,这个名称是局部的. 在规则 f[x_] -> x^2 或 定义 f[x_] := x^2 中出现的 x 也是这样.
Mathematica 用统一的方法去保证在纯函数和规则中出现的形式参数是局部的, 且不与全局变量混淆. 其基本的思想是必要时用形如 的符号去代替 形式参数,作为一个约定, 从不用作全局变量名.

这里是一个纯函数的嵌套

Mathematica 重新命名函数内的形式参数 y 以免与全局变量冲突

这样得到的纯函数与所期望的一样

一般来说,在 Function[vars, body] 中的形式参数当另一个纯函数修改了  时就要重新命名.

由于纯函数内发生了变化,形式参数就被重新命名

当函数内部没有变化时,形式参数就不重新命名

Mathematica 在对纯函数中的形式参数重命名时比较自由. 原则上,函数中的形式参数 与代换到纯函数中表达式的项不冲突时可以不用重新命名. 但为了一致起见在这种情况下 Mathematica 还是对形式参数重新命名.

这时在函数内的形式参数 x 屏蔽了函数体,故不需要进行重命名

这里是三重函数嵌套

这种情况下两个内层函数都重新命名

正如前文所述, Mathematica 中纯函数类似于形式逻辑中的 Lambda 表达式, 对形式参数重新命名使 Mathematica 纯函数再次产生标准 Lambda 表达式的所有语法.

Mathematica 中的定界结构

Mathematica 中有一些定界结构, 其中某些名称作为局部量处理, 当这些结构混合时,Mathematica 进行适当的重命名以避免冲突.

Mathematica 重新命名纯函数中的形式参数以避免冲突

这里 With 内的局部参数被重新命名以避免冲突

这种情况下变量名之间没有冲突,故没有进行重新命名

在模块中局部变量 y 重新命名以避免冲突

执行模块时,局部变量又一 次重新进行命名,以使得名称唯一

Mathematica 将变换规则当定界结构处理,其中模式的名称是局部的. 可以用 等建立命名的模式.

h 中的 xx_ 相同,在规则 中作为局部量

f[x_] -> x + y 等规则右端出现的 x 与名为 x_ 的模式匹配.于是,x 被当作规则的局部量处理,不能用其它定界结构去修改. 另一方面,y 在规则中不是局部量,可以用其它定界结构去修改. 当这种情况发生时,Mathematica 重新对规则中的模式命名以防止冲突.

Mathematica 对规则中的 x 重新命名以防止冲突

在一个定界结构中使用 With 时,Mathematica 就自动 地进行适当的重新命名. 但有时需要在定界结构中进行代换以免重命名, 这可以用 /. 运算实现.

当用 With 代替 y 时,纯函数中 x 被重新命名以防止冲突

当使用 /. 而不是 With 时,没有进行这类重新命名

当使用规则 f[x_] -> rhs 或定义 f[x_] := rhs 时, Mathematica 必须间接地替换出现在 rhs 中的 x,它用 /. 运算有效地完成此项工作. 于是,这些替换不遵循定界结构. 然而,当定界结构的内部由替换 修改后时,在定界结构中的其它变量被重新命名.

这里定义了一个产生纯函数的函数

xx^2 通过使用 /. 运算被简洁地插入纯函数之中

这里定义产生一对嵌套函数的函数

此时,纯函数外的 x 被重新命名