模式和变换规则

模式
模式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,]
模式序列
OrderlessPatternSequence[p1,p2,]
无序的模式序列
KeyValuePattern[{key1val1,}]
无序的 keyivali 数据对序列
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|
patterni 中的至少一个匹配的模式
pattern/;cond
cond 等于 True 的模式
HoldPattern[pattern]
未被计算的模式
Verbatim[expr]
逐字匹配的表达式
OptionsPattern[]
选项序列
Longest[pattern]
pattern 一致的最长序列
Shortest[pattern]
pattern 一致的最短序列
Pattern 对象.
当一些具有相同名称的模式对象在单个模式中出现时,所有的对象必须表示相同的表达式. 因此 f[x_,x_] 可以表示f[2,2] 但不可以表示 f[2,3].
在一个模式对象比如 _h 中,头部 h 可以是任意表达式,但本身不可以是模式.
一个模式对象比如 x__ 表示一个表达式序列. 所以,例如,f[x__] 可以表示 f[a,b,c],其中 xSequence[a,b,c]. 如果用户使用 x,比如在一个变换规则的结果中,那么该序列将与 x 所在的函数相拼接. 因此,g[u,x,u] 将变成 g[u,a,b,c,u].
当模式对象比如 x_:vx_. 作为函数变量出现时,它们表示可能忽略的变量. 当忽略与 x_:v 相对应的变量时,x 将采用值 v. 当忽略与 x_. 相对应的变量时,x 将采用与其所在的函数相关联的默认值. 用户可以通过对 Default[f] 等进行赋值指定这些默认值.
Default[f]
x_. 作为函数 f 的任意变量出现时,它的默认值
Default[f,n]
x_. 作为第 n 个变量 (从尾端算起的第负 n 个数)时,它的默认值
Default[f,n,tot]
当我们一共有 tot 个变量时,第 n 个变量的默认值
Default 值.
模式如 f[x__,y__,z__] 可以匹配具有 xyz 的不同可能值的表达式,比如 f[a,b,c,d,e]. 首先将尝试 xy 的具有最小长度的选择. 一般说来,当单个函数中有多个 __ 或者 ___ 时,首先尝试的情况是让所有 _____ 表示具有最小长度的序列,除了最后一个模式表示剩余的变量.
当出现 x_:v 或者 x_. 时,首先尝试的是不与被忽略变量相对应的情况. 接下来尝试的是去掉后来的变量的情况.
可以使用 ShortestLongest 来改变不同情况中的顺序.
Orderless
f[x,y]f[y,x] 是等价的
Flat
f[f[x],y]f[x,y] 是等价的
OneIdentity
f[x]x 是等价的
在模式匹配中使用的属性.
模式对象比如 x_ 可以表示具有属性 Flat 的函数 f 中的任意变量序列. 在这种情况下,x 的值是应用于变量序列的 f. 如果 f 具有属性 OneIdentity,当 x 对应于仅有一个变量的序列时,则使用 e 而不是 f[e].
赋值
lhs=rhs
立即赋值:赋值时计算 rhs
lhs:=rhs
延时赋值:每次需要 lhs 值时,计算 rhs
Wolfram 语言中的两种基本赋值类型.
Wolfram 语言中的赋值指定表达式的变换规则. 用户进行的每次赋值必须与特定的 Wolfram 语言符号相关联.
f[args]=rhs
f 相关联的赋值(下值 downvalue)
t/:f[args]=rhs
t 相关联的赋值(上值 upvalue)
f[g[args]]^=rhs
g 相关联的赋值(上值 upvalue)
与不同符号相关联的赋值.
在赋值如 f[args]=rhs 中,Wolfram 语言查看 f,然后是 f 的头部,然后是头部的头部,以此类推,直到它找到与赋值相关联的符号.
当采用赋值如 lhs^=rhs 时,Wolfram 语言将建立与每个以 lhs 的参数,或者以 lhs 参数的头部出现的不同符号相关联的变换规则.
与特定符号 s 相关联的变换规则总是以特定的顺序存储,并且利用它们所采用的顺序进行测试. 每次进行赋值的时候,相应的变换规则就在与 s 相关联的变换规则列表末尾插入,除了以下情况:
值的类型
Attributes[f]
f 的属性
DefaultValues[f]
f 的自变量的默认值
DownValues[f]
f[]f[][] 等等的值
FormatValues[f]
f 相关联的显示格式
Messages[f]
f 相关联的消息
NValues[f]
f 相关联的数值
Options[f]
f 相关联的选项的默认值
OwnValues[f]
f 本身的值
UpValues[f]
[,f[],] 的值
与符号相关联的值的类型.
清除和删除对象
expr=.
清除为 expr 所定义的值
f/:expr=.
清除为 expr 定义的与 f 相关联的值
Clear[s1,s2,]
清除符号 si 的所有值,除了属性、消息以及默认值
ClearAll[s1,s2,]
清除 si 的所有值,包括属性、消息以及默认值
Remove[s1,s2,]
清除所有值,并且删除 si 的名称
清除和删除对象的方法.
ClearClearAllRemove 中,每个自变量可以是一个符号,或者是作为字符串的符号名称. 字符串变量可以包括元字符 * 和 @,用来指定在名称与模式匹配的所有符号上的操作.
ClearClearAllRemove 对于含有属性 Protected 的符号不进行任何操作.
变换规则
lhs->rhs
立即规则: 当给出规则时,计算 rhs
lhs:>rhs
延时规则: 每次使用规则时,计算 rhs
Wolfram 语言中变换规则的两种基本类型.
在变换规则中出现的模式变量的替换可以使用 ReplaceAll 有效地实现( /. 操作符).