模式和变换规则
模式
模式(Patterns)表示表达式的不同类别. 它们包含模式对象,这些模式对象表示可能的表达式集合.
| _ | 任意表达式 |
| x_ | 名称为 x 的任意表达式 |
| x:pattern | 名称为 x 的模式 |
| pattern?test | 当使用 test 时,产生 True 的模式 |
| _h | 头部为 h 的任意表达式 |
| x_h | 头部为 h、名称为 x 的任意表达式 |
| __ | 一个或多个表达式序列 |
| ___ | 零个或多个表达式序列 |
| x__ 和 x___ | 名称为 x 的表达式序列 |
| __h 和 ___h | 由每个头部为 h 的表达式组成的序列 |
| x__h 和 x___h | 头部为 h、名称为 x 的表达式序列 |
| PatternSequence[p1,p2,...] | 模式序列 |
| x_:v | 默认值为 v 的表达式 |
| x_h:v | 头部为 h 并且默认值为 v 的表达式 |
| x_. | 具有全局定义的默认值的表达式 |
| Optional[x_h] | 具有头部 h 以及全局定义的默认值的表达式 |
| Except[c] | 除了与 c 匹配的任意表达式 |
| Except[c,pattern] | 与 pattern 匹配,但不与 c 匹配的任意表达式 |
| pattern.. | 重复一次或多次的模式 |
| pattern... | 重复零次或多次的模式 |
| Repeated[pattern, spec] | 根据 spec 重复的模式 |
| pattern1|pattern2|... | 与 |
| pattern/;cond | cond 等于 True 的模式 |
| HoldPattern[pattern] | 未被计算的模式 |
| Verbatim[expr] | 逐字匹配的表达式 |
| OptionsPattern[] | 选项序列 |
| Longest[pattern] | 与 pattern 一致的最长序列 |
| Shortest[pattern] | 与 pattern 一致的最短序列 |
Pattern 对象.
当一些具有相同名称的模式对象在单个模式中出现时,所有的对象必须表示相同的表达式. 因此
可以表示
但不可以表示
.
在一个模式对象比如
中,头部 h 可以是任意表达式,但本身不可以是模式.
一个模式对象比如
表示一个表达式序列. 所以,例如,
可以表示
,其中
为 Sequence[a, b, c]. 如果用户使用
,比如在一个变换规则的结果中,那么该序列将与
所在的函数相拼接. 因此,
将变成
.
当模式对象比如
和
作为函数变量出现时,它们表示可能忽略的变量. 当忽略与
相对应的变量时,x 将采用值 v. 当忽略与
相对应的变量时,x 将采用与其所在的函数相关联的默认值. 用户可以通过对 Default[f] 等进行赋值指定这些默认值.
| Default[f] | 当 |
| Default[f,n] | 当 |
| Default[f,n,tot] | 当我们一共有 tot 个变量时,第 n |
Default 值.
模式如
可以匹配具有
、
和
的不同可能值的表达式,比如
. 首先将尝试
和
的具有最小长度的选择. 一般说来,当单个函数中有多个
或者
时,首先尝试的情况是让所有
和
表示具有最小长度的序列,除了最后一个模式表示"剩余"的变量.
当出现
或者
时,首先尝试的是不与被忽略变量相对应的情况. 接下来尝试的是去掉后来的变量的情况.
可以使用 Shortest 和 Longest 来改变不同情况中的顺序.
| Orderless | |
| Flat | |
| OneIdentity |
模式对象比如
可以表示具有属性 Flat 的函数 f 中的任意变量序列. 在这种情况下,x 的值是应用于变量序列的 f. 如果 f 具有属性 OneIdentity,当 x 对应于仅有一个变量的序列时,则使用 e 而不是
.
赋值
Mathematica 中的赋值指定表达式的变换规则. 用户进行的每次赋值必须与特定的 Mathematica 符号相关联.
| f[args]=rhs | 与 f 相关联的赋值(下值 downvalue) |
| t/:f[args]=rhs | 与 t 相关联的赋值(上值 upvalue) |
| f[g[args]]^=rhs | 与 g 相关联的赋值(上值 upvalue) |
在赋值如
中,Mathematica 查看 f,然后是 f 的头部,然后是头部的头部,以此类推,直到它找到与赋值相关联的符号.
当采用赋值如
时,Mathematica 将建立与每个以 lhs 的参数,或者以 lhs 参数的头部出现的不同符号相关联的变换规则.
与特定符号 s 相关联的变换规则总是以特定的顺序存储,并且利用它们所采用的顺序进行测试. 每次进行赋值的时候,相应的变换规则就在与 s 相关联的变换规则列表末尾插入,除了以下情况:
值的类型
| Attributes[f] | f 的属性 |
| DefaultValues[f] | f 的自变量的默认值 |
| DownValues[f] | |
| FormatValues[f] | 与 f 相关联的显示格式 |
| Messages[f] | 与 f 相关联的消息 |
| NValues[f] | 与 f 相关联的数值 |
| Options[f] | 与 f 相关联的选项的默认值 |
| OwnValues[f] | f 本身的值 |
| UpValues[f] |
清除和删除对象
| expr=. | 清除为 expr 所定义的值 |
| f/:expr=. | 清除为 expr 定义的与 f 相关联的值 |
| Clear[s1,s2,...] | 清除符号 |
| ClearAll[s1,s2,...] | 清除 |
| Remove[s1,s2,...] | 清除所有值,并且删除 |
在 Clear、ClearAll 和 Remove 中,每个自变量可以是一个符号,或者是作为字符串的符号名称. 字符串变量可以包括元字符 * 和 @,用来指定在名称与模式匹配的所有符号上的操作.
Clear、ClearAll 和 Remove 对于含有属性 Protected 的符号不进行任何操作.
变换规则
在变换规则中出现的模式变量的替换可以使用 ReplaceAll 有效地实现(
操作符).
