从逻辑上说,它等价于 Prop(命题的类型)。这一区别对编程非常重要:命题及其证明都会被代码生成器擦除,而 Bool 对应大多数编程语言中的布尔类型,恰好携带一位运行时信息。
20.11. 布尔值
构造子 Bool.true 和 Bool.false 是从 Bool 命名空间导出的,因此它们可以被写成 true 和 false。
20.11.1. 运行时表示
20.11.2. 布尔值和命题
Bool 和 Prop 都表示真理的概念。
从纯逻辑的角度来看,它们是等价的:命题外延性意味着从根本上只有两个命题,即 True 和 False。
然而,这里有一个重要的实用差异:Bool 划分程序可以计算的值,而 Prop 划分生成代码没有意义的陈述。
换句话说,Bool 是适用于程序的真与假的概念,而 Prop 是适用于数学的概念。
由于证明会从编译后的程序中被擦除,因此区分 Bool 和 Prop 可以明确 Lean 文件中的哪些部分旨在用于计算。
Bool 可以用在任何预期 Prop 的地方。
从每个 Bool 类型的 b 到命题 b = true 都存在一个 强制转换。
根据 propext,true = true 等于 True,而 false = true 等于 False。
并非每个命题都可以被程序用来在运行时做出决定。
否则,程序就可以对角谷猜想是真还是假进行分支!
然而,许多命题可以通过算法来检查。
这些命题被称为 可判定 命题,并具有 Decidable 类型类的实例。
函数 Decidable.decide 将带有证明的 Decidable 结果转换为 Bool。
此函数也是从可判定命题到 Bool 的强制转换,因此 (2 = 2 : Bool) 的计算结果为 true。
20.11.3. 语法
20.11.4. API 参考
20.11.4.1. 逻辑运算
函数 cond、and 和 or 是短路的。
换句话说,false && BIG_EXPENSIVE_COMPUTATION 不需要执行 BIG_EXPENSIVE_COMPUTATION 就可返回 false。
这些函数使用 macro_inline 属性定义,这会使得编译器在生成代码时将其调用替换为它们的定义,并且这些定义使用嵌套模式匹配来实现短路行为。