模式和变换规则

模式

模式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/;condcond 等于 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] 作为函数 f 的任意变量出现时,它的默认值
Default[f,n] 作为第 n 个变量 (从尾端算起的第负 n 个数)时,它的默认值
Default[f,n,tot]当我们一共有 tot 个变量时,第 n 个变量的默认值

Default 值.

模式如 可以匹配具有 的不同可能值的表达式,比如 . 首先将尝试 的具有最小长度的选择. 一般说来,当单个函数中有多个 或者 时,首先尝试的情况是让所有 表示具有最小长度的序列,除了最后一个模式表示剩余的变量.

当出现 或者 时,首先尝试的是不与被忽略变量相对应的情况. 接下来尝试的是去掉后来的变量的情况.

可以使用 ShortestLongest 来改变不同情况中的顺序.

Orderless 是等价的
Flat 是等价的
OneIdentityx 是等价的

在模式匹配中使用的属性.

模式对象比如 可以表示具有属性 Flat 的函数 f 中的任意变量序列. 在这种情况下,x 的值是应用于变量序列的 f. 如果 f 具有属性 OneIdentity,当 x 对应于仅有一个变量的序列时,则使用 e 而不是 .

赋值

lhs=rhs立即赋值:赋值时计算 rhs
lhs:=rhs延时赋值:每次需要 lhs 值时,计算 rhs

Wolfram 语言中的两种基本赋值类型.

Wolfram 语言中的赋值指定表达式的变换规则. 用户进行的每次赋值必须与特定的 Wolfram 语言符号相关联.

f[args]=rhsf 相关联的赋值(下值 downvalue)
t/:f[args]=rhst 相关联的赋值(上值 upvalue)
f[g[args]]^=rhsg 相关联的赋值(上值 upvalue)

与不同符号相关联的赋值.

在赋值如 中,Wolfram 语言查看 f,然后是 f 的头部,然后是头部的头部,以此类推,直到它找到与赋值相关联的符号.

当采用赋值如 时,Wolfram 语言将建立与每个以 lhs 的参数,或者以 lhs 参数的头部出现的不同符号相关联的变换规则.

与特定符号 s 相关联的变换规则总是以特定的顺序存储,并且利用它们所采用的顺序进行测试. 每次进行赋值的时候,相应的变换规则就在与 s 相关联的变换规则列表末尾插入,除了以下情况:

  • 变换规则的左端与已经存储的变换规则相同,并且右端的任意 条件也相同. 在这种情况下,将把新的变换规则在旧的变换规则的位置上插入.
  • Wolfram 语言确定新的变换规则比已经存在的变换规则更为具体,并且如果它放置于该规则之后,将不会被使用. 在这种情况下,新规则放置于旧规则之前. 注意,在许多情况下,不可能判断一个规则是否比另一个规则更为具体;在这样的情况下,新规则总是在末尾插入.

值的类型

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,]清除所有值,并且删除 的名称

清除和删除对象的方法.

ClearClearAllRemove 中,每个自变量可以是一个符号,或者是作为字符串的符号名称. 字符串变量可以包括元字符 * 和 @,用来指定在名称与模式匹配的所有符号上的操作.

ClearClearAllRemove 对于含有属性 Protected 的符号不进行任何操作.

变换规则

lhs->rhs立即规则: 当给出规则时,计算 rhs
lhs:>rhs延时规则: 每次使用规则时,计算 rhs

Wolfram 语言中变换规则的两种基本类型.

在变换规则中出现的模式变量的替换可以使用 ReplaceAll 有效地实现( 操作符).