Lean 语言参考手册

20.11. 布尔值🔗

🔗归纳类型
Bool : Type
Bool : Type

布尔值 truefalse

从逻辑上说,它等价于 Prop(命题的类型)。这一区别对编程非常重要:命题及其证明都会被代码生成器擦除,而 Bool 对应大多数编程语言中的布尔类型,恰好携带一位运行时信息。

Bool.false : Bool

布尔值 false,不要与命题 False 混淆。

Bool.true : Bool

布尔值 true,不要与命题 True 混淆。

构造子 Bool.trueBool.false 是从 Bool 命名空间导出的,因此它们可以被写成 truefalse

20.11.1. 运行时表示🔗

因为 Bool 是一个 枚举归纳类型,所以它在编译后的代码中由单字节表示。

20.11.2. 布尔值和命题🔗

BoolProp 都表示真理的概念。 从纯逻辑的角度来看,它们是等价的:命题外延性意味着从根本上只有两个命题,即 TrueFalse。 然而,这里有一个重要的实用差异:Bool 划分程序可以计算的,而 Prop 划分生成代码没有意义的陈述。 换句话说,Bool 是适用于程序的真与假的概念,而 Prop 是适用于数学的概念。 由于证明会从编译后的程序中被擦除,因此区分 BoolProp 可以明确 Lean 文件中的哪些部分旨在用于计算。

Bool 可以用在任何预期 Prop 的地方。 从每个 Bool 类型的 b 到命题 b = true 都存在一个 强制转换。 根据 propexttrue = true 等于 True,而 false = true 等于 False

并非每个命题都可以被程序用来在运行时做出决定。 否则,程序就可以对角谷猜想是真还是假进行分支! 然而,许多命题可以通过算法来检查。 这些命题被称为 可判定 命题,并具有 Decidable 类型类的实例。 函数 Decidable.decide 将带有证明的 Decidable 结果转换为 Bool。 此函数也是从可判定命题到 Bool 的强制转换,因此 (2 = 2 : Bool) 的计算结果为 true

20.11.3. 语法🔗

语法布尔中缀运算符

中缀运算符 &&||^^ 分别是 Bool.andBool.orBool.xor 的记号。

term ::= ...
    | term && term
term ::= ...
    | term || term
term ::= ...
    | term ^^ term
语法布尔非

前缀运算符 !Bool.not 的记号。

term ::= ...
    | !term

20.11.4. API 参考🔗

20.11.4.1. 逻辑运算🔗

函数 condandor 是短路的。 换句话说,false && BIG_EXPENSIVE_COMPUTATION 不需要执行 BIG_EXPENSIVE_COMPUTATION 就可返回 false。 这些函数使用 macro_inline 属性定义,这会使得编译器在生成代码时将其调用替换为它们的定义,并且这些定义使用嵌套模式匹配来实现短路行为。

🔗定义
cond.{u} {α : Sort u} (c : Bool) (x y : α) : α
cond.{u} {α : Sort u} (c : Bool) (x y : α) : α

条件函数。

cond c x yif c then x else y 相同,但针对布尔条件而非可判定命题进行了优化。也可用记法 bif c then x else y 书写。

ite 一样,cond 被声明为 @[macro_inline],这会展开 cond 的应用。因此,运行时在选定 xy 之前不会求值它们,并且只会求值选中的分支。

🔗定义
Bool.dcond.{u} {α : Sort u} (c : Bool) (x : c = true α) (y : c = false α) : α
Bool.dcond.{u} {α : Sort u} (c : Bool) (x : c = true α) (y : c = false α) : α

依赖条件函数,其中每个分支都会获得一个关于条件值的局部假设。这样既可将该值用于证明,也可用于控制流。

dcond c (fun h => x) (fun h => y)if h : c then x else y 相同,但针对布尔条件而非可判定命题进行了优化。与非依赖版本 cond 不同,dcond 没有专用记法。

iteditecond 一样,dcond 被声明为 @[macro_inline],这会展开 dcond 的应用。因此,运行时在选定 xy 之一之前不会求值它们,并且只会求值选中的分支。dcond 旨在用于元编程,而非已验证程序,因此不提供行为引理。

🔗定义

布尔否定,也称布尔补。not x 可写作 !x

此函数将值 true 映射为 false,并将值 false 映射为 true。对应的命题联结词是 Not : Prop Prop

标识符中记法的约定:

  • 在标识符中,! 的推荐拼写是 not

🔗定义
Bool.and (x y : Bool) : Bool
Bool.and (x y : Bool) : Bool

布尔“与”,也称合取。and x y 可写作 x && y

对应的命题联结词是 And : Prop Prop Prop,用 运算符书写。

布尔 and@[macro_inline] 函数,从而实现短路求值:若 xfalse,则运行时不会求值 y

标识符中记法的约定:

  • 在标识符中,&& 的推荐拼写是 and

  • 在标识符中,|| 的推荐拼写是 or

🔗定义
Bool.or (x y : Bool) : Bool
Bool.or (x y : Bool) : Bool

布尔“或”,也称析取。or x y 可写作 x || y

对应的命题联结词是 Or : Prop Prop Prop,用 运算符书写。

布尔 or@[macro_inline] 函数,从而实现短路求值:若 xtrue,则运行时不会求值 y

🔗定义

布尔“异或”。xor x y 可写作 x ^^ y

x ^^ ytrue,恰当且仅当 xy 中恰有一个为 true。与 andor 不同,它不具有短路行为,因为任一参数的值都不能单独确定最终结果。此外,与 andor 不同,它没有常用的对应命题联结词。

示例:

标识符中记法的约定:

  • 在标识符中,^^ 的推荐拼写是 xor

20.11.4.2. 比较🔗

大多数关于布尔值的比较应该使用 DecidableEq BoolLT BoolLE Bool 实例来执行。

🔗定义

判定两个布尔值是否相等。

通常应通过它所支持的 DecidableEq Bool 实例调用此函数。

20.11.4.3. 转换🔗

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0

🔗定义

true 转换为 1,将 false 转换为 0