10.5.4. 可判定性🔗
如果一个命题可以通过算法检查,那么它就是可判定的。
排中律意味着每个命题非真即假,但它没有提供检查究竟是哪种情形成立的方法;而这种检查往往很有用。
默认情况下,作用域中只有可生成代码的算法式 Decidable 实例;打开 Classical 命名空间则会使每个命题都可判定。
🔗定义
可判定谓词。
如果对每个可能的参数,相应命题都是 Decidable,那么该谓词就是可判定的。
🔗定义
可判定关系。
如果对所有可能的参数,相应命题都是 Decidable,那么该关系就是可判定的。
🔗定义
当命题 p 可判定,并且无论 p 为真还是为假都足以构造 q 时,构造一个 q。
这是依赖式 if-then-else 运算符 dite 的同义形式。
排中律与 Decidable
从 Nat 到 Nat 的函数之间的相等性不可判定:
example (f g : Nat → Nat) : Decidable (f = g) := failed to synthesize instance of type class
Decidable (f = g)
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.inferInstance
failed to synthesize instance of type class
Decidable (f = g)
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
打开 Classical 会使每个命题都可判定;不过,使用这一事实的声明和示例必须标记为 Lean.Parser.Command.declaration : commandnoncomputable,以表明不应为它们生成代码。
open Classical
noncomputable example (f g : Nat → Nat) : Decidable (f = g) :=
inferInstance
10.5.7. 算术与位运算符🔗
🔗类型类
异质加法记法的类型类。
它启用记法 a + b : γ,其中 a : α、b : β。
方法
hAdd : α → β → γ
a + b 计算 a 与 b 的和。该记法的含义取决于类型。
🔗类型类
HAdd 的同质版本:a + b : α,其中 a b : α。
方法
add : α → α → α
a + b 计算 a 与 b 的和。参见 HAdd。
🔗类型类
异质减法记法的类型类。
它启用记法 a - b : γ,其中 a : α、b : β。
方法
hSub : α → β → γ
a - b 计算 a 与 b 的差。该记法的含义取决于类型。
🔗类型类
HSub 的同质版本:a - b : α,其中 a b : α。
方法
sub : α → α → α
a - b 计算 a 与 b 的差。参见 HSub。
🔗类型类
异质乘法记法的类型类。
它启用记法 a * b : γ,其中 a : α、b : β。
方法
hMul : α → β → γ
a * b 计算 a 与 b 的积。该记法的含义取决于类型。
🔗类型类
标量乘法运算的类型类,记作 •(输入 \bu)。
方法
smul : M → α → α
m • a : α 表示 m : M 与 a : α 的积。该记法的含义取决于类型,但预期用于左作用。
🔗类型类
HMul 的同质版本:a * b : α,其中 a b : α。
方法
mul : α → α → α
a * b 计算 a 与 b 的积。参见 HMul。
🔗类型类
异质除法记法的类型类。
它启用记法 a / b : γ,其中 a : α、b : β。
方法
hDiv : α → β → γ
a / b 计算 a 除以 b 的结果。该记法的含义取决于类型。
-
对 Nat、Int、Rat、Real 等大多数类型,a / 0 定义为 0。
-
对 Nat,a / b 向下取整。
-
对 Int,当 b 为正时 a / b 向下取整,当 b 为负时向上取整。其实现为
Int.ediv,这是满足 a % b + b * (a / b) = a 且在 b ≠ 0 时满足
0 ≤ a % b < natAbs b 的唯一函数。函数 Int.fdiv(向下取整)和 Int.tdiv
(向零截断)提供其他取整约定。
-
对 Float,a / 0 遵循 IEEE 754 除法语义,通常得到 inf 或 nan。
🔗类型类
HDiv 的同质版本:a / b : α,其中 a b : α。
方法
div : α → α → α
a / b 计算 a 除以 b 的结果。参见 HDiv。
🔗类型类
∣ 运算(输入 \|)的记法类型类;该运算表示整除。
方法
dvd : α → α → Prop
整除。a ∣ b(输入 \|)表示存在某个 c,使得 b = a * c。
🔗类型类
异质模/余数记法的类型类。
它启用记法 a % b : γ,其中 a : α、b : β。
方法
hMod : α → β → γ
a % b 计算 a 除以 b 的余数。该记法的含义取决于类型。
🔗类型类
HMod 的同质版本:a % b : α,其中 a b : α。
方法
mod : α → α → α
a % b 计算 a 除以 b 的余数。参见 HMod。
🔗类型类
异质幂运算记法的类型类。
它启用记法 a ^ b : γ,其中 a : α、b : β。
方法
hPow : α → β → γ
a ^ b 计算 a 的 b 次幂。该记法的含义取决于类型。
🔗类型类Pow.{u, v} (α : Type u) (β : Type v) : Type (max u v) Pow.{u, v} (α : Type u) (β : Type v) :
Type (max u v)
HPow 的同质版本:a ^ b : α,其中 a : α、b : β。(右参数与左参数类型不必相同,
因为即使在同质情形中也常有这种需求。)
类型可以通过提供 NatPow 或 HomogeneousPow 的实例来选择特定的默认行为:
方法
pow : α → β → α
a ^ b 计算 a 的 b 次幂。参见 HPow。
🔗类型类
指数为 Nat 的 Pow 同质版本。此类的用途是提供默认 Pow 实例,使精译过程中可以将
指数特化为 Nat。
例如,如果 x ^ 2 应优先精译为 2 : Nat,那么 x 的类型应提供此类的实例。
方法
pow : α → Nat → α
a ^ n 计算 a 的 n 次幂,其中 n : Nat。参见 Pow。
🔗类型类
指数与底数类型相同的完全同质 Pow 版本。此类的用途是提供默认 Pow 实例,使精译过程中
可以将指数特化为与底数相同的类型。也就是说,当 x ^ y 应精译为 x 和 y 具有相同
类型时,该类型应提供此类的实例。
例如,Float 类型提供此类的实例,因此 (2.2 ^ 2.2 : Float) 这样的表达式可以精译。
方法
pow : α → α → α
a ^ b 计算 a 的 b 次幂,其中 a 和 b 具有相同类型。
🔗类型类
a <<< b : γ 记法背后的类型类,其中 a : α、b : β。
方法
hShiftLeft : α → β → γ
a <<< b 计算将 a 左移 b 位的结果。该记法的含义取决于类型。
🔗类型类
a >>> b : γ 记法背后的类型类,其中 a : α、b : β。
方法
hShiftRight : α → β → γ
a >>> b 计算将 a 右移 b 位的结果。该记法的含义取决于类型。
🔗类型类
取负记法的类型类。
它启用记法 -a : α,其中 a : α。
方法
neg : α → α
-a 计算 a 的负值或相反值。该记法的含义取决于类型。
🔗类型类
a &&& b : γ 记法背后的类型类,其中 a : α、b : β。
方法
hAnd : α → β → γ
a &&& b 计算 a 与 b 的逐位与。该记法的含义取决于类型。
🔗类型类
HAnd 的同质版本:a &&& b : α,其中 a b : α。
(之所以称为 AndOp,是因为 And 已用于命题合取。)
🔗类型类
a ||| b : γ 记法背后的类型类,其中 a : α、b : β。
方法
hOr : α → β → γ
a ||| b 计算 a 与 b 的逐位或。该记法的含义取决于类型。
🔗类型类
HOr 的同质版本:a ||| b : α,其中 a b : α。
(之所以称为 OrOp,是因为 Or 已用于命题析取。)
🔗类型类
a ^^^ b : γ 记法背后的类型类,其中 a : α、b : β。
方法
hXor : α → β → γ
a ^^^ b 计算 a 与 b 的逐位异或。该记法的含义取决于类型。
🔗类型类
HXor 的同质版本:a ^^^ b : α,其中 a b : α。